主库上创建复制账号必须用 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 STATUS\G
重点关注三行:
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,复制其实已经“假活”——它在同步,但永远追不上。
