可行,但需避开认证插件不兼容和hostgroup脱离MGR状态自动同步两大陷阱:MySQL 8.0默认caching_sha2_password需ProxySQL 2.4+支持,或建用户时显式指定mysql_native_password;hostgroup必须依赖MGR状态自动分组,不可手动插入,且读写分离规则须适配SELECT FOR UPDATE与事务持久性。

MySQL 8.0 + ProxySQL 实现高可用读写分离是可行的,但关键不在于“能不能配通”,而在于绕开两个硬性陷阱:认证插件不兼容、hostgroup 分组脱离 MGR 状态自动同步。踩中任一,就会出现连接被拒或读请求发到只读节点导致 ERROR 1290 (HY000): The MySQL server is running with the --read-only option。
MySQL 8.0 用户必须显式指定 mysql_native_password 或升级 ProxySQL 到 2.4+
MySQL 8.0 默认用 caching_sha2_password,而 ProxySQL 2.3.x 及更早版本完全不识别它——哪怕你把 default_authentication_plugin 设成 mysql_native_password 也没用,ProxySQL 只查用户表里的 plugin 字段。
常见错误现象:Access denied for user 'rw'@'192.168.x.x' (using password: YES),密码完全正确也报错。
- 方案一(快速上线):建用户时强制指定插件:
CREATE USER 'rw'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; - 方案二(长期维护):升级 ProxySQL 至 2.6.3 或 2.7.3,它原生支持
caching_sha2_password,但注意监控用户monitor也得用同种插件,否则mysql-monitor_username登录失败会导致整个mysql_server_group_replication_checker失效 - 切勿在 MySQL 侧执行
ALTER USER ... PASSWORD EXPIRE NEVER后就以为万事大吉——插件没改,ProxySQL 还是连不上
hostgroup 必须靠 MGR 状态自动分组,不能手动 INSERT
手动把所有节点塞进 reader_hostgroup = 30 是最常踩的坑。MGR 集群里只有 PRIMARY 能写,SECONDARY 是只读的,而 ProxySQL 的 mysql_server_group_replication_checker 脚本依赖 sys.gr_member_routing_candidate_status 视图判断角色。跳过它,等于把路由逻辑交给运气。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
正确做法:
- 初始插入全部进
offline_hostgroup = 40:INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(40, '192.168.1.1', 3306); - 执行
LOAD MYSQL SERVERS TO RUNTIME触发自动探测(前提是 MySQL 已安装 SYS schema,且monitor用户有SELECT ON sys.*权限) - 检查结果:
SELECT hostgroup_id, hostname, status FROM mysql_servers;—— 正常应看到 PRIMARY 自动落到writer_hostgroup = 10,SECONDARY 归入reader_hostgroup = 30
读写分离规则要避开 SELECT FOR UPDATE 和隐式事务
ProxySQL 默认按 SQL 前缀(SELECT/INSERT 等)做路由,但 SELECT FOR UPDATE 本质是写操作,发到从库会直接报错;同样,开启事务后第一条是 SELECT,后续 UPDATE 却可能被路由到不同节点,破坏一致性。
解决路径:
- 设置
transaction_persistent = 1(在mysql_users表中),确保同一事务内所有语句走同一个 hostgroup - 为
SELECT FOR UPDATE单独加一条规则,匹配正则^SELECT.*FOR UPDATE$,强制路由到writer_hostgroup - 避免在应用层用
autocommit=0开启长事务,尤其不要跨服务调用——ProxySQL 不感知业务上下文,只认 SQL 文本和事务状态
真正难的不是配置命令敲几行,而是把「MGR 状态 → hostgroup 自动映射」和「事务生命周期 → 路由一致性」这两条链路串稳。一旦其中一环断开,故障表现往往是偶发性的连接失败或数据延迟,日志里却找不到明显报错。

















