Могу ли я зеркально отразить изменения в базе данных с помощью кода homebrew? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть несколько баз данных и таблиц mysql, которые необходимо прослушивать.Мне нужно знать, какие данные изменяются, и отправлять изменения на удаленные серверы, которые имеют локальные зеркала базы данных.

Как я могу отразить изменения в базах данных mysql?Я думал о настройке триггеров MySQL, которые записывают все изменения в другую таблицу.Эта таблица содержит имя базы данных, имя таблицы и все столбцы.Затем я написал бы собственный код для передачи изменений и периодически устанавливал их на удаленных зеркалах.Будет ли это выполнить мою потребность?

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Вы можете указать MySQL создать инкрементную резервную копию с определенного момента времени.Данные содержат только изменения в базе данных с того времени.

Вы должны включить двоичное ведение журнала, а затем вы можете использовать команду mysqlbinlog, чтобы экспортировать изменения с заданной отметки времени.См. Раздел Восстановление на момент времени (инкрементное) руководства, а также документацию для mysqlbinlog .В частности, вам понадобится параметр - start-datetime .

Получив экспортированный журнал в текстовом формате, вы можете выполнить его в другом экземпляре базы данных.

1 голос
/ 14 февраля 2012

Ваш план на 100% правильный.

Эта дополнительная таблица называется таблицей «аудита» или «истории» (есть тонкие различия, но вам не нужно сильно беспокоиться - теперь у вас есть «официальные» термины, которые вы можете использовать для дальнейших исследований).

Если в главной таблице есть столбцы A, B, C, то аудит будет иметь еще 3: A, B, C, Operation, Changed_By, Change_DateTime (имена зависят от ваших вкусов и стандартов кодирования).

В столбце «Операция» хранится информация о том, было ли изменение вставкой, удалением, старым значением обновления или новым значением обновления (часто оно имеет ширину 3 символа и операции называются «INS» / «DEL» / «U_D» и «U_I»). ", но есть и другие подходы).

Данные в таблице аудита заполняются с помощью триггера на главной таблице.

Затем убедитесь, что в столбце Change_DateTime есть индекс.

И чтобы найти список изменений, вы отслеживаете время последнего опроса, а затем просто делаете

SELECT * FROM Table_Audit WHERE Change_DateTime > 'LAST_POLL_TIME'
0 голосов
/ 15 февраля 2012

Как только вы выходите из механизмов СУБД для выполнения неотъемлемо ориентированной на БД задачи, такой как зеркалирование, вы нарушаете большинство свойств БД, которые отличают ее от обычного файла.

InВ частности, предлагаемый вами механизм нарушает атомарность, согласованность, изоляцию и долговечность , которые обеспечивает MySQL.Например, неполное воспроизведение журнала на зеркалах оставит ваши зеркала в состоянии, несовместимом с родительской БД.То, что вы предлагаете, может только приблизиться к зеркалированию, поэтому вы должны предпочесть встроенные механизмы СУБД, если вам все равно, точно ли зеркала отражают состояние родителя.

...