create user语句必须显式指定host,如'username'@'localhost'或'username'@'192.168.10.129';仅写用户名会报错,且生产环境严禁用'%',须配合replication slave和replication client权限、mysql_native_password插件及flush privileges生效。

CREATE USER 语句必须带 host 限定,不能只写用户名
MySQL 5.7 默认启用 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,且对用户创建语法更严格。直接写 CREATE USER 'repl' 会报错 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 或权限相关错误——本质是没指定允许连接的 host,导致用户无法从从库机器连入。
正确做法是显式声明客户端来源,常见有两类:
-
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_secure_password';:允许从任意 IP 连接(开发/测试环境常用,但生产需谨慎) -
CREATE USER 'repl'@'192.168.10.129' IDENTIFIED BY 'your_secure_password';:仅允许从指定从库 IP 连接(推荐生产环境使用)
GRANT 权限必须包含 REPLICATION SLAVE 和 REPLICATION CLIENT
只给 REPLICATION SLAVE 不够。从库在启动复制前,需要先执行 SHOW MASTER STATUS 获取 binlog 文件名和 position,这个命令依赖 REPLICATION CLIENT 权限。缺了它,CHANGE MASTER TO 会失败并报错:ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation。
授权语句必须一次性完成:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';- 执行后务必运行
FLUSH PRIVILEGES;—— MySQL 5.7 不再自动重载权限表 - 不要用
GRANT ALL PRIVILEGES替代,这会赋予过高权限,违反最小权限原则
用户密码加密方式要匹配 MySQL 5.7 默认认证插件
MySQL 5.7.5+ 默认使用 caching_sha2_password 插件,但旧客户端(尤其是某些 Java 驱动、Percona Toolkit 工具)可能不兼容,连接时抛出 Authentication plugin 'caching_sha2_password' cannot be loaded。
稳妥方案是显式指定老式插件:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';- 或创建后修改:
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'your_secure_password'; - 验证方式:
SELECT user, host, plugin FROM mysql.user WHERE user = 'repl';
root 用户若无 GRANT 权限,需手动修复
有些 MySQL 5.7 安装(尤其 Docker 镜像或一键包)中,root 用户的 Grant_priv 字段被设为 'N',导致执行 GRANT 时报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。
此时不能删 root 重建,应直接更新系统表:
UPDATE mysql.user SET Grant_priv='Y' WHERE User='root' AND Host='%';UPDATE mysql.user SET Grant_priv='Y' WHERE User='root' AND Host='localhost';- 然后必须执行
FLUSH PRIVILEGES;生效 - 注意:操作前建议备份
mysql.user表
主从复制用户看似简单,但 MySQL 5.7 对 host 精确性、权限组合、认证插件三者的耦合度很高——漏掉任一环,从库都卡在 IO_Running: No,且错误日志里往往只提示“access denied”,实际根因藏在用户创建环节。











