Мне нужно улучшить резервное копирование баз данных, которые не загружают производственный сервер. Я прочитал, что хорошее решение для этого - установить репликацию базы данных и выполнить mysqldumps на подчиненном сервере.
Но в описании replicate_do_db сказано, что обновления не будут работать с запросами между базами данных. И вот проблема: у меня много PHP-приложений (некоторые из них действительно старые), поэтому у меня нет гарантии, что они не используют такого рода запросы. И я не хочу, чтобы базы данных были рассинхронизированы ...
Есть ли альтернатива? Или просто использовать репликацию только для известных приложений, а mydumper / mysqldump для других?
Я знаю, что Percona XtraBackup существует, но я хочу иметь резервные копии в формате .sql.
replicate_do_db
сообщает системе, для каких баз данных следует реплицировать SQL-запросы (я предполагаю репликацию SQL, а не репликацию строк).
Это работает так, если предположить replicate_do_db = DB_1
mysql> use DB_1;
mysql> insert into Table_1 values (1,2,3);
Теперь этот оператор вставки будет реплицирован на подчиненные хосты.
mysql> use DB_2;
mysql> insert into DB_1.Table_1 values (2,3,4);
Этот оператор вставки будет не быть реплицированным, поскольку вы работаете в DB_2, который не реплицируется, даже если вы случайно указали DB_1 в запросе.
mysql> user DB_1;
mysql> insert into DB_2.Table_2 values (9,8,7);
Этот оператор вставки воля будут реплицированы, поэтому, если на подчиненных хостах нет DB_2.Table_2, репликация прервется.
В этом суть проблемы запросов между базами данных. Обратите внимание, что операторы select в разных базах данных не представляют проблемы, поскольку реплицируются только операторы изменения данных, а не операторы запроса данных.
Предположительно, если на главном сервере есть несколько баз данных, которые используются и обновляются в приложении, вы захотите, чтобы все эти обновления реплицировались на подчиненные хосты, поэтому вам нужно указать все эти базы данных с помощью replicate_do_db
; Я не думаю, что это будет проблемой в вашей ситуации, как вы ее описали.
Просто убедитесь, что у вас есть какой-то мониторинг статуса репликации, чтобы в случае сбоя репликации вы знали о проблеме как можно скорее и могли исправить ее до того, как реплицируемые данные станут слишком старыми. Подсказка: show slave status;
на подчиненных хостах и убедитесь, что "Slave_IO_Running" и "Slave_SQL_Running" оба имеют значение "Yes".
Я также использую mk-table-checksum
каждую ночь сравнивать ведущее и ведомое устройства, чтобы убедиться, что таблицы базы данных идентичны.