诊断 Mysql 复制问题

诊断 Mysql 复制问题

我们的备份服务器上运行着一个 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; 等等。

然后重新启动从属服务器并检查日志,希望这可以解决问题......

相关内容