主库创建复制账号必须授予REPLICATION SLAVE权限,且需开启binlog、设置唯一server-id;从库CHANGE MASTER TO参数须严格匹配主库SHOW MASTER STATUS输出,并验证Slave_IO_Running、Slave_sql_Running和Seconds_Behind_Master状态。

主库上创建复制账号必须用 REPLICATION SLAVE 权限
mysql 主从复制依赖 binlog,从库通过 I/O 线程连接主库并拉取日志,这个连接必须由一个专用账号完成。该账号不能只给 select 或 ALL PRIVILEGES,否则从库启动时会报错:Error 2003 (HY000): Can't connect to MySQL server 或更隐蔽的 Slave_IO_Running: No 且 Seconds_Behind_Master: NULL。
正确做法是显式授予 REPLICATION SLAVE 权限(MySQL 5.7+)或 REPLICATION CLIENT, REPLICATION SLAVE(旧版本兼容):
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_strong_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 账号主机名建议用具体从库 IP(如
'repl'@'192.168.1.10'),避免开放'repl'@'%'增加攻击面 - 密码必须满足当前 MySQL 的密码策略(如
validate_password.Length),否则CREATE USER会失败 - 执行后务必运行
FLUSH PRIVILEGES,否则权限不生效
配置前先确认主库已开启 binlog 并设好 server-id
复制账号只是“钥匙”,主库本身得是“可复制状态”。如果 my.cnf 中没启用 binlog 或 server-id 为 0/未设置,从库即使连上也拿不到任何日志。
检查并修改主库配置文件(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW expire_logs_days = 7
-
server-id必须是唯一正整数,主从不能相同;若为 0,SHOW MASTER STATUS将返回空 -
log-bin名称可自定义,但后续CHANGE MASTER TO中的MASTER_LOG_FILE必须严格匹配 -
binlog-format = ROW是推荐值,避免语句级复制在函数、时间函数等场景下的不一致 - 改完配置需重启 MySQL(
systemctl restart mysql),不是 reload
从库 CHANGE MASTER TO 的关键参数不能抄错
从库执行 CHANGE MASTER TO 是把复制关系“绑定”到主库账号和日志位置。参数写错一个字符(比如端口漏写、密码多空格),都会导致 START SLAVE 后立刻失败。
典型命令(假设主库 IP 是 192.168.1.5,复制账号为 repl,密码为 abc123):
CHANGE MASTER TO MASTER_HOST='192.168.1.5', MASTER_USER='repl', MASTER_PASSWORD='abc123', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
-
MASTER_LOG_FILE和MASTER_LOG_POS必须来自主库执行SHOW MASTER STATUS的输出,不能凭空猜测或沿用旧值 -
MASTER_PASSWORD在 MySQL 8.0.23+ 默认被弃用,应改用MASTER_AUTO_POSITION = 1+ GTID 模式(需主从都开启gtid_mode=ON) - 如果主库启用了 ssl,还需加上
MASTER_SSL=1及对应证书参数,否则连接被拒绝
验证复制状态时重点看两个 Running 和 Seconds_Behind_Master
执行 START SLAVE 后,不能只看有没有报错,必须查状态:
SHOW SLAVE STATUSG
重点关注三行:
-
Slave_IO_Running: Yes—— 表示从库能连上主库并读取 binlog;如果是No,先查Last_IO_Error -
Slave_SQL_Running: Yes—— 表示从库能正常解析并执行 relay log;如果是No,看Last_SQL_Error,常见于主从表结构不一致或重复键冲突 -
Seconds_Behind_Master: 0(或稳定小数值)—— 表示复制延迟低;若为NULL,说明 SQL 线程没跑起来;若持续增大,可能是从库负载高或大事务阻塞
真正容易被忽略的是:即使两个 Running 都是 Yes,如果 Seconds_Behind_Master 长期 > 0,复制其实已经“假活”——它在同步,但永远追不上。