Задача состоит в том, чтобы с основного сервера (с большой базой данных на борту, которая подключена к рабочему приложению и его нельзя останавливать) перенести базу на второй сервер.
mysqldump работает слишком долго, в это время приложение не работает.
rsync переносит сырые файлы (из каталога
/var/lib/mysql* на основной сервер) без проблем, но на втором сервере вообще перестаёт запускаться MySQL. Я так понимаю, чтобы такой метод сработал, в любом случае придётся отключать приложение на время переноса через rsync, но это тоже слишком долго.
Решил сделать это через репликацию.
Есть 2 MySQL сервера (на двух разных физических серверах), между ними настроена репликация Master > Slave. Конфигурация Master:
[mysqld]
server-id = 1
max_binlog_size= 500M
replicate-do-db = test_repl
log_bin = /var/lib/mysql/mysql-bin
log_slave_updates
expire_logs_days = 14
log_bin_trust_function_creators= 1
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency
Конфигурация Slave:
[mysqld]
max_binlog_size= 100M
replicate-do-db = test_repl
server_id = 2
log_bin = /var/lib/mysql/mysql-bin
log_slave_updates
expire_logs_days = 14
#sync_binlog = 1
log_bin_trust_function_creators= 1
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency
Слейв подключён к мастеру командой:
change master to master_host='', master_auto_position=1, Master_User='', master_password='';
Для теста будет база данных test_repl с таблицей users
На мастер сервере в таблице уже есть n строк, на слейве таблица пустая. Если сейчас добавить новую строку в таблицу на мастер сервере, на слейв сервере так же добавится новая строка, то есть репликация работает. Однако, при удалении строк из мастер сервера, на слейв сервере возникает ошибка:
Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 2 failed executing transaction 'd677b493-904b-11ea-bfdf-123:708' at master log mysql-bin.000002, end_log_pos 123. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
Приходится ресетить мастер и слейв (reset master reset slave) на обоих серверах, чтобы исправить проблему. Я подозреваю, что проблема возникает из-за того, что основная база данных не синхронизирована с слейв сервером.
Основная проблема в том, что на мастер сервере уже есть n строк, которые были там до подключения репликации, нужно перенести эти строки на слейв сервер.
Спасибо!