MySQL主从复制需主库开启binlog并设唯一server-id;从库配不同server-id,用CHANGE MASTER TO指定主库信息;主库创建REPLICATION SLAVE账号;START SLAVE后检查IO/SQL线程状态及Seconds_Behind_Master。

主库必须开启 binlog 并设置唯一 server-id
MySQL 主从复制依赖 binlog,如果安装后没手动启用,SHOW VARIABLES LIKE 'log_bin'; 会返回 OFF。必须在 my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段落里显式配置:
log-bin = mysql-bin server-id = 1 binlog-format = ROW
server-id 是整数,主库和从库不能相同;binlog-format = ROW 是推荐值,避免语句级复制在函数、时间戳等场景下产生不一致。
从库配置 server-id 并用 CHANGE MASTER TO 指向主库
从库同样要设唯一 server-id(比如 2),且不能重启前就执行复制命令。关键步骤是 CHANGE MASTER TO,它需要主库的 binlog 文件名和位置——这通常来自 SHOW MASTER STATUS; 的输出。常见写法:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='your_secure_password', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
注意:MASTER_LOG_FILE 和 MASTER_LOG_POS 必须严格匹配主库当前状态,否则从库启动 IO 线程时会报错 Got fatal error 1236。
主库需创建专用复制账号并授权 REPLICATION SLAVE
不能用 root 或其他高权限账号做复制,安全起见应新建账号。在主库执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_secure_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
如果主库启用了 require_secure_transport=ON,从库连接时需加 MASTER_SSL=1 参数,否则报错 Access denied for user 'repl'@'x.x.x.x' (using password: YES),但错误信息不提示 SSL 问题,容易卡住。
START SLAVE 后检查 Seconds_Behind_Master 是否为 0
执行 START SLAVE; 后,立刻用 SHOW SLAVE STATUS\G 查看状态。重点关注三处:
-
Slave_IO_Running: Yes和Slave_SQL_Running: Yes—— 两者都必须为Yes -
Seconds_Behind_Master: 0—— 表示已追平,非 0 说明有延迟 -
Last_IO_Error或Last_SQL_Error—— 非空即出错,比如主键冲突、表不存在、SQL 线程被 stop 过
常见陷阱:从库开了 read_only=1 但没关 super_read_only,会导致 SQL 线程无法写入,Slave_SQL_Running 显示 No 且无明显错误日志。










