MySQL开启多线程复制时如何获取最新的SQL复制错误?
解决方案
方法1:无需修改配置,直接通过SQL查询错误日志
MySQL 8.0内置了performance_schema.error_log表,默认会持久化存储所有错误日志内容,直接查询该表即可获取复制相关的具体错误,参考查询语句:
SELECT LOGGED, THREAD_ID, PRIO, DATA FROM performance_schema.error_log WHERE DATA REGEXP 'replica|replication|Slave' ORDER BY LOGGED DESC LIMIT 20;
查询结果中的DATA字段就包含你在错误日志文件中看到的完整报错内容,比如主键冲突、表结构不一致等具体错误。
方法2:调整配置让错误信息直接展示在系统表和show replica status结果中
8.0.26版本后MySQL新增了replica_preserve_worker_errors系统变量,默认值为OFF,会导致多线程复制模式下worker线程的错误信息被自动清空,只要开启该参数即可保留错误信息:
- 临时生效(重启MySQL后失效):执行SQL
SET GLOBAL replica_preserve_worker_errors = ON; - 永久生效:在MySQL配置文件(my.cnf/my.ini)的
[mysqld]段添加以下配置,之后重启服务即可:
replica_preserve_worker_errors = ON
开启后:
performance_schema.replication_applier_status_by_worker表的LAST_ERROR_NUMBER、LAST_ERROR_MESSAGE字段会保留最近的worker线程报错show replica status\G返回结果的Last_Error字段会同步显示具体的复制错误内容,和8.0.27之前单线程复制的行为一致。
可选降级方案
如果不需要多线程复制的性能收益,也可以直接关闭多线程复制回到旧版本行为:
执行SQL SET GLOBAL replica_parallel_workers = 0;,同时在配置文件添加对应配置永久生效即可。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

