slave_io_running为no时,首要确认主库是否允许远程连接及权限配置:检查bind_address是否为0.0.0.0、防火墙是否放行3306端口、复制用户host是否匹配从库ip且具备replication slave权限,并重点查看last_io_error定位具体错误。

检查主库是否允许远程连接和权限配置
Slave_IO_Running 为 No,说明从库连不上主库,第一步必须确认主库网络和权限是否就绪。常见错误是主库没开 bind_address 或防火墙拦截了 3306 端口,或者复制用户没被授予 REPLICATION SLAVE 权限。
实操建议:
- 在从库执行
telnet 主库IP 3306(或nc -zv 主库IP 3306),确认端口可达 - 登录主库,运行
SELECT User,Host FROM mysql.user WHERE User='repl_user';,确认该用户 Host 允许从库 IP(不能是localhost) - 检查权限:
SHOW GRANTS FOR 'repl_user'@'%';,输出中必须含REPLICATION SLAVE - 主库配置文件中确保
bind_address不是127.0.0.1(或设为0.0.0.0),且server_id已设置且不为 0
查看从库的 Last_IO_Error 日志细节
MySQL 把 IO 线程失败原因直接记在 Last_IO_Error 字段里,比猜更可靠。这个字段值通常出现在 SHOW SLAVE STATUS\G 输出中,但容易被忽略或截断。
实操建议:
- 在从库执行
SHOW SLAVE STATUS\G,重点看Last_IO_Error行,不是Seconds_Behind_Master或Slave_SQL_Running - 如果内容过长被截断,用
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Variable_value, '\n', -1), ': ', -1) FROM information_schema.GLOBAL_STATUS WHERE Variable_name = 'SLAVE_STATUS';辅助提取(不推荐,不如直接\G) - 典型错误示例:
error connecting to master 'repl@192.168.1.10:3306' — host '192.168.1.10' is not allowed to connect to this MySQL server→ 权限问题;Access denied for user 'repl'@'192.168.1.20' (using password: YES)→ 密码错或加密方式不兼容(尤其 MySQL 8.0 默认caching_sha2_password)
验证主从 binlog 和 position 是否匹配
虽然 Slave_IO_Running=No 多数是连接问题,但极少数情况是 CHANGE MASTER TO 指定了不存在的 binlog 文件或 position,导致 IO 线程启动即失败。
实操建议:
- 在主库执行
SHOW MASTER STATUS;,记录File和Position - 在从库执行
SHOW SLAVE STATUS\G,对比Master_Host、Master_User、Relay_Master_Log_File和Exec_Master_Log_Pos是否与主库当前状态逻辑自洽 - 如果手动执行过
CHANGE MASTER TO,务必确认MASTER_LOG_FILE和MASTER_LOG_POS是主库上真实存在的 binlog 名和有效位点(可用mysqlbinlog --base64-output=decode-rows -v 主库binlog文件 | head -50查看开头) - MySQL 8.0+ 如果启用了
enforce_gtid_consistency=ON,则不能用MASTER_LOG_FILE/POS方式配置,必须用START SLAVE UNTIL SQL_AFTER_GTIDS或确保 GTID 自动同步
注意 MySQL 8.0 的默认认证插件兼容性
MySQL 8.0 客户端默认用 caching_sha2_password 插件,而老版本从库(如 5.7)或部分驱动不支持,会导致 Access denied 却查不出密码错误——因为认证阶段就断开了。
实操建议:
- 在主库创建复制用户时,显式指定旧插件:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 或修改已有用户:
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 执行后记得
FLUSH PRIVILEGES; - 避免在 8.0 主库上用
default_authentication_plugin=caching_sha2_password配置,除非所有从库都 ≥8.0 且驱动支持
真正卡住的时候,往往不是配置漏了哪一项,而是 Last_IO_Error 里那行字没看清,或者以为“能 ping 通就能连”,忽略了 MySQL 层面的权限、插件、协议版本三重过滤。多看一眼 SHOW SLAVE STATUS\G 的完整输出,比重启服务有用得多。











