ProxySQL + MySQL 8.0 读写分离必须显式配置 mysql_native_password 插件并依赖 mysql_server_group_replication_checker 自动分组 hostgroup,否则 5 分钟内暴露连通性或路由错位;需为 rw/monitor 用户指定该插件、授予 sys.SELECT 权限、启用 transaction_persistent=1,并为 SELECT FOR UPDATE 添加强制路由规则。

ProxySQL + MySQL 8.0 读写分离能快速搭起来,但不能跳过认证插件适配和 hostgroup 自动分组这两步,否则连通性或路由错位会在 5 分钟内暴露。
MySQL 8.0 用户必须显式指定 mysql_native_password 插件
ProxySQL 2.3.x(包括主流的 2.6.3)不支持 caching_sha2_password,哪怕密码正确,也会报 Access denied for user 'rw'@'192.168.x.x' (using password: YES)。
- 创建应用用户时必须带
IDENTIFIED WITH mysql_native_password:CREATE USER 'rw'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; - 监控用户同理:
CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monpass'; - 别改
default_authentication_plugin——ProxySQL不读这个变量,只查mysql.user.plugin字段 - 若已用
caching_sha2_password创建了用户,可在线切换:ALTER USER 'rw'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
hostgroup 必须靠 mysql_server_group_replication_checker 自动同步
手动把节点全塞进 reader_hostgroup = 30 是最常见错误,会导致写请求打到只读节点,触发 ERROR 1290 (HY000): The MySQL server is running with the --read-only option。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 初始只往
offline_hostgroup = 40插入:INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (40, '192.168.1.1', 3306); - 执行
LOAD MYSQL SERVERS TO RUNTIME触发自动探测 - 确认
MySQL已启用SYSschema(8.0 默认自带),且monitor用户有权限:GRANT SELECT ON sys.* TO 'monitor'@'%'; - 检查结果:
SELECT hostgroup_id, hostname, status FROM mysql_servers;—— 正常应看到 PRIMARY 落入writer_hostgroup = 10,SECONDARY 自动归入reader_hostgroup = 30
读写规则要覆盖 SELECT FOR UPDATE 和隐式事务
默认按语句前缀路由(如 SELECT → 读组)在事务场景下会失效。SELECT FOR UPDATE 实际是写上下文,若走读组,会卡死或返回脏数据。
- 必须加一条强制规则,把
SELECT.*FOR UPDATE显式路由到写组:INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FOR UPDATE$', 10, 1); - 开启事务持久化:
SET mysql-users.transaction_persistent=1;,避免事务中后续SELECT被错误分流 - 对延迟敏感的读(如登录态校验),建议用
/*+ USE_MASTER */注释强制走主库,而不是依赖规则匹配
mysql_server_group_replication_checker 的运行依赖 sys.gr_member_routing_candidate_status 视图,这个视图在 MGR 集群里才存在;如果是传统主从,得换用 replication_lag 检测 + 手动维护 status 字段,逻辑更重、容错更低。

















