昨晚,一位开发人员在主机上运行了错误的 mySQL 语句(查询插入具有重复主键的行)。突然,到从机的复制停止了。从机开始将其写入 mysql_relay_logs,在我们监控和修复它之前,磁盘空间不足了。
Master 配置为保存最近 3 天的 bin_logs,因此我们还没有完全丢失复制。有人能帮我解决这个问题吗?
我的大师身份:
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)
有人可以给我确切的命令让一切恢复正常吗?正如我所说,我确信我们已经丢失了从属服务器上的数据,因为它的磁盘空间不足,但我们一定在主服务器上有数据。
我的下一个问题是:如何确保这种情况不再发生。
非常感谢 Sparsh Gupta
答案1
最直接的做法是清除从服务器上的数据,然后重新开始复制主服务器。可以使用 mysqldump 或通过 rsync 之类的工具复制主服务器。根据数据库的大小,您可能会遇到停机时间。这种方法总是有效的。
如果您清除从属驱动器的空间,则有可能可以使用以下命令从发生错误的地方开始复制(从 mysql 内部):
start slave
如果主服务器的 bin.log 文件已就位,则复制可能会立即启动。我遇到过这种情况的次数不多。
我上次这样做是当开发人员向数据库添加新表时,但没有先在从属服务器上创建它。我创建了表,并且必须使用 sql_slave_skip_counter 跳过 bin.log 中丢失的位。然后我手动插入了我跳过的 20 行数据。
答案2
只需停止从属,然后跳过使用 ( 产生重复条目的 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;
如果运行上述命令后错误不同,只需重复该命令直到从属服务器工作。但如果这种方式不起作用,您必须从头开始重新创建从属服务器。