phpMyAdmin 默认显示 information_schema 是因 MySQL 所有用户默认可访问该只读元数据库,即使无显式授权;需通过配置 $cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|sys)$'; 正则隐藏。

为什么 phpMyAdmin 默认显示 information_schema?
phpMyAdmin 会自动列出所有用户有权限访问的数据库,而 MySQL 的 information_schema 是只读系统库,用于元数据查询。即使你没显式授权,只要登录账户有 USAGE 权限(几乎所有账户都有),它就会出现在数据库列表里。这不是 bug,是设计行为。
隐藏 information_schema 的两种有效方式
直接修改 phpMyAdmin 配置是最稳妥的做法,不依赖用户权限调整:
- 编辑 phpMyAdmin 的主配置文件
config.inc.php(通常在安装根目录下) - 在
$cfg['Servers'][$i]['hide_db']配置项中加入正则表达式,例如:$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|sys)$';
- 这个正则会同时隐藏四个常见系统库;注意必须用
^和$锚定,否则可能误匹配用户库名(比如叫my_information_schema_backup的库也会被隐藏)
另一种方式是通过 MySQL 用户权限控制:撤销该用户对 information_schema 的任何显式权限(虽然它本就不该被授予权限),但效果有限——只要用户能连接,phpMyAdmin 仍可能列出它,因为它是“可见但不可操作”的状态。
为什么不能靠 SQL 或 phpMyAdmin 界面设置来隐藏?
- phpMyAdmin 没有提供 Web 界面开关来隐藏特定库,
hide_db 是唯一生效的配置项
- 在 SQL 标签页执行
DROP DATABASE information_schema 或 REVOKE 命令会报错:ERROR 1044 (42000): Access denied for user ... to database 'information_schema'
- 尝试用
SET SESSION sql_mode 或其他运行时变量也完全无效,这属于 phpMyAdmin 渲染逻辑层的控制,不在 SQL 层
改完配置后不生效?检查这几个点
- 确认修改的是正在使用的
config.inc.php(有些部署有多个配置文件,如 config.sample.inc.php 是模板,不会生效)
- 检查
$i 索引是否对应你当前使用的服务器配置(多服务器环境下,$cfg['Servers'][1] 和 [0] 容易搞混)
- 浏览器缓存可能导致界面没刷新,强制硬刷新(
Ctrl+Shift+R)或清空 cookie
- 如果使用 Nginx + PHP-FPM,修改配置后无需重启服务,但若启用了 OPcache 且缓存了配置文件,可能需要执行
sudo systemctl restart php*-fpm
hide_db 是唯一生效的配置项DROP DATABASE information_schema 或 REVOKE 命令会报错:ERROR 1044 (42000): Access denied for user ... to database 'information_schema'
SET SESSION sql_mode 或其他运行时变量也完全无效,这属于 phpMyAdmin 渲染逻辑层的控制,不在 SQL 层- 确认修改的是正在使用的
config.inc.php(有些部署有多个配置文件,如config.sample.inc.php是模板,不会生效) - 检查
$i索引是否对应你当前使用的服务器配置(多服务器环境下,$cfg['Servers'][1]和[0]容易搞混) - 浏览器缓存可能导致界面没刷新,强制硬刷新(
Ctrl+Shift+R)或清空 cookie - 如果使用 Nginx + PHP-FPM,修改配置后无需重启服务,但若启用了 OPcache 且缓存了配置文件,可能需要执行
sudo systemctl restart php*-fpm
真正起作用的只有 hide_db 正则匹配这一条路径,其他绕弯子的方法要么无效,要么带来权限混乱。系统库本身不能删、不能关、也不能靠权限收窄彻底消失——得靠 phpMyAdmin 主动过滤。
立即学习“PHP免费学习笔记(深入)”;



















