@x3nage

Как перекачать данные с мастер сервера на слейв?

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

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 строк, которые были там до подключения репликации, нужно перенести эти строки на слейв сервер.

Спасибо!
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 2
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
Репликация всегда настраивалась так:
блокируем все базы на сервере, делаем дамп, выполняем show master status чтобы знать позицию в журнале, снимаем блокировку с мастера.
теперь берем слейв, восстанавливаем его с дампа и через change master to подключаемся к мастеру.

Вам все равно придется один раз остановить мастер сервер, чтобы сделать его полный дамп.
Ответ написан
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Уже отвечал сегодня - Percona XtraBackup
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы