2016-06-14 2 views
1

У меня есть две разные базы данных mysql (OLD и NEW), работающие на разных серверах. OLD Database имеет около 10 таблиц, из которых я хочу синхронизировать 3 таблицы базы данных NEW. Поэтому, если в этих трех таблицах происходит добавление/удаление/обновление, эти записи должны обновляться в базе данных NEW. Я создал базу данных NEW, используя дамп mysql. Но я хочу добавить работу cron, которая может запускаться каждые 1 час, чтобы синхронизировать 3 таблицы.Как синхронизировать данные между двумя таблицами в разных базах данных (MYSQL), работающими на разных серверах

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

Любые предложения или ссылки будут оценены.

+0

у вас абсолютно * есть * для репликации данных? Репликация данных может иметь много плохих вещей. –

+0

@Marshall Tigerus - у каких плохих вещей есть репликация. его стандарт в MySQL и работает очень хорошо. –

+0

есть. мы хотим в конечном итоге перейти к новым базам данных. у нас есть разные приложения для чтения и записи в OLD-базу данных. Но в промежутке времени мы хотели бы настроить новую базу данных и попросить приложения перемещаться один за другим. – sumajumd

ответ

0

Если вы не хотите использовать репликацию MySQL, вы также можете использовать инструменты Percona pt-table-sync. Этот инструмент может узнать, какая строка должна быть скопирована, а какие - удалить или обновить. Но обе схемы должны быть идентичны

here is the Manual

+0

Я искал решение, которое я мог бы кодировать самостоятельно, а не в зависимости от стороннего инструмента, который может испортить БД, если он не используется должным образом. Мне не нужна конфигурация master-slave. Я хотел бы периодически получать данные из OLD из таблиц, которые я выбираю, и копировать их в NEW в скрипте, который выполняется в cron – sumajumd

+0

@sumajumd - это действительно тяжелая работа, чтобы сделать это по сценарию. вы можете сделать mysqldump ... oldDB | mysql -hxxxx newDB, но он не удаляет таблицу на новом db –

2

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

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

Требования

для этой работы базы данных должны быть в том же сервере. Если нет, вам нужно настроить механизм хранения в формате federate для доступа к удаленным данным. Как заявил другой человек, репликация MySQL по-прежнему может быть полезной, по крайней мере, при получении данных на один и тот же сервер, что делает синхронизацию быстрее без необходимости установки интегрированного хранилища. Ссылка: https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html

синхронизации Timing

можно синхронизировать по event графику

MySQL позволит вам создавать события на определенном графике, чтобы выполнить свою работу (если вы не иметь любые внешние средства планирования заданий).

Надеюсь, у вас есть дата изменения какой-то, вы можете запросить один раз в день или более жесткие интервалы на всех полях, где modified_at> = DATE_SUB (NOW(), ИНТЕРВАЛ? ЧАС)

Если вы в состоянии добавьте столбец, вы можете создать один под названием synced_at, который будет немного более устойчивым к разным частотам сервера. Тогда вы можете просто запросить где synced_at IS NULL или synced_at < = modified_at

В качестве альтернативы, использование триггеров

MySQL поддерживает ДО и ПОСЛЕ триггеров INSERT/UPDATE/DELETE и т.д ... Вы можете использовать эти для запуска вашей логики.Имейте в виду, что для каждой транзакции вы получите небольшое снижение производительности, и это может легко перегрузить очень активные серверы производства.

Разница между BEFORE и AFTER невелика, за исключением того, что если вы используете триггеры типа BEFORE, вы можете выбросить sqlstate, чтобы предотвратить вставку в исходную таблицу, если важно, чтобы обе таблицы были сильно синхронизированы.

Синхронизация Логические

Инструкция INSERT/UPDATE/DELETE шаблон

Это псевдо-код, но ...

# new and updated records 
INSERT ... ON DUPLICATE KEY UPDATE ... 
SELECT FROM source_table 
JOIN target_table.id 
WHERE target_table.id IS NULL or modified_at > DATE_SUB(NOW(), INTERVAL ..) 

# deleted records 

TRIGGER ПОСЛЕ INSERT/UPDATE/DELETE

Как и выше, вы просто управляете одной записью за раз, и вы зеркалируете оператор триггера. Например: INSERT TRIGGER в исходной таблице должен просто запрашивать INSERT в целевой таблице.

Ядерное DROP/CREATE/INSERT

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

Смежные вопросы