主从配置前必须关闭SELinux和防火墙,否则会导致从库卡在Connecting to master状态或binlog同步失败;需确保主库开启binlog、server-id唯一、从库设read_only=1,并正确执行CHANGE REPLICATION SOURCE TO命令且复制账号具备REPLICATION SLAVE权限。

主从配置前必须关掉 SELinux 和防火墙
SELinux 会拦截 MySQL 的网络连接和文件访问,哪怕 mysqld 启动成功,从库也常卡在 Connecting to master 状态;firewalld 默认拦掉 3306,但更隐蔽的是它可能拦掉 binlog dump 请求的源端口。别信“我只开了 3306 就够了”——CHANGE REPLICATION SOURCE TO 建立连接后,主库会用随机高位端口回传 binlog,这个必须放行。
实操建议:
- 运行
setenforce 0临时关闭 SELinux,并确认/etc/selinux/config中SELINUX=disabled - 用
systemctl stop firewalld停服务,或加规则:firewall-cmd --permanent --add-port=3306/tcp+firewall-cmd --permanent --add-service=mysql(后者才放行 dump 流) - 检查主库是否监听公网:
ss -tlnp | grep :3306,若只显示127.0.0.1:3306,需改bind-address = 0.0.0.0并重启mysqld
my.cnf 里这三项不配对,主从必然断
主库没开 binlog、server-id 冲突、从库没设 read_only=1,是三类最常导致同步失败或数据错乱的配置问题。尤其 server-id,MySQL 不校验唯一性,但一旦重复,从库会静默丢弃部分事件,现象是 Seconds_Behind_Master 慢慢变大,SHOW REPLICA STATUS\G 却显示 IO_Running: Yes、SQL_Running: Yes。
实操建议:
- 主库必须有:
log-bin=mysql-bin、binlog-format=ROW(推荐)、server-id=1 - 从库必须有:
server-id=2(不能和主库相同,也不能和其他从库重复)、relay-log=mysql-relay-bin、read_only=1(防止误写入) - 改完
my.cnf后,必须重启mysqld,systemctl restart mysqld;仅 reload 不生效
执行 CHANGE REPLICATION SOURCE TO 容易漏掉的关键参数
MySQL 8.0.23+ 把命令名从 CHANGE MASTER TO 改成 CHANGE REPLICATION SOURCE TO,但很多人照抄旧文档,或者漏掉 SOURCE_AUTO_POSITION=1 导致 GTID 同步失败。更常见的是用错用户权限:复制账号必须有 REPLICATION SLAVE 权限,不是 SELECT 或 REPLICATION CLIENT。
实操建议:
- 主库创建账号:
CREATE USER 'repl'@'%' IDENTIFIED BY 'xxx'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 从库执行时,若启用了 GTID,必须带:
SOURCE_AUTO_POSITION = 1;否则要手动指定SOURCE_LOG_FILE和SOURCE_LOG_POS - 密码含特殊字符?用单引号包住整个密码字段,例如:
SOURCE_PASSWORD='p@ss!word' - 执行后立刻查状态:
SHOW REPLICA STATUS\G,重点看IO_Running和SQL_Running是否都为Yes,以及Retrieved_Gtid_Set是否在增长
从库报错 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids 是什么情况
这不是配置遗漏,而是运行时冲突:从库启动后读到了主库的 server-id,发现和自己一样,就主动停掉 IO 线程。常见于克隆虚拟机做从库但没改 my.cnf,或容器部署时环境变量覆盖了配置。
实操建议:
- 先确认当前生效值:
SELECT @@server_id;,不是只看my.cnf - 如果值是 1,说明配置没生效,检查
mysqld启动时加载的配置文件路径:mysqld --help --verbose | grep "Default options" - 容器场景下,避免用
docker commit生成新镜像——旧容器的server-id可能已写进数据目录,应清空/var/lib/mysql后重新初始化
主从延迟、GTID 跳过、半同步开关这些进阶操作,都建立在 server-id 不重复、binlog 开启、复制账号权限干净的基础上。很多问题表面是 SQL 线程卡住,根子其实在第一次 START REPLICA 就埋下了。










