MySQL 从机同步数据报错(Last_Errno 1032)解决流程

发布于 阅读 8未分类

在 MySQL 主从复制的应用场景中,从机同步数据时可能会碰到各种各样的问题,进而导致同步进程中断。本文会详细阐述一次从机同步数据报错的完整处理过程,为大家在遇到类似状况时提供有效的参考。

问题初现:从机同步报错

当我们检查 MySQL 从机的同步状态,执行 show slave status\G; 命令后,得到了以下关键信息:

纯文本
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1032
Last_Error: Could not execute Delete_rows event on table db_name.table_name; Can't find record in 'table_name', Error_code: 1032; 
handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.xxxxxx, end_log_pos xxxxxxxx

从这些输出内容我们能够得知,从机的 I/O 线程运行正常,然而 SQL 线程却停止了。错误代码 1032 表明,在执行 Delete_rows 事件的时候,在 db_name.table_name 表中找不到对应的记录。

深入排查:解析主机日志

为了找出具体引发问题的删除操作 SQL,我们从主机上提取了对应的二进制日志。执行下面的命令,把 mysql-bin.xxxxxx 日志文件解码并输出到 /tmp/logs.txt 文件里:

Bash
[root@host_name data]# /usr/local/mysql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.xxxxxx > /tmp/logs.txt

接着,在生成的日志文件中搜索错误信息里提到的 end_log_pos xxxxxxxx,找到了对应的删除 SQL:

SQL
### DELETE FROM `db_name`.`table_name`
### WHERE
###   @1=value1
###   @2='value2'
###   @3='value3'
###   ...

从这个 SQL 可以看出,主机尝试删除 db_name.table_name 表中的一条记录,但从机上该记录不存在,这就导致了同步错误。

解决之道:补全数据与重启同步

插入缺失数据

为了解决这个问题,我们要在从机上插入这条缺失的记录。依据前面找到的删除 SQL 中的条件,构造插入 SQL 并执行:

SQL
INSERT INTO `db_name`.`table_name` (
  `column1`,
  `column2`,
  `column3`,
  ...
)
VALUES
  (
    'value1',
    'value2',
    'value3',
    ...
  );

重启从机同步

插入记录之后,我们需要重启从机的同步进程。在 MySQL 客户端中执行以下命令:

SQL
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

总结

通过以上一系列步骤,我们成功解决了 MySQL 从机同步数据报错的问题。在遇到类似问题时,可参考以下思路进行处理: 查看从机同步状态,明确错误信息。 提取主机二进制日志,找出具体的操作 SQL。 根据错误原因,采取相应的解决措施,如插入缺失记录、跳过错误事件等。 重启从机同步进程,验证问题是否解决。

评论 (0)
0 / 500
暂无评论,快来抢沙发~