讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么在MySQL集群MGR中安全同步用户与权限变更

云墨同学_1710

云墨同学_1710

发布时间:2026-10-21 12:24:48

|

315人浏览过

|

来源于php中文网

原创

MGR集群中GRANT不同步是因为其硬编码限制mysql系统库不参与复制,CREATE USER和GRANT语句不会生成binlog事件或广播至其他节点,仅本地生效;必须在所有节点显式执行幂等SQL并验证一致性。

怎么在mysql集群mgr中安全同步用户与权限变更

为什么直接执行 GRANT 不会在 MGR 集群中同步账号

MGR 集群(包括单主和多主模式)默认不复制 mysql 系统库的任何变更,这是硬编码限制,不是配置能绕过的。哪怕你在主节点执行 CREATE USER 'u'@'%' IDENTIFIED BY 'p' 或 GRANT SELECT ON db.t TO 'u'@'%',这些语句根本不会生成 binlog 事件,也不会被组通信协议广播——因为 mysql.user、mysql.db 等表被明确排除在事务复制范围之外。

你看到“执行成功”,只是当前节点本地生效;其他节点查 SELECT User, Host FROM mysql.user 依然为空或旧状态,连接时自然报 Access denied。

常见误操作包括:

  • 在从节点手动执行 GRANT(破坏一致性,后续主节点同名用户变更会冲突)
  • 用 INSERT INTO mysql.user 直接改表(跳过权限校验逻辑,且在 8.0+ 中字段如 account_locked 由服务端维护,写入无效甚至导致崩溃)
  • 依赖 FLUSH PRIVILEGES(它不写 binlog,在 MGR 中纯属冗余操作,还可能掩盖权限未同步的问题)

必须在所有节点上逐条执行 CREATE USER 和 GRANT

唯一安全方式是:把权限变更封装为幂等 SQL,在所有 MGR 节点上显式、顺序执行。不能靠“主库下发”,必须人工或脚本驱动。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

关键实操要点:

  • 始终用 CREATE USER IF NOT EXISTS 开头,避免某节点已存在用户时语句失败中断流程
  • GRANT 必须带完整 ON 子句和 TO 目标,例如 GRANT SELECT, INSERT ON mydb.* TO 'app'@'10.20.%';不要省略 @'host',否则默认为 @'%',不同节点 Host 解析差异会导致权限不一致
  • MySQL 8.0+ 若启用密码策略(如 validate_password),建议拆成两步:CREATE USER 显式指定 IDENTIFIED WITH caching_sha2_password BY 'xxx',再 GRANT,防止因插件不一致(如有的节点仍用 mysql_native_password)导致认证失败
  • 角色(ROLE)需额外处理:CREATE ROLE IF NOT EXISTS + GRANT ... TO ROLE + GRANT role_name TO 'user'@'host' + SET DEFAULT ROLE,且 SET DEFAULT ROLE 必须在每台节点单独执行

用 Ansible 自动化时必须验证三件事

Ansible 是目前最可控的落地方式,但光跑 mysql_query 模块远远不够。以下三项验证必须嵌入脚本末尾,缺一不可:

  • 比对所有节点的 SHOW GRANTS FOR 'app'@'10.20.%' 输出是否完全一致(注意空格、换行、大小写)——仅靠“SQL 执行成功”不等于权限真生效
  • 检查角色绑定是否写入系统表:SELECT COUNT(*) FROM mysql.role_edges WHERE FROM_HOST = '10.20.%' AND FROM_USER = 'app',确保每台返回相同非零值
  • 用该账号真实连接测试:mysql -u app -h $ip -P3306 -e "SELECT 1" 2>/dev/null || echo "FAIL on $ip",这是唯一能暴露 DNS、防火墙、插件不匹配等问题的环节

GTID 和版本兼容性是隐藏雷区

即使你严格按步骤执行了所有节点的 CREATE USER 和 GRANT,仍可能因 GTID 或版本差异中断复制或权限失效:

  • MySQL 8.0 的动态权限(如 BACKUP_ADMIN、CLONE_ADMIN)在 5.7 从节点上无法识别,会直接报 ERROR 3528 (HY000) 并停止组复制;必须确认所有节点 SELECT VERSION() 结果一致
  • GTID 模式下,若主节点执行 CREATE USER 因密码策略不满足而回滚,但从节点可能已应用部分 writeset,造成状态分裂;此时需手动清理从节点残留记录并重放
  • 跨版本升级后,务必在所有节点执行 mysql_upgrade,否则 mysql.user 表结构不一致会导致后续 GRANT 静默失败

真正难的不是写几条 SQL,而是定义清楚哪些权限必须强一致(比如应用连接账号)、哪些可以容忍短暂不一致(比如临时运维账号),以及谁来触发、何时验证、出错后怎么回滚。这些决策比技术实现更影响集群稳定性。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2293

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1399

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

815

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3172

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5388

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1199

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5651

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

4942

2023.08.14

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn