phpMyAdmin 不原生支持 TiDB,需通过禁用 information_schema 探测、强制 cookie 认证、配置 HAProxy 统一入口、调整超时与权限等手段绕过协议层限制方可使用。

phpMyAdmin 本身不支持 TiDB,必须绕过协议层限制
phpMyAdmin 是为 MySQL 协议深度定制的工具,而 TiDB 虽然兼容 MySQL 协议,但存在关键差异:它不支持 SHOW VARIABLES LIKE 'version_comment' 这类 phpMyAdmin 启动时必查的元信息语句;TiDB 的 caching_sha2_password 认证插件行为与 MySQL 8.0 不完全一致;且 TiDB 默认禁用 information_schema.PROCESSLIST(phpMyAdmin 的“进程列表”功能依赖它)。直接填入 TiDB 地址会卡在登录页或报错 #1105 - unknown error: Unknown type: 247。
可行路径只有一条:把 TiDB 当作“黑盒 MySQL 兼容端”来用,关闭所有 phpMyAdmin 对 TiDB 不友好的探测逻辑。核心操作包括:
- 在
config.inc.php中为 TiDB 实例显式设置$cfg['Servers'][$i]['DisableIS'] = true;,跳过information_schema探测 - 禁用状态监控:添加
$cfg['Servers'][$i]['ShowDatabasesCommand'] = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'METRICS_SCHEMA');";(TiDB 有METRICS_SCHEMA) - 认证方式强制用
cookie,避免config模式下密码硬编码暴露风险 - 确保 TiDB 用户已授权:
GRANT ALL PRIVILEGES ON *.* TO 'pma_user'@'%' IDENTIFIED BY 'xxx'; FLUSH PRIVILEGES;
MySQL 集群节点必须通过 HAProxy 统一入口接入
phpMyAdmin 无法原生识别 MySQL 主从、MGR 或 InnoDB Cluster 的拓扑结构。你不能在配置里写一堆 192.168.10.10、192.168.10.11 然后指望它自动负载均衡或故障转移——它只会随机连其中一个,且连接失败就报 #2002。
正确做法是前置一层 HAProxy,并让 phpMyAdmin 只连 HAProxy 的 VIP 或域名:
立即学习“PHP免费学习笔记(深入)”;
- HAProxy backend 必须启用
option mysql-check user haproxy_check,不能用tcp-check;否则后端 MySQL 宕机时 phpMyAdmin 仍会尝试连接并超时 - phpMyAdmin 配置中删掉
$cfg['Servers'][$i]['socket'],只保留host和port(指向 HAProxy 监听地址) - MySQL 后端节点的
bind-address必须设为0.0.0.0或 HAProxy 内网 IP,否则健康检查直连失败 - 为每个 MySQL 节点创建专用健康检查用户:
CREATE USER 'haproxy_check'@'192.168.10.20' IDENTIFIED BY 'check123'; GRANT USAGE ON *.* TO 'haproxy_check'@'192.168.10.20';
多服务器配置必须索引从 1 开始且连续递增
常见错误是手写 $i = 0; $i++; 或在条件块里定义服务器,导致 $cfg['Servers'][1] 覆盖 [2],最终登录页只显示一个下拉项,甚至白屏。phpMyAdmin 解析配置时严格按数组键顺序读取,跳号或重复键都会中断后续加载。
安全写法是用固定数组 + for 循环(参考官方 examples/config.manyhosts.inc.php):
$hosts = [
1 => ['host' => 'haproxy-mysql.internal', 'port' => '3306', 'user' => 'root', 'password' => ''],
2 => ['host' => 'tidb-gateway.internal', 'port' => '4000', 'user' => 'pma_user', 'password' => 'xxx'],
];
foreach ($hosts as $i => $h) {
$cfg['Servers'][$i]['host'] = $h['host'];
$cfg['Servers'][$i]['port'] = $h['port'];
$cfg['Servers'][$i]['user'] = $h['user'];
$cfg['Servers'][$i]['password'] = $h['password'];
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['DisableIS'] = ($i === 2); // 仅 TiDB 关闭 IS 探测
}注意:索引必须是整数,不能是字符串 'tidb' 或从 0 开始;$cfg['Servers'][$i]['extension'] 必须是 mysqli,mysql 已废弃,pdo 需额外启用且不稳定。
连接速度慢和权限错位是高频隐性问题
即使配置全对,你仍可能遇到“能登录但列表加载极慢”或“数据库名显示为空”。这不是 phpMyAdmin bug,而是后端响应策略差异导致的:
- TiDB 的
SHOW DATABASES响应比 MySQL 慢 3–5 倍,phpMyAdmin 默认 30 秒超时,建议在config.inc.php加$cfg['ExecTimeLimit'] = 60; - MySQL 集群节点若用
localhost作为 host 创建用户(如'root'@'localhost'),HAProxy 来源 IP 是内网地址,权限不匹配——必须用'root'@'192.168.10.%'或通配符 - TiDB 默认关闭
performance_schema,phpMyAdmin 的“状态”页部分指标缺失属正常,不必强行开启 - 所有 MySQL 节点的
max_allowed_packet建议统一设为64M,否则导入大 SQL 时在某个节点上失败,而 phpMyAdmin 不提示具体是哪个节点
最易被忽略的一点:phpMyAdmin 的 cookie 认证模式下,切换服务器时浏览器不会自动清空旧 session cookie,可能复用前一个服务器的凭证导致权限拒绝——必须手动点击右上角“退出”,再选新服务器重登录。



















