1

我们有一个“1 个主,1 个从”的 MySQL 设置。我们突然停电,导致奴隶倒下。让机器备份后,我发现slave与master不同步:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.1
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-log.001576
          Read_Master_Log_Pos: 412565824
               Relay_Log_File: mysqld-relay-bin.002671
                Relay_Log_Pos: 6930
        Relay_Master_Log_File: mysql-log.001573
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table: blah.table2
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table blah.info; Can't find record in 'info', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-log.001573, end_log_pos 689031225
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 689030864
              Relay_Log_Space: 2944772417
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1032
               Last_SQL_Error: Could not execute Update_rows event on table blah.info; Can't find record in 'info', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-log.001573, end_log_pos 689031225
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

我们使用的是“ROW”的二进制日志格式,所以当我尝试使用 mysqlbinlog 查看有问题的行时,我看不到任何用处。我不想简单地设置跳过计数器,因为我认为这会使我的桌子更加不同步。

我可以在从属设备上做些什么,基本上“回滚”到给定的时间点,然后我可以在其中重置主日志编号、位置等?如果没有,我能做些什么来恢复同步吗?

4

1 回答 1

1

通常可以使用pt-table-checksumpt-table-sync从小的差异中恢复。

在我看来,你的奴隶在崩溃时失去了它在二进制日志序列中的位置。从站不断将其最后处理的 binlog 事件写入datadir /relay-log.info,但该文件使用缓冲写入,因此很容易在崩溃时丢失数据。

这就是为什么 Percona Server 创建了一个防崩溃复制功能来将相同的副本信息存储在 InnoDB 表中,以便从这种情况中恢复。

MySQL 5.6 实现了类似的功能:您可以设置relay_log_info_repository=TABLE副本以防崩溃的方式保存其状态。


回复您的评论:

是的,理论上pt-table-sync 可以修复任何数量的复制漂移,但它不一定是纠正大差异的最有效方法。在某些时候,丢弃过时的副本并使用主服务器的新备份重新初始化它会更快、更有效。

查看如何使用 Percona Xtrabackup 通过 6 个简单的步骤设置从属服务器进行复制

于 2013-07-09T22:45:51.547 回答