必须授予replication slave on .权限,否则change master to报error 1227;需用create user与grant同host(如'192.168.4.%'),配mysql_native_password插件,且两端均执行并flush privileges。

复制账号必须授予 REPLICATION SLAVE 权限
不加这个权限,CHANGE MASTER TO 会直接报错 ERROR 1227 (42501): Access denied。MySQL 8.0 默认启用密码强度策略和账户锁定机制,创建账号时若未显式指定认证插件,可能因默认插件变更(如 caching_sha2_password)导致从库连接失败。
- 必须在两台服务器上都执行建号操作,不能只在一台上建、另一台复用——因为
repluser@'%'和repluser@'192.168.1.2'是两个不同账户 - 推荐限定 IP 范围而非用
'%',例如repluser@'192.168.4.%',避免暴露复制通道到公网 - 密码中若含特殊字符(如
@、/、$),在CHANGE MASTER TO语句里必须用单引号包裹,否则 SQL 解析会出错
GRANT 语句不能省略 ON *.*
MySQL 复制线程需要读取全局 binlog,不是某张表或某个库的权限。写成 ON db1.* 或 ON *.`db1` 都无效,SHOW SLAVE STATUS 会显示 Seconds_Behind_Master: NULL,且 IO_Running: No,错误日志里出现 Access denied; you need (at least one of) the SUPER or REPLICATION SLAVE privilege(s)。
- 即使你只打算同步特定库(如
audit,idm),账号权限仍需是ON *.* - 库级过滤靠
binlog-do-db或replicate-do-db配置项实现,不是靠 GRANT 控制 - MySQL 8.0.17+ 支持动态权限管理,但
REPLICATION SLAVE仍是静态权限,必须用GRANT显式赋予
账号密码需兼容双方 MySQL 版本的认证协议
若 master1 是 5.7、master2 是 8.0,默认 caching_sha2_password 插件会导致 5.7 无法连接 8.0 的复制账号,报错 Plugin caching_sha2_password could not be loaded。反过来,8.0 连接 5.7 一般无问题,因 8.0 兼容 mysql_native_password。
- 统一降级使用
mysql_native_password:建号时加IDENTIFIED WITH mysql_native_password BY 'xxx' - 或者升级客户端驱动(如 JDBC 8.0.28+、Connector/Python 8.0.33+),支持
caching_sha2_password - 检查方式:
SELECT host, user, plugin FROM mysql.user WHERE user = 'repluser';
不要给复制账号额外权限
常见误操作是顺手加上 ALL PRIVILEGES 或 SUPER,这不仅违反最小权限原则,还会埋下风险:一旦复制账号凭证泄露,攻击者可执行 KILL、SET GLOBAL、甚至 DROP DATABASE。
-
REPLICATION SLAVE已足够完成 IO 线程拉取 binlog 的全部动作 - 不需要
REPLICATION CLIENT(仅用于监控,如SHOW MASTER STATUS) - 不需要
SELECT权限——复制不查表,只解析 binlog 事件
实际配置最简有效组合就是这三行,别多也别少:
CREATE USER 'repluser'@'192.168.4.%' IDENTIFIED WITH mysql_native_password BY 'Abc-1234'; GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.4.%'; FLUSH PRIVILEGES;注意:两台机器都要执行,且
host 部分要互换——A 上填 B 的网段,B 上填 A 的网段。漏掉任一端,START SLAVE 后 IO_Running 会卡在 Connecting。











