$cfg['servers'][$i]['pmadb'] 必须为每台服务器配置唯一数据库名,如 phpmyadmin_server01,避免元数据冲突;初始化 create_tables.sql 前需连接对应服务器并指定目标库,防止表名重复或结构覆盖。
phpmyadmin 的 $cfg['servers'][$i]['pmadb'] 必须每台服务器单独设值
不设或复用同一个 pmadb 名称,会导致所有服务器的高级功能(如关系视图、保存的 sql 查询、用户偏好)写进同一张库,元数据互相覆盖。比如 server a 用户保存的表关系,可能在 server b 的界面里意外出现,甚至被 server b 的操作删掉。
实操建议:
- 为每台服务器生成唯一数据库名,例如
phpmyadmin_server01、phpmyadmin_server22,不要用phpmyadmin这种通用名 - 在对应服务器的配置段中显式声明:
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin_server01';
- 确保该库已存在且 phpMyAdmin 有
CREATE、ALTER、SELECT、INSERT、UPDATE、DELETE权限
初始化 create_tables.sql 时不能跨服务器复用脚本
官方 create_tables.sql 脚本默认建的是无前缀的固定表名(如 pma__bookmark),如果多套 phpMyAdmin 指向不同服务器但共用同一份建表语句,且没改表名前缀,就会在同一个 pmadb 里反复执行,报 Table 'pma__bookmark' already exists 或静默覆盖结构。
实操建议:
- 每次为新服务器初始化
pmadb前,先用mysql命令行连接目标服务器,再执行脚本:mysql -h server01.example.com -u root -p phpmyadmin_server01
- 若需自定义表前缀(如避免和已有表冲突),手动编辑脚本,把所有
`pma__替换为`pma_srv01__,再执行 - 别用 phpMyAdmin 界面里的“导入”功能来跑这个脚本——它不保证连接到目标服务器,容易连错实例
检查 $cfg['Servers'][$i]['controluser'] 是否真能访问对应 pmadb
即使 pmadb 名字不同、表也建好了,如果控制用户(controluser)没有对那个库的权限,phpMyAdmin 启动时不会报错,但高级功能全部失效:关系页空白、导出设置不保存、用户偏好无法持久化。
实操建议:
- 登录对应 MySQL 实例,运行:
SHOW GRANTS FOR 'pma_control'@'%';
确认返回结果包含类似GRANT SELECT, INSERT, UPDATE, DELETE ON `phpmyadmin_server01`.* TO 'pma_control'@'%' - 权限必须精确到库级,不能只给
GRANT ALL ON *.*—— 那样虽然能用,但违背隔离初衷 - 如果用 Docker 或代理层(如 ProxySQL),还要确认
controluser的 host 匹配实际连接来源 IP,不是简单写'%'
PHP 配置中的 $i 索引错位会导致整段配置被忽略
phpMyAdmin 用数组索引 $cfg['Servers'][1]、[2]… 对应不同服务器。如果中间漏掉某个数字(比如只有 [1] 和 [3]),或重复使用同一索引,后续服务器的 pmadb 设置就根本不会加载——页面上可能只显示一台服务器,或者高级功能对某台完全不可见。
实操建议:
- 配置文件里按顺序编号,从
1开始,连续递增,不用跳号 - 检查是否意外注释了某段开头的
$cfg['Servers'][$i] = array(行,导致整个块未被解析 - 加一行临时调试输出:
error_log("Loaded server {$i}: " . ($cfg['Servers'][$i]['pmadb'] ?? 'N/A'), 3, '/var/log/phpmyadmin.log');确认每台都进了日志
配置真正生效的关键,往往卡在「以为设了」和「其实没被读到」之间——尤其是索引断档、controluser 权限范围错配、以及建表时连错了 MySQL 实例这三处,最容易查半天却绕开真正问题。










