Случилось как то у меня сломалась репликация MASTER-MASTER на MySQL - огромное количество duplicate entry. В репликации у меня один сервер основной, второй- бекапный.
Делаем так:
на основном сервере смотрим:
Выделенное жирным шрифтом запоминаем.
Делаем бекап на основном сервере:
Копируем файл на бекапный сервер.
Останавливаем репликацию на бекапном сервере:
Останавливаем master на бекапном сервере(мы же не ходим что бы DROP DATABASE среплицировалась на основной сервер ;) ) - для этого комментим все записи, связанные с binlog в my.cnf
Делаем так:
на основном сервере смотрим:
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000184 Position: 154007002 Binlog_Do_DB: databasename
Binlog_Ignore_DB: mysql,information_schema
1 row in set (0.00 sec)
ERROR:
No query specified
Выделенное жирным шрифтом запоминаем.
Делаем бекап на основном сервере:
bash > mysqldump -uroot -p databasename > databasename.sql
Копируем файл на бекапный сервер.
Останавливаем репликацию на бекапном сервере:
Останавливаем master на бекапном сервере(мы же не ходим что бы DROP DATABASE среплицировалась на основной сервер ;) ) - для этого комментим все записи, связанные с binlog в my.cnf
#log-bin=/var/lib/mysql/mysql-bin
#expire_logs_days=3
#binlog-do-db=databasename
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
Рестартим mysql.
Останавливаем slave:
mysql> stop slave;
Дропаем базу:
mysql > DROP DATABASE `databasename`;
Заливаем дамп снятый с основного сервера:
bash > mysql -u root -p databasename < databasename.sql
Изменяем место, с которого читать лог(данные берем те, которые сохранили при show master status):
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000184';
mysql> CHANGE MASTER TO MASTER_LOG_POS = 154007002;
запускаем slave:
mysql> start slave;
Смотрим как докатывается база :)
Запускаем мастер на бекапном сервере. Для этого обратно раскомментируем записи в my.cnf и рестартим mysql.
Проверяем slave на основном сервере:
mysql> show slave status\G;Если пишет ошибку про чтение из закрытого файла, то останавливаем slave:
mysql> stop slave\G;Изменяем место, с которого читать лог(при рестарте бекапного сервера открывается новый бинлог):
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000084';
mysql> CHANGE MASTER TO MASTER_LOG_POS = 0;
Запускаем slave:
mysql> start slave\G;