无法在MariaDB 10.6主节点授予REPLICA MONITOR权限问题排查
背景
我们近期将旧的MariaDB 10.3主节点替换为一台运行10.6.x版本的副本节点,原本期望解决创建副本后出现的主从异常问题,却遇到了权限相关的新故障。
权限变更梳理
- MariaDB 10.3中,执行
SHOW REPLICA STATUS(原SHOW SLAVE STATUS)需用户拥有REPLICATION CLIENT权限 - 10.5.2版本起,
REPLICATION CLIENT更名为BINLOG MONITOR,但10.5之后BINLOG MONITOR不再包含SHOW REPLICA STATUS权限,需使用REPLICA MONITOR权限
旧问题(10.3主节点阶段)
旧10.3主节点不存在REPLICA MONITOR权限,无法给用户授予该权限;而授予的REPLICATION CLIENT权限在10.6副本节点上不足以执行SHOW REPLICA STATUS,因此我们将10.6副本节点提升为新主节点。
新问题(10.6主节点阶段)
在10.6新主节点上执行GRANT REPLICA MONITOR ON *.* TO 'user'@'host';时无报错,但执行FLUSH PRIVILEGES后用SHOW GRANTS FOR 'user'@'host';查看,该权限并未生效。尝试授予旧名称SLAVE MONITOR也无效,仅BINLOG MONITOR可正常授予,但仍无法执行SHOW REPLICA STATUS。
可能原因及解决方向
权限表结构未更新
升级或故障转移后,mysql库中的权限表(如mysql.user、mysql.global_priv)可能未完成结构更新。10.6版本新增了REPLICA MONITOR对应的权限字段,若表结构还是10.3版本的,会导致权限无法写入。- 执行
mysql_upgrade -u root -p命令,强制更新系统表结构,完成后重启MariaDB服务。
- 执行
全局权限表(global_priv)优先级问题
MariaDB 10.4及以上版本默认使用mysql.global_priv表存储权限(基于JSON格式),而旧的mysql.user表作为兼容保留。若授予权限时未正确写入global_priv,会导致权限不生效。- 可以尝试直接修改
global_priv表添加权限,或者使用ALTER USER 'user'@'host' GRANT REPLICA MONITOR;替代GRANT命令,后者更适配新的权限存储机制。
- 可以尝试直接修改
系统变量配置影响
检查是否存在sql_mode设置导致权限语句解析异常,或者read_only等变量限制了权限修改。- 执行
SHOW VARIABLES LIKE 'sql_mode';和SHOW VARIABLES LIKE 'read_only';确认配置,必要时调整后重启服务。
- 执行
权限授予范围问题
确保授予权限时使用了正确的范围,REPLICA MONITOR是全局权限,需使用ON *.*,不能指定单个数据库。
内容的提问来源于stack exchange,提问作者DNate

