主库创建复制账号必须授予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 后立刻失败。