我们的备份服务器上运行着一个 mysql 复制客户端。自从上周断电以来,它就停止了复制。在此之前,它已经连续运行了几个月。
我尝试重启主服务器和从服务器,但无济于事。我可以从从服务器访问主服务器,因此网络不是问题所在。
我还能做些什么来尝试诊断问题所在吗?
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000060
Read_Master_Log_Pos: 46277494
Relay_Log_File: mysqld-relay-bin.000348
Relay_Log_Pos: 98
Relay_Master_Log_File: mysql-bin.000060
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 46277494
Relay_Log_Space: 98
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)
ERROR:
No query specified
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000069
Position: 851796
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified
更新:错误进入了 daemon.log,而不是 mysql.err,这可以解释为什么我找不到它们。问题似乎是主服务器说日志不可用,这没有多大意义,因为该日志(和前一个日志)在主服务器上仍然可用。
090710 9:17:35 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000060' at position 46277494, relay log './mysqld-relay-bin.000350' position: 98
090710 9:17:35 [Note] Slave I/O thread: connected to master 'username@master:3306', replication started in log 'mysql-bin.000060' at position 46277494
090710 9:17:35 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
090710 9:17:35 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
090710 9:17:35 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000060', position 46277494
答案1
欢迎来到 MySQL 复制的奇妙世界。我自己没有遇到过您的特定问题,但我遇到过很多其他奇怪的问题,最接近的解决方案是从主服务器重新同步,就好像它是一个全新的从服务器一样,然后就完成了。
答案2
您应该检查从属的错误日志 - 它通常非常清楚地表明问题是什么。
您应该将 mysql 错误日志绑定到您的监控系统中,否则您的从属服务器可能会毫无价值。
此外,您还应该有一个检查从属状态的监视器。
为了发挥任何作用,您还需要不时检查从属服务器的同步,或许可以使用 mk-table-checksum 之类的工具;理想情况下,将其结果也绑定到您的监控系统中。
答案3
许多人设置 skip-slave-start,这样他们就可以确保在从服务器停止复制之前一切都正常。尝试运行“start slave”,看看是否有任何变化或是否有记录。此外,奇怪的是 SlaveSQL 进程正在运行,而 SlaveIO 没有运行。从服务器的本地中继日志可能已损坏,但应该日志中会报告此问题。您可以尝试关闭 Mysql,然后删除中继日志。
答案4
从上面的报告中我发现了这个问题,这个字段必须设置为(Slave_IO_Running):是,但是在上面的报告中它显示Slave_IO_Running:否。
这就是问题的原因,如果此变量显示“否”,则 IO 线程已停止。因此不再有复制。您必须检查 Last_SQL_Errno 和 Last_SQL_Err 以获取有关原因的更多信息。错误编号为 0 且消息为空字符串表示“无错误”。Last_SQL_Error 出现在从属的错误日志中。
要解决此问题,请停止从属
然后设置:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
这告诉从服务器跳过一个查询(即导致复制停止的无效查询)。如果您想跳过两个查询,则可以使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; 等等。
然后重新启动从属服务器并检查日志,希望这可以解决问题......