last_io_error 是诊断 mysql 主从复制 i/o 线程失败的核心依据,需优先查看其完整内容(用 \g),再依次排查网络连通性、复制账号权限与认证插件、server-uuid 冲突及 server-id 唯一性。

直接看 Last_IO_Error 字段
Slave_IO_Running: No 不代表“配置错了”,而是 MySQL 主动中止了 I/O 线程,原因全记在 Last_IO_Error 里。别跳过它去改 CHANGE MASTER TO 或重启服务。
执行 SHOW SLAVE STATUS\G 后,眼睛只盯这一行:不是 Seconds_Behind_Master,不是 Master_Host,就是 Last_IO_Error。它可能被截断,用 \G(而非 ;)才能完整显示。
- 如果为空或只写
Connection lost,大概率是auto.cnf中server-uuid重复 - 如果含
error connecting to master,说明网络或监听没通 - 如果含
Access denied for user,重点查主库用户host和认证插件 - 如果含
equal MySQL server ids,立刻检查主从my.cnf的server-id
验证主库是否真能被从库连上
别只 ping 主库 IP —— MySQL 复制走的是 TCP 3306(或自定义端口),不是 ICMP。必须测端口级连通性。
- 在从库执行:
nc -zv 主库IP 3306或telnet 主库IP 3306;超时或Connection refused就卡在这一步 - 登录主库,运行:
ss -tlnp | grep :3306,确认监听地址是0.0.0.0:3306或具体内网 IP,不是127.0.0.1:3306 - 检查主库防火墙:
ufw status(Ubuntu)或firewall-cmd --list-ports(CentOS),确保3306/tcp已放行 - 云服务器务必检查安全组规则(如阿里云/腾讯云),默认常只允许内网或特定 IP 段
检查复制账号的 host 和 authentication plugin
MySQL 8.0+ 默认用 caching_sha2_password 插件,但旧版从库客户端不支持,连接会静默失败,Last_IO_Error 可能只报 “authentication plugin” 相关提示。
- 在主库执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'repl_user';,确认host能匹配从库实际出口 IP(比如'repl_user'@'192.168.1.6'无法匹配从库真实 IP 是192.168.1.7) - 若插件是
caching_sha2_password且从库版本 ≤ 5.7,执行:ALTER USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpass'; - 若从库 ≥ 8.0 但主库仍用
mysql_native_password,则反向改主库:ALTER USER 'repl_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'yourpass'; - 权限必须含
REPLICATION SLAVE,仅REPLICATION CLIENT不够
排查 auto.cnf 和 server-id 冲突
VM 克隆、Docker 镜像复用、断电后直接恢复数据目录——这些操作会让从库的 /var/lib/mysql/auto.cnf 和主库一模一样,导致 I/O 线程拒绝连接,Last_IO_Error 可能为空或只显示 Connecting。
- 在从库执行:
find / -iname "auto.cnf" 2>/dev/null找到文件(通常为/var/lib/mysql/auto.cnf) - 停止 MySQL:
systemctl stop mysqld,编辑该文件,修改server-uuid值为合法 UUID(如a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8),确保与主库及其他从库不重复 - 删除残留元数据:
rm -f /var/lib/mysql/master.info(删前可备份) - 重启 MySQL:
systemctl restart mysqld,再执行START SLAVE;—— 单纯STOP SLAVE; START SLAVE;不生效 - 同时检查
my.cnf中server-id是否唯一且非 0,skip-slave-start是否被误设为ON
真正卡住的地方往往不是你改过的那几行配置,而是克隆留下的 server-uuid、云安全组漏放的端口、或者 caching_sha2_password 和老客户端之间的无声对抗。每次看到 Slave_IO_Running: No,先盯 Last_IO_Error,再动手,别让“看起来没问题”的配置骗你绕远路。











