复制账号必须授予REPLICATION SLAVE权限,MySQL 8.0+需加PASSWORD EXPIRE NEVER;GTID模式下还需REPLICATION CLIENT;host必须为从库实际连接IP,不可用%通配。

复制账号必须用 REPLICATION SLAVE,不是 SELECT 或 REPLICATION CLIENT
从库 IO 线程连接主库时,只认 REPLICATION SLAVE 权限。给 SELECT 没用,给 REPLICATION CLIENT 也不行——后者只用于查 GTID、binlog 位置等运维操作,不能替代复制身份认证。一旦权限不对,从库启动复制就会报错:ERROR 1236 (HY000): Could not open log file 或更直白的 Access denied; you need (at least one of) the SUPER or REPLICATION SLAVE privilege(s)。
这个账号不是给人用的,是给从库内部线程用的,权限粒度极窄,不能省,也不能“凑合”。
MySQL 8.0+ 创建时必须加 PASSWORD EXPIRE NEVER
MySQL 8.0 默认启用强密码策略,复制账号若不显式禁用密码过期,会触发 ERROR 3092 (HY000): The account currently does not have the necessary privileges to execute this command。这不是权限没给够,而是账号被判定“不够安全”。
- 正确写法:
CREATE USER 'repl'@'192.168.5.20' IDENTIFIED BY 'p' PASSWORD EXPIRE NEVER; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.5.20';- 别用
%匹配所有主机:MySQL 8.0+ 默认禁止caching_sha2_password用户用%登录,且存在安全隐患 - 密码里避免
@、/、空格等字符,否则CHANGE MASTER TO解析容易失败
host 必须填从库真实发起连接的 IP,不是你猜的 IP
常见错误是按从库网卡地址建账号,结果从库连不上。真实连接源 IP 取决于网络拓扑:
- NAT 模式下(如 VirtualBox/VMware),主库收到的是网关 IP(如
192.168.131.1),不是从库虚拟机 IP - 桥接模式下,才可能直接看到从库物理 IP
- 查日志最准:
tail -f /var/log/mysqld.log,看报错里写的 “Access denied for user 'repl'@'X.X.X.X'” —— 那个X.X.X.X就是你该授权的 host - 内网环境推荐写成
'repl'@'192.168.5.%',比%安全,又比单 IP 灵活
GTID 模式下还得额外加 REPLICATION CLIENT
如果主从启用了 GTID(gtid_mode=ON),仅 REPLICATION SLAVE 不够。从库执行 SHOW SLAVE STATUS、SELECT @@global.gtid_executed 等操作时,需要 REPLICATION CLIENT 权限,否则状态查询失败或同步异常静默卡住。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
正确授权语句是:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.5.20';
注意:REPLICATION CLIENT 是只读类权限,不涉及数据变更,但漏掉它,GTID 环境下排查会非常被动。
实际部署时最容易忽略的,是把网络层看到的真实源 IP 和逻辑上“该连谁”混为一谈——日志里那个被拒绝的 IP,才是唯一可信的 host 值。










