【解决中】Worker 1 failed executing transaction ‘ANONYMOUS‘ at source log mysql-bin.000005, end_log_pos 2
摘要:MySQL主从同步失败,报错"不允许使用GRANT创建用户"。排查发现repl账户缺少GRANT权限却尝试执行授权操作。提出三种解决方案:1)为repl添加GRANT权限;2)限定同步库表范围;3)在配置中忽略系统表同步(推荐)。第三种方法通过设置replicate-wild-ignore-table参数,可完全避免权限表同步问题,确保仅同步业务数据。
操作系统:红帽 Linux8
问题描述
在追溯 SLAVE 启动失败过程中,确认到具体报错内容如下:
Worker 1 failed executing transaction ‘ANONYMOUS’ at source log mysql-bin.000005, end_log_pos 2456; Error ‘You are not allowed to create a user with GRANT’ on query. Default database: ‘’. Query: ‘GRANT REPLICATION SLAVE ON . TO ‘repl’@’%‘’
Worker 1 在执行事务 ‘ANONYMOUS’ 时失败,源日志 mysql-bin.000005,结束日志位置 2456;查询时出现错误 ‘不允许使用 GRANT 创建用户’。默认数据库:‘’。查询语句:‘GRANT REPLICATION SLAVE ON . TO ‘repl’@’%‘’
问题排查
已知 repl@% 是用于 MySQL 主从同步的专用账户。仅被限制赋予 Replication Slave(仅复制)的最小权限。其并不具备 Grant (授权)权限。
mysql> Grant Replicaion Slave On *.* TO 'repl'@'192.168.88.%'
根据 MySQL 主从同步数据确认,当时想法是 ‘谁’ 让 repl 账户去执行 GRANT REPLICATION SLAVE ON . TO 'repl'@'%'。加上当时想法是 对主从同步的理解是 仅同步库中表数据,对库中用户相关表是否同步存在疑惑。于是确定问题方向(见方向三)。
# 执行环境
# 因为在 binlog 同步原因,执行 赋予 GRANT 命令时的 repl 在此时因没有 GRANT 权限陷入死循环问题。
# ******************************************************************************
mysql> SET sql_log_bin = 0; # 禁止后续命令记录至 binlog 用于同步事务
...执行你的方法命令
mysql> SET sql_log_bin = 1; # 开启后续命令记录至 binlog 用于同步事务
注意:下列方法命令不可记录至 binlog 用于主从同步。否则问题仍停留至 GRANT 上。
方向一:为 repl 用户增加 Grant (授权)权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.88.%' GRANT OPTION;
MySQL 主从同步预防的是 主数据库 故障。当发生时,仅切换数据库表即可使用,无需额外的用户授权配置。
方向二:限定库表数据来忽略 SQL 默认有的用户类表。
mysql> GRANT REPLICATION SLAVE ON 库.表 TO 'repl'@'192.168.88.%';
因为默认授权是 *.*,因此涵盖了用户权限相关的表。
方向三【100%可用】:忽略特定表,只允许业务数据同步。
# 在 /etc/my.cnf 中忽略
replicate-wild-ignore-table = mysql.% # 忽略用户权限表(如 `user`, `db`, `tables_priv`)
replicate-wild-ignore-table = performance_schema.% # 忽略性能监控数据(瞬时状态,无需复制)
replicate-wild-ignore-table = information_schema.% # 忽略元数据视图(动态生成,无法复制)
更多推荐

所有评论(0)