mysql主从复制的常见问题有哪些_故障排查方法

来源:这里教程网 时间:2026-02-28 20:47:03 作者:

为什么
SHOW SLAVE STATUS\G
报错或找不到命令?

这不是 MySQL 出了问题,而是你把它当成了 Shell 命令执行。

SHOW SLAVE STATUS
是 MySQL 客户端内的 SQL 语句,不能在 Linux 终端直接敲——否则会报
bash: show: command not found

必须先登录 MySQL 客户端:
mysql -u root -p
,输密码后进入
mysql>
提示符
再执行:
SHOW SLAVE STATUS\G
(注意末尾
\G
是格式化输出,不是必须但强烈推荐)
如果用 Docker,别忘了先进容器:
docker exec -it mysql_slave1 bash
,再连 MySQL

Slave_IO_Running: No
Slave_SQL_Running: No
分别意味着什么?

从库靠两个线程工作:IO 线程负责拉 binlog,SQL 线程负责执行。一个挂了,复制就断;两个都挂,数据彻底不同步。

Slave_IO_Running: No
→ 主要查网络和权限:
telnet master_ip 3306
看通不通;主库是否授权了从库 IP:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_ip' IDENTIFIED BY 'xxx';
Slave_SQL_Running: No
→ 看
Last_SQL_Error
字段,常见如
1062 Duplicate entry
(主键冲突)、
1050 Table already exists
(表已存在)、
1032 Can't find record
(从库缺行)
别急着
START SLAVE
,先确认错误可跳过还是需修复;误跳可能丢数据

主从延迟高,
Seconds_Behind_Master
一直涨怎么办?

这个值只是估算,不准但有参考价值。真正卡住的往往是 SQL 线程串行回放——主库并行写的 N 条事务,从库只能一条条执行。

检查是否启用了并行复制:
SELECT @@slave_parallel_type;
应为
LOGICAL_CLOCK
(MySQL 5.7+),且
slave_parallel_workers > 0
大事务是最大杀手:比如一个
UPDATE
改了百万行,会阻塞后续所有 relay log 回放;建议拆成小批量
避免在从库写入:
read_only=ON
是基础,但 5.7+ 还得加
super_read_only=ON
防绕过
如果延迟突然飙升,立刻查
SHOW PROCESSLIST
看 SQL 线程是否卡在某个慢查询上

复制中断后,能直接
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1
吗?

仅适用于传统复制(非 GTID 模式),且只跳过**一个事件**(不一定是完整事务)。GTID 环境下跳过必须用

SET GTID_NEXT
+ 空事务方式,否则会破坏 GTID 集合一致性。

跳之前务必确认:
Relay_Log_File
Relay_Log_Pos
对应的 binlog 内容是否真的可丢(比如只是建了个测试表)
更安全的做法是解析 binlog:
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 | grep -A 10 -B 5 "xxx"
,看清出错那条到底干了啥
跳过不是常态方案,频繁跳说明架构或应用有问题:比如没关
sql_log_bin
就在从库手动改数据,或者主库用了
CREATE TEMPORARY TABLE
这类不记 binlog 的语句

最常被忽略的一点:主从复制不是故障转移方案。它解决的是读扩展和基础容灾,但主库宕机后,从库是否能升主、升主后数据是否完整、GTID 是否连续、自增 ID 是否冲突……这些全得靠额外机制(MHA、Orchestrator、或自己脚本)兜底,MySQL 自己不保证。

相关推荐