Синхронизация таблиц mysql между серверами
Нужно её выкладывать на сервер.
Сейчас у меня есть скрипт который просто выкатывает дамп по ssh в кроне, каждый час.
Но база неумолимо растет - статистические данные. В день около 0.5-1Mb.
Кажется не логичным гонять записи, которые уже есть на сервере.
Как можно правильнее решить проблему, что бы выгружать только измененные строки по таблицам?
1 ответов
> В день около 0.5-1Mb
Не так уж и много, это не 0.5-1Gb. Другой вопрос это общий объем базы
Репликацию тут настраивать опасно, ибо никто не гарантирует доступность
Можно подправить скрипт таким костылём:
1. дампить только INSERT строки во временный файл
2. затем сравнивать временный файл с файлом содержащим INSERT'ы от предыдущего дампа > получаем файл который нужно отправить на боевой сервер
3. совместить файл предыдущего дампа с временным (для последующего сравнения в следующей итерации)
Плюсы - на боевой сервер уйдут инсёрты только для новых строк.
Минусы - если в локальной базе будут изменения структуры, то в дампе это не уйдет и возможно будет ошибка. Лекарство - предварительный отдельный дамп структуры со всякими CREATE TABLE IF NOT EXISTS / ALTER и прочее прочее
Пробую на коленке:
# дамп INSERT команд
mysqldump -uUSER -pPASSWORD --skip-extended-insert DBNAME | egrep "^INSERT" > tmp.sql
# сравнение файлов с предварительной сортировкой источников
comm -23 <(sort tmp.sql) <(sort old.sql) > send.sql
# совмещение старого дампа с новыми данными
cat send.sql >> old.sql
Итого: send.sql - файл для отправки на боевой сервер и импорта там
Отсутствие ошибок и консистентность данных не гарантирую : )
в любой более менее развитой системе управления базами данных есть сонхронизация между базами.. я например использую SQLyog, там есть синхронизация, можно по шедулеру запустить. Синхронирует как скажешь - в одну сторону, или в обе...
Если хотите раз и навсегда решить этот вопрос, используйте maatkit - это комплект утилит. В ней имеется mk-table-sync
Она умеет довольно шустро это делать. Синхронизацию проверял между двумя базами, БД весит 4гб. На такую бд тратилось около 2 часов, на достаточно слабом железе)