Вчера вечером один из разработчиков запустил неверный оператор mySQL (запрос, вставляющий строку с повторяющимся первичным ключом) на главной машине. Внезапно репликация на подчиненное устройство остановилась. Slave начал записывать это в mysql_relay_logs, и прежде чем мы смогли его отслеживать и исправлять, на диске закончилось место.
Мастер настроен на сохранение bin_logs за последние 3 дня, поэтому мы еще не полностью потеряли репликацию. Может ли кто-нибудь помочь мне сейчас исправить этот беспорядок.
Мой Мастер Статус:
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000017
Position: 30844254
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
Статус ведомого: mysql
> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.140.110
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 61132382
Relay_Log_File: mysqld-relay-bin.000037
Relay_Log_Pos: 1405976
Relay_Master_Log_File: mysql-bin.000014
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '13676-1-2' for key 1' on query. Default database: 'XXX'. Query: 'YYY'
Skip_Counter: 0
Exec_Master_Log_Pos: 1405839
Relay_Log_Space: 8974037551
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
Может ли кто-нибудь дать мне точные команды, чтобы вернуть все в норму? как я уже сказал, я уверен, что мы потеряли данные на ведомом устройстве, поскольку у него закончился диск, но у нас должны быть данные на ведущем устройстве.
Мой следующий вопрос: как сделать так, чтобы этого больше не повторилось.
Спасибо большое Спарш Гупта
просто остановите подчиненное устройство и пропустите оператор sql, который делает повторяющуюся запись, используя (http://dev.mysql.com/doc/refman/5.0/en/set-global-sql-slave-skip-counter.html)
mysql> stop slave;
mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> start slave;
если после выполнения вышеуказанной команды ошибка изменилась, просто повторите ее еще раз, пока ведомое устройство не заработает. но если этот способ не работает, вы должны заново создать подчиненное устройство.
Самый простой способ действий - стереть данные на ведомом устройстве и начать заново с новой копией ведущего устройства. Мастер можно скопировать с помощью mysqldump или что-то вроде rsync. В зависимости от размера вашей базы данных могут возникнуть простои. Это всегда будет работать.
Есть шанс, что если вы очистите место на ведомом диске, вы сможете начать репликацию с того места, где произошла ошибка, используя (изнутри mysql):
start slave
Если главный файл bin.log находится на своем месте, есть шанс, что репликация начнется сразу же. У меня не так уж много случаев, когда это происходило.
В последний раз я делал это, когда разработчик добавил новую таблицу в базу данных и не создавал ее сначала на ведомом устройстве. Я создал таблицу и должен был использовать sql_slave_skip_counter, чтобы пропустить биты, которые были потеряны из bin.log. Затем я вручную вставил 20 строк данных, которые пропустил.