phpMyAdmin 本身不支持 MariaDB 集群原生读写分离,因其无连接池、路由逻辑和集群拓扑感知能力,仅能单点连接;所有读写分离需依赖 ProxySQL/MaxScale 等中间件实现。
phpMyAdmin 本身不支持 MariaDB 集群的原生读写分离
phpmyadmin 是一个单实例数据库管理界面,它没有内置的连接池、路由逻辑或集群拓扑感知能力。你配置一个 host,它就只连那个地址——哪怕背后是 proxysql、maxscale 或 galera 集群的 vip,phpmyadmin 也只会把它当单点用,不会自动分发读请求到从节点、写请求到主节点。
常见错误现象:
• 在 phpMyAdmin 里执行 SELECT @@hostname 总返回同一个节点名
• 手动在多个节点上开事务后,phpMyAdmin 切换连接时状态丢失(比如未提交事务突然不可见)
• 配置了多个 $cfg['Servers'][$i]['host'],但 phpMyAdmin 只用最后一个生效
实操建议:
• 不要指望 phpMyAdmin 自动做负载均衡或读写分离
• 如果必须通过 phpMyAdmin 管理集群,优先接入一个「稳定中控节点」(如 MaxScale 的 readwritesplit 服务端口,或 ProxySQL 的 mysql://user@proxy:6033)
• 禁用 phpMyAdmin 的 $cfg['Server']['DisableIS'] = true,避免因 information_schema 查询跨节点不一致引发元数据错乱
真正起作用的是中间件层:ProxySQL / MaxScale / HAProxy
phpMyAdmin 的连接行为完全取决于你填进 $cfg['Servers'][$i]['host'] 和 $cfg['Servers'][$i]['port'] 的值。如果这个地址指向的是中间件,那读写分离和负载策略才由中间件决定;如果直连某个 MariaDB 节点 IP,则所有流量都落在该节点上。
使用场景:
• ProxySQL:监听 6033(MySQL 协议),配置 mysql_users + mysql_query_rules 实现语句级路由
• MaxScale:启用 readwritesplit 监听器,phpMyAdmin 连 4006 即可
• HAProxy:仅做 TCP 层轮询(无读写识别),适合只读集群管理,不适合混合负载
立即学习“PHP免费学习笔记(深入)”;
参数差异与影响:
• ProxySQL 的 mirror_hostgroup 对 phpMyAdmin 无效(它不发 /*+ MAXSCALE */ 注释)
• MaxScale 要求客户端连接时带 user@host 格式用户名,否则可能被拒绝
• 所有中间件都需确保 phpMyAdmin 使用的 MySQL 用户在所有后端节点存在且权限一致,否则 Access denied for user 错误会随机出现
Galera 集群下 phpMyAdmin 的写入风险点
Galera 是同步复制,但 phpMyAdmin 的 UI 操作(如表结构变更、大批量导入)容易触发长事务或锁表,进而拖慢整个集群的 wsrep_local_state_comment 同步进度,导致节点间短暂失联甚至被踢出集群。
容易踩的坑:
• 在 phpMyAdmin 中点击「操作 → 优化表」→ 触发 OPTIMIZE TABLE,在 Galera 中等价于 ALTER TABLE ... ENGINE=InnoDB,会全表重建并阻塞写入
• 导入大 SQL 文件时未勾选「部分导入」或未设 max_allowed_packet,导致连接中断后事务残留
• 使用 SET autocommit=0 手动开启事务后忘记提交,在 phpMyAdmin 的多标签页间切换时容易误以为已提交
实操建议:
• 对 Galera 集群,禁用 phpMyAdmin 的「快速插入」和「自动提交」开关($cfg['InsertRows'] = false)
• 大批量操作前,在目标节点执行 SET wsrep_causal_reads=ON,防止读取到过期快照
• 检查 SHOW STATUS LIKE 'wsrep%' | grep -E '(ready|state|conflicts)',确认集群健康再操作
配置 phpMyAdmin 连接中间件的真实示例
以下是最简可用的 config.inc.php 片段,假设你已部署好 ProxySQL 并监听 192.168.10.100:6033:
$cfg['Servers'][$i]['host'] = '192.168.10.100'; $cfg['Servers'][$i]['port'] = '6033'; $cfg['Servers'][$i]['user'] = 'monitor'; $cfg['Servers'][$i]['password'] = 'p@ssw0rd'; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['ssl'] = false; // 关键:关闭持久连接,避免中间件连接复用混乱 $cfg['Servers'][$i]['connect_type'] = 'tcp';
注意:
• 不要设置 $cfg['Servers'][$i]['socket'],TCP 连接才能穿透中间件
• $cfg['Servers'][$i]['AllowRoot'] = false 必须为 false,ProxySQL 默认不允许 root 登录
• 若中间件启用了 TLS,需同步开启 $cfg['Servers'][$i]['ssl'] = true 并配置 CA 路径
复杂点在于:phpMyAdmin 的「服务器选择」下拉菜单只是切换配置项,不是动态代理。你看到的每个「服务器」都对应一个静态连接目标。想切到另一个中间件实例?得手动改配置、重载 phpMyAdmin —— 它不是集群控制台,只是一个前端外壳。



















