在 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 并执行:
SQLINSERT INTO `db_name`.`table_name` ( `column1`, `column2`, `column3`, ... ) VALUES ( 'value1', 'value2', 'value3', ... );
重启从机同步
插入记录之后,我们需要重启从机的同步进程。在 MySQL 客户端中执行以下命令:
SQLmysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
总结
通过以上一系列步骤,我们成功解决了 MySQL 从机同步数据报错的问题。在遇到类似问题时,可参考以下思路进行处理: 查看从机同步状态,明确错误信息。 提取主机二进制日志,找出具体的操作 SQL。 根据错误原因,采取相应的解决措施,如插入缺失记录、跳过错误事件等。 重启从机同步进程,验证问题是否解决。
