MHA监控账号必须在所有节点单独创建并授予SELECT、RELOAD、SUPER、REPLICATION CLIENT权限,不可复用root或repl账号;因MHA直连各节点执行探测命令,若任一节点漏建、host不匹配或认证插件/SSL不兼容,masterha_check_repl即报Access denied。

MHA管理账号不能用root,也不能复用repl账号,必须在每个MySQL节点上单独创建并授最小必要权限,否则masterha_check_repl会直接失败。
为什么masterha_check_repl报Access denied却SHOW GRANTS显示权限正常
因为MHA Manager是**直连每个节点**执行探测命令(如SHOW SLAVE STATUS、FLUSH LOGS),不是靠复制同步账号。如果某台slave漏建mha账号,或host匹配不上(比如建了'mha'@'192.168.1.10'但Manager从192.168.1.100连),就会报错Access denied for user 'mha'@'x.x.x.x',而不是“账号不存在”。
- 必须在所有节点(当前master、所有slaves、未来可能被提升的standby)上**逐台执行建号+授权**
- host建议用
'%',避免因Manager部署位置变动或SSH跳转导致IP不一致 - 不要用
GRANT OPTION——MHA不需要也不应有此权限,MySQL 8.0+开启require_row_format时甚至会拦截
MySQL 5.7 vs 8.0+的权限差异与兼容写法
MySQL 8.0+默认禁用SUPER,改用SYSTEM_VARIABLES_ADMIN+BINLOG_ADMIN更安全,但MHA Perl脚本仍大量依赖SUPER行为(如RESET SLAVE ALL)。为免踩坑,推荐统一用SUPER,除非明确禁用。
- 必需权限:
SELECT(读information_schema和复制状态表)、REPLICATION CLIENT(SHOW MASTER/SLAVE STATUS)、REPLICATION SLAVE(START SLAVE SQL_THREAD)、RELOAD(FLUSH LOGS) - MySQL 5.7:必须加
SUPER - MySQL 8.0+:可选
SYSTEM_VARIABLES_ADMIN+BINLOG_ADMIN,但为兼容性仍建议保留SUPER - 绝对禁止:
GRANT OPTION、CREATE USER、ALL PRIVILEGES(它不包含REPLICATION CLIENT)
认证插件和SSL连接容易被忽略的两个硬性条件
MHA Manager用Perl写的DBI模块连接MySQL,对认证插件和传输层非常敏感。即使账号建了、权限给了,也可能卡在连接阶段。
- MySQL 8.0+默认用
caching_sha2_password,但MHA不支持——必须显式指定mysql_native_password:CREATE USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 若MySQL启用了
require_secure_transport=ON,则该账号**必须走SSL连接**,否则masterha_check_repl会静默失败(日志只显示“Can't connect”) - 验证方式不是
SHOW GRANTS,而是模拟MHA行为:mysql -umha -pyour_pass -h192.168.1.152 -e "SHOW SLAVE STATUS\G"(在slave上执行)
配置文件权限和账号密码的实操细节
MHA Manager读取的配置文件(如/etc/app1.cnf)里要写明账号密码,这里极易出安全与功能双问题。
- 配置文件权限必须设为
600(chmod 600 /etc/app1.cnf),否则MHA启动时会报WARNING: Config file has group or world access并拒绝加载 - 密码不能含特殊字符(如
$、@、#),否则shell解析会出错;建议用字母+数字组合 - 账号名别用
mha这种易冲突的简短名,推荐mha_mgr或mha_admin,避免和监控账号(如mha_monitor)混淆 - 建号后务必
FLUSH PRIVILEGES,尤其在MySQL 5.7中不刷新会导致权限不生效
最常被跳过的动作是:在每台MySQL节点上单独验证SHOW MASTER STATUS和SHOW SLAVE STATUS能否用该账号成功执行。只要有一台失败,整个MHA集群就无法通过健康检查——这不是配置顺序问题,而是节点级权限缺失,必须逐台确认。


















