slave_io_running: no常见原因包括复制账号缺失或权限不足、主库binlog不可读、从库relay log写入失败、gtid模式下权限与gtid_purged不匹配四类,需依序排查验证。

从库复制账号缺失或权限不足导致IO线程失败
常见现象是 SHOW SLAVE STATUS\G 中 Slave_IO_Running: No,Last_IO_Error 明确提示 Access denied for user 'repl'@'xxx' 或 Failed to authenticate。这不是网络不通,而是账号在主库上根本没建、建了但没给 REPLICATION SLAVE 权限,或者密码错了(尤其在 MySQL 8.0+ 启用 caching_sha2_password 插件后)。
确认主库是否存在该账号并授予权限:
SELECT user, host FROM mysql.user WHERE user = 'repl';<br>SHOW GRANTS FOR 'repl'@'%';
若无结果或权限不全,立即补全:
- 创建账号(MySQL 8.0+ 推荐显式指定认证插件):
CREATE USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'your_secure_pass'; - 授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 刷新权限:
FLUSH PRIVILEGES;
注意:从库 CHANGE MASTER TO 中的 PASSWORD(或 MASTER_PASSWORD)必须与主库账号实际密码完全一致;MySQL 8.0.27+ 已弃用该参数,改用 GET_MASTER_PUBLIC_KEY=1 + 客户端配置密钥交换。
主库 binlog 日志不可读(权限/配置双重问题)
Last_IO_Error 出现 Could not find first log file name in binary log index 或 Not enough space on the disk,表面是日志缺失或磁盘满,但根源常是主库 log_bin 虽开启,却因 binlog_do_db/binlog_ignore_db 配置不当,导致从库请求的事件被主库主动过滤掉——这属于“逻辑权限”缺失,而非系统文件权限。
检查主库是否真的在写入 binlog 并覆盖目标库表:
- 确认
log_bin已启用:SELECT @@log_bin;应返回1 - 查看当前 binlog 文件:
SHOW BINARY LOGS;确保有活跃文件且未被 purge - 检查过滤规则:
SELECT @@binlog_do_db, @@binlog_ignore_db;若非空,确认业务库名不在ignore列表中,也不在do_db白名单外(白名单模式下只记录指定库)
生产环境强烈建议禁用 binlog_do_db/binlog_ignore_db,改用基于 row 格式的复制 + 库表级过滤(如 replicate_do_table 在从库配置),避免主库误删事件引发从库同步断裂。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
从库 relay log 写入失败(系统级文件权限问题)
当 Slave_SQL_Running: No 且 Last_SQL_Error 提示 Can't create/write to file '/var/lib/mysql/relay-log.000001' 或类似路径错误,说明 MySQL 进程对 relay log 目录没有写权限——这和复制账号无关,是操作系统层面的权限失控。
典型场景包括:手动迁移数据目录后未修正属主、SELinux/AppArmor 强制策略拦截、磁盘挂载为 noexec 或 nosuid。
- 查 relay log 路径:
SELECT @@relay_log;(默认为hostname-relay-bin) - 确认目录归属:
ls -ld /var/lib/mysql/,应为mysql:mysql - 临时修复:
chown -R mysql:mysql /var/lib/mysql/ - SELinux 下需恢复上下文:
restorecon -Rv /var/lib/mysql/
该问题常伴随 Relay_Log_Space 不增长、Seconds_Behind_Master 持续为 NULL,容易误判为网络故障,务必先看错误日志(/var/log/mysqld.log 或 SHOW ENGINE INNODB STATUS)定位真实 I/O 报错路径。
GTID 模式下账号权限与 gtid_purged 不匹配
启用 GTID 后,从库启动复制时若报 Client requested master to start replication from position > file size 或 fatal error: The slave is connecting using CHANGE MASTER TO ... which is not allowed when @@GLOBAL.GTID_MODE = ON,本质是复制账号虽存在,但主库 gtid_purged 值已超出从库能接受的范围,而账号又没被授予 BACKUP_ADMIN(MySQL 8.0+)或 REPLICATION_SLAVE_ADMIN 权限来动态调整状态。
关键点在于:GTID 复制依赖全局事务 ID 的连续性,一旦主库执行过 RESET MASTER 或 binlog 被 purge,从库就必须用新快照重建,或由高权限账号注入空事务对齐。
- 检查主库
gtid_purged:SELECT @@gtid_purged; - 检查从库已接收的 GTID 集:
SELECT @@gtid_executed; - 若从库缺失主库已 purged 的部分,且无法重搭,需用具备
REPLICATION_SLAVE_ADMIN权限的账号执行:STOP SLAVE; SET GTID_NEXT='xxx-yyy-zzz:12345'; BEGIN; COMMIT; START SLAVE;
这个操作必须严格对应缺失的 GTID,输错一个字符就会让后续所有事务跳过——它不是绕过错误,而是精确补位。没把握时,宁可重做从库,也别手抖乱设 GTID_NEXT。










