从库报Access denied或ERROR 1045,根本原因是权限变更未同步:MySQL主从默认不复制mysql库,5.7及以前GRANT不写binlog,8.0+需log_bin=ON且replicate_ignore_db不含mysql;主库执行GRANT后从库查不到用户即因被忽略,修复须确保binlog开启、禁用忽略配置、用CREATE USER+GRANT而非直写mysql.user表。

从库报 Access denied for user 'repl'@'%' 或 ERROR 1045,基本可以断定是复制用户权限缺失或未同步,不是网络或配置文件问题,修复重点在让权限变更真正进入 binlog 并被从库回放。
为什么 GRANT 在主库执行了,从库还是没账号?
MySQL 主从默认不复制 mysql 库的变更。5.7 及以前版本中 GRANT 语句根本不写 binlog;8.0+ 虽默认记录,但前提是:log_bin=ON 且 replicate_ignore_db 配置里不含 mysql。一旦被忽略,主库上建的 repl 用户、改的密码、增的权限,从库一条都收不到。
- 执行
SELECT user,host FROM mysql.user:主库有结果、从库返回空,就是典型信号 - 执行
SHOW GRANTS FOR 'repl'@'%':从库报ERROR 1141,说明权限记录完全缺失 - 检查
SHOW SLAVE STATUS\G中的Replicate_Ignore_DB字段是否含mysql—— 容器模板或 Ansible 批量下发时极易无意识加入
别碰 mysql.user 表,也别用 INSERT INTO 加账号
直接写 mysql.user 表不仅不会触发 binlog,还绕过权限校验逻辑,字段顺序、密码加密方式、新增字段(如 account_locked)极易出错,导致从库回放失败甚至中断复制。
- 禁止写法:
INSERT INTO mysql.user (Host,User,authentication_string) VALUES ('%','repl',PASSWORD('xxx')); - 禁止写法:
UPDATE mysql.user SET Select_priv='Y' WHERE User='repl'; - 正确路径只有:
CREATE USER 'repl'@'%' IDENTIFIED BY 'xxx'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -
GRANT自动触发FLUSH PRIVILEGES,无需手动执行
修复前必须确认的三个硬性条件
光写对语句没用,底层机制必须打开,否则权限变更永远进不了 binlog。
- 主库必须开启 binlog:
SELECT @@log_bin;返回1,不能只配了log_bin_basename就以为开了 - 确认没启用
--skip-grant-tables:SELECT @@skip_grant_tables;结果必须是0,否则权限系统本身已失效 - 从库不能设
read_only=1同时禁用super_read_only,否则GRANT类语句在从库执行会直接报ERROR 1290
实操修复路径:分已中断和未中断两种场景
核心原则是让权限变更真正进入 binlog 并被从库回放,而不是在从库本地硬改——后者只是临时止血,下次主库再改权限又会断。
- 若尚未中断(主库刚建完
repl用户但发现从库查不到):在主库临时关闭 binlog 记录:SET SESSION sql_log_bin = 0;,再执行DROP USER 'repl'@'%'; CREATE USER 'repl'@'%' IDENTIFIED BY 'xxx'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';,最后SET SESSION sql_log_bin = 1; - 若已中断(
Slave_SQL_Running: No且Last_SQL_Error明确提示Access denied):先STOP SLAVE;,然后在从库上手动创建同名账号并授权(仅用于恢复连接):CREATE USER 'repl'@'%' IDENTIFIED BY 'xxx'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';,再START SLAVE; - 验证是否生效:
SHOW SLAVE STATUS\G中Slave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master开始下降
最容易被忽略的是从库的 replicate_ignore_db 是否继承了主库的忽略规则——尤其当配置是批量下发时,mysql 库常被无意识加入忽略列表。权限不同步问题,八成卡在这一步。


















