Я хотел бы создать дельту резервного копирования. Каждая таблица значительных размеров, или просто через борт всех из них, будет содержать подобный колонок под названием
dtUpdated datetime not null
Не позволяйте имя предложить только для обновления. Скорее, is устанавливается в now()
на любую вставку или обновление.
auto_increment
id в важнейших таблицах, безусловно, облегчает резервное копирование дельта. Я не уверен, что хотел бы попробовать его без такого (хотя это не обязательно). Для ниже я предполагаю, что идентификатор auto_increment
на месте.
Чтобы запустить его и начать работу, сначала откройте свою систему для любой новой записи.
Используйте alter table
, чтобы добавить отсутствующие колонки, такие как описанные выше.
Установить все строки с этой колонкой dtUpdated
к чему-то вроде
'2015-12-06 00:00:00'
, который будет включать в себя компонент времени. Обратите внимание, что now()
не будет быть хорошим выбором для грунтовочной части.
Был бы другой стол, который мог бы быть как 1 строка, 1 столбец, с datetime
, обозначая datetime
последней резервной копии. Назовем эту таблицу LastBackup
. Это не будет изменить до следующей резервной копии.
Установите это первоначально, как указано выше.
ли ваш код модифицирована таким образом, чем любая вставка или обновление будет постоянно обновлять записи в dtUpdated
с now()
Delta резервное копирование будет меньше, значительно, так, вероятно, подбирая только те строки из таблиц, где dtUpdated является после значения в таблице LastBackup
.
Уловкой было бы захват удалений. По мере удаления данных этот факт записывается в таблицы. Например, каждая отслеживаемая таблица, такая как транзакции, может иметь соответствующую таблицу DeletedTransactions. И им нужны только два столбца (id, datetime). Таблицы удаления, чтобы дать им имя, переносятся и воспроизводятся.
Данные экспортируются и импортируются путем выбора в Outfile и Load Data Infile, соответственно. Это значения, разделенные запятыми (CSV), и не формата mysqldump
. Причина в том, что производительность, и примерный пример можно увидеть Here, хотя и в крайнем случае.
Как вы справляетесь с обслуживанием файлов, в том числе именованием, будет диктовать, как легко восстановить вашу систему в любой точке сохранения на временной шкале.
Ресурсы:
Быстрый визуальный, чтобы ты
create table LastBackup
( theWhen datetime not null
);
create table Transactions
( id int auto_increment primary key,
custId int not null,
transTyp int not null,
amount decimal(12,2) not null,
dtUpdated datetime not null,
key (dtUpdated)
);
create table DeletedTransactions
( -- a delete trigger on Transactions table does an insert here for the id
id int not null, -- the Transactions.id value
dtWhen datetime not null -- when it happened
);
truncate table Transactions;
insert Transactions (custId,transTyp,amount,dtUpdated) values
(123,1,100,'2014-07-11 14:10:00'),
(111,2,2100,'2014-07-11 14:10:01');
-- imagine if you had 10 million of those rows
-- time for the first backup, getting everything
truncate table LastBackup;
insert into LastBackup (theWhen) values ('2015-12-06');
select id,custId,transTyp,amount,dtUpdated
into outfile 'c:\\dev\\transactions_20151206.txt' -- or /path/to/file/xxx.txt for linux
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n' -- or '\n' for linux
FROM transactions
where dtUpdated<'2015-12-06'; -- this will be a range on subsequent delta backups
Здесь заключается в том, что только что экспортированный текстовый файл:
1,123,1,100.00,"2014-07-11 14:10:00"
2,111,2,2100.00,"2014-07-11 14:10:01"
Это кажется мне слишком сложным для понимания. Я не знаю, с чего начать. – frosty
начните с 2 столов! Шаги малыша. Читайте на LOAD DATA INFILE и помните, что txt-файл записывается с помощью Select Into Outfile: P – Drew
Хорошо. Я попробую. – frosty