mha管理账号最小权限为select、replication client、replication slave、reload、super(8.0+可用system_variables_admin+binlog_admin替代);需在所有节点单独创建并验证,禁止grant option,配置文件权限设为600。

MySQL MHA 管理账号需要哪些最小权限
MHA(Master High Availability)本身不连 MySQL 执行业务 SQL,只做主从状态探测、故障切换和 binlog 应用。它依赖一个专用账号在所有节点(包括未来可能的候选主库)上执行有限但关键的操作。这个账号不能是 root,也不该有 GRANT OPTION 或 CREATE USER——MHA 不需要建用户,反而会因权限过大触发安全策略拦截(比如 MySQL 8.0 的 require_row_format 检查或 SELinux 限制)。
必须授予的权限组合是:
-
SELECT:读取information_schema、performance_schema和复制相关表(如show slave status的底层视图) -
REPLICATION CLIENT:获取主从 IO/SQL 线程状态、当前 binlog 位置、GTID 等 -
REPLICATION SLAVE:允许 MHA 在故障切换时启动 SQL 线程(START SLAVE SQL_THREAD),也用于 CHANGE MASTER 到新主库 -
RELOAD:执行FLUSH LOGS、FLUSH TABLES WITH READ LOCK(仅在 master 上用于一致性切换) -
SUPER:MySQL 5.7 及以前必需;MySQL 8.0+ 可用SYSTEM_VARIABLES_ADMIN+BINLOG_ADMIN替代,但为兼容性建议仍授SUPER(除非明确禁用)
如何在所有节点统一创建并验证账号
账号必须在每个节点(当前 master、所有 slaves、以及未来可能被提升的 standby 节点)上**单独创建**,不能只在 master 上建再靠复制同步——MHA 检查时会直连各节点,若某 slave 缺失该账号,masterha_check_repl 就会报 Can't connect to MySQL server 或更隐蔽的 Access denied for user 'mha'@'x.x.x.x'。
推荐使用如下语句(以用户名 mha、密码 mha_pass_2024 为例):
CREATE USER 'mha'@'%' IDENTIFIED BY 'mha_pass_2024'; GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'mha'@'%'; FLUSH PRIVILEGES;
注意三点:
- 主机名用
'%'而非具体 IP,避免因 MHA 脚本调用时解析出的连接 IP(如容器内网、跳板机出口 IP)不匹配而失败 - 不要加
WITH GRANT OPTION——MHA 从不授权其他账号 - 创建后立即在每个节点执行
mysql -umha -pmha_pass_2024 -e "SELECT 1"验证连通性,别等masterha_check_repl报错才排查
为什么 masterha_check_repl 显示 “MySQL is not running” 却能连上
这个错误信息极具误导性。实际原因通常是账号权限不足,而非 MySQL 进程挂了。MHA 内部会尝试执行 SHOW SLAVE STATUS 和 SELECT @@server_id,任一语句因权限拒绝(ERROR 1227 (42501))就会被误判为“MySQL not running”。常见诱因:
- slave 节点未授予
REPLICATION CLIENT(SHOW SLAVE STATUS权限依赖它) - MySQL 8.0 启用了
require_row_format=ON且账号没TABLE_ENCRYPTION_ADMIN(极少,但某些云 RDS 强制开启) - 账号被
sql_mode=STRICT_TRANS_TABLES下的隐式转换拦截(例如旧版 MHA 脚本传空字符串当 server_id)
诊断方法:手动用 mha 账号登录任一节点,逐条执行 MHA 日志里报错前最后那条 SQL,看是否返回权限错误。
配置文件中 user 和 password 怎么写才安全
MHA 的配置文件(如 /etc/app1.cnf)里 user 和 password 是明文,但这是设计使然——MHA 进程需直接读取,无法对接密钥管理服务。重点在于控制文件权限,而非加密内容:
- 配置文件属主设为运行 MHA 的专用系统用户(如
mha),权限严格设为600:chown mha:mha /etc/app1.cnf && chmod 600 /etc/app1.cnf - 避免把密码写在
~/.my.cnf中供脚本读取——MHA 不读该文件,且容易被其他进程误读 - 如果使用 Ansible 或 Salt 管理集群,密码应存于 vault,模板渲染时注入配置文件,渲染后立即清理内存变量
真正容易被忽略的是:MHA 的 masterha_manager 进程启动后,其命令行参数(含配置路径)可通过 ps aux | grep masterha_manager 查看,所以配置文件路径本身也别暴露敏感目录结构(如别用 /etc/mha/conf/mha_user_mha_pass.cnf)。











