ProxySQL转发连接时用户MySQL认证失败问题求助
问题原因分析及解决办法
核心原因
这个问题的本质是ProxySQL的用户配置未正确映射后端MySQL用户,同时可能伴随MySQL 8.0认证协议的兼容性问题:
- ProxySQL作为中间层,需要同时配置「前端用户(供外部客户端连接ProxySQL)」和「后端用户(ProxySQL用来连接MySQL)」,如果只在MySQL中创建了
ravi用户,但未在ProxySQL内部完成用户映射,ProxySQL无法正确转发认证请求。 - MySQL 8.0默认使用
caching_sha2_password认证插件,ProxySQL 2.2.4对该插件的支持不完善,会导致ProxySQL连接MySQL时认证失败。
另外,虽然容器内部直接连接MySQL成功,但这是因为直接使用MySQL的用户认证,跳过了ProxySQL的中间转发逻辑,和外部通过ProxySQL连接的认证路径完全不同。
解决步骤
1. 配置ProxySQL前端用户映射
进入ProxySQL Admin控制台,检查并添加ravi用户:
-- 查看现有用户配置 SELECT username, active, default_hostgroup FROM mysql_users; -- 如果ravi不存在,添加用户映射(backend=1表示该用户用于后端连接) INSERT INTO mysql_users (username, password, active, default_hostgroup, backend) VALUES ('ravi', 'ravi123', 1, 1, 1); -- 加载配置到运行时并持久化 LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK;
2. 适配MySQL 8.0的认证协议
进入MySQL容器,修改ravi用户的认证插件为ProxySQL兼容的mysql_native_password:
-- 修改用户认证方式 ALTER USER 'ravi'@'%' IDENTIFIED WITH mysql_native_password BY 'ravi123'; -- 刷新权限 FLUSH PRIVILEGES;
同时确保ravi用户允许从任意来源连接(包括ProxySQL容器的IP):
GRANT ALL PRIVILEGES ON *.* TO 'ravi'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
3. 验证ProxySQL后端连接状态
在ProxySQL Admin中确认后端MySQL服务器状态正常:
SELECT hostgroup_id, hostname, port, status FROM mysql_servers;
确保主机组ID与mysql_users中default_hostgroup的值一致,且服务器状态为ONLINE。
4. 重新测试外部连接
执行原命令再次测试:
sudo mysql -u ravi -pravi123 -h 0.0.0.0 -P16033 -e "SELECT @@port"
内容的提问来源于stack exchange,提问作者Ravi Srivastava
相关产品推荐
相关产品推荐

