Mycat连接MySQL失败时,90%的权限问题源于MySQL侧'mycat'@'host'账号未正确创建或授权,需先执行SELECT USER(), CURRENT_USER()确认实际认证身份,按CURRENT_USER()结果授权,并补全XA_RECOVER_ADMIN等关键权限,再检查bind-address、防火墙及Mycat配置中的密码加密和connectionProperties。

直接结论:Mycat连接MySQL失败时,90%的权限问题出在 MySQL 侧的 'mycat'@'host' 账号未正确创建或授权,而非 Mycat 配置本身。
查清 MySQL 实际认证身份:CURRENT_USER() 比 USER() 更关键
登录 MySQL 后别急着 GRANT,先执行:
SELECT USER(), CURRENT_USER();
如果返回 'mycat'@'192.168.1.100' 和 'mycat'@'%' 不一致,说明 MySQL 没匹配到你预期的账号——它用的是另一个 host 规则(比如 'mycat'@'192.%' 或 'mycat'@'localhost')。后续所有授权都得按 CURRENT_USER() 的结果来操作,否则白忙。
- 若
CURRENT_USER()是'mycat'@'localhost',但 Mycat 运行在另一台机器上,说明 Mycat 实际走的是 socket 连接(比如配置了127.0.0.1却被本地解析),需检查 Mycat 的prototypeDs.datasource.json中host是否写成了localhost - 若
CURRENT_USER()显示''@'%'(空用户名),说明存在匿名用户干扰,必须删掉:DROP USER ''@'%';
必须授予的最小权限集:XA_RECOVER_ADMIN 容易漏
Mycat2 使用 XA 分布式事务,MySQL 8.0.30+ 默认关闭 XA_RECOVER_ADMIN 权限,不显式授权就会报 Access denied,且日志里不提示具体缺哪个权限。
- 确认当前账号权限:
SHOW GRANTS FOR CURRENT_USER(); - 补全关键权限(注意不是
ALL PRIVILEGES):GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, XA_RECOVER_ADMIN ON *.* TO 'mycat'@'%';
- 执行
FLUSH PRIVILEGES;后,重启 Mycat 才生效(仅 reload 不够)
验证 MySQL 是否真允许远程连接:bind-address 和防火墙要双查
即使账号权限全、密码对,Connection refused 也可能是 MySQL 根本没监听外部请求。
- 检查 MySQL 配置:
grep bind-address /etc/my.cnf,必须是0.0.0.0或明确 IP,不能是127.0.0.1或注释掉 - 确认端口监听:
ss -tlnp | grep :3306,输出中应含*:3306,而非127.0.0.1:3306 - 绕过防火墙干扰测试:
telnet mysql_host 3306从 Mycat 所在机器直连;不通就不是权限问题,是网络层阻断 - 云服务器务必检查安全组——很多故障卡在这一步,比 MySQL 配置还高频
Mycat 侧密码加密和配置字段必须严格匹配
root.user.json 里密码字段不是明文填,也不是 Base64,必须用 Mycat2 自带工具加密,且字段名大小写敏感。
- 加密命令必须用 Mycat2 目录下执行:
./mycat encrypt your_password,输出直接贴进password字段 - 配置文件必须含
"dialect":"mysql",漏写或写成"DIALECT"会导致驱动加载失败,日志只报No suitable driver,容易误判为驱动问题 - 若用 MySQL 8.0+,
prototypeDs.datasource.json中需显式加"connectionProperties": "allowPublicKeyRetrieval=true&useSSL=false",否则握手阶段就断连
真正卡住人的地方,往往不是“有没有权限”,而是 MySQL 认证时用了哪个 'user'@'host'、Mycat 用哪个 host 去连、以及加密密码是否被意外截断——这三者只要一个对不上,Access denied 就稳稳出现,且日志不会告诉你差在哪一环。


















