我们的备份服务器上运行着一个 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
欢迎来到 MySQL 复制的美妙世界。我自己没有遇到您的特定问题,但是我遇到了许多其他奇怪的问题,并且最近的解决方案是从主服务器重新同步,就好像它是一个全新的从服务器一样,然后完成它。
您应该检查从属设备的错误日志——它通常非常明确地说明问题所在。
您应该将 mysql 错误日志绑定到您的监控系统中,否则您的从站可能毫无价值。
此外,您应该有一个监视器来检查从站状态。
而且为了完全有用,您还需要不时检查从属设备的同步,也许通过使用 mk-table-checksum 之类的东西;理想情况下,也将其结果与您的监控系统联系起来。
许多人设置 skip-slave-start 是为了确保如果从站在启动之前停止复制,一切正常。尝试运行'start slave'并查看是否有任何变化或是否记录了某些内容。此外,奇怪的是 SlaveSQL 进程正在运行而 SlaveIO 没有。从属设备上的本地中继日志可能已损坏,但应在日志中报告。您可以尝试关闭 Mysql,然后删除中继日志。
正如 womble 所提到的,忘记解决复制错误。这种方法最让我担心的是,您可能会成功地让复制再次重新启动并认为一切都很好,但是如果您的数据库的某些部分仍然不同步怎么办?
最好的办法是核对从数据库并从主数据库的快照重新启动复制。它不应该像您想象的那样具有破坏性:
http://www.neotitans.com/resources/mysql/quick-replication-error-recovery-via-snapshots.html
从上面的报告中我发现了问题,这个字段必须设置为(Slave_IO_Running):是的,但在上面的报告中它显示 Slave_IO_Running:否。
这就是导致问题的原因,如果此变量显示为“否”,则导致 IO 线程停止。所以不再有复制。您必须检查 Last_SQL_Errno 和 Last_SQL_Err 以获取有关原因的更多信息。错误编号 0 和空字符串的消息表示“没有错误”。Last_SQL_Error 出现在从站的错误日志中。
要解决此问题,请停止从站
然后设置:
这告诉从属服务器跳过一个查询(这是导致复制停止的无效查询)。如果您想跳过两个查询,您可以使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; 而是等等。
然后重新启动从站并检查日志,希望这能解决问题...