phpmyadmin 默认显示所有数据库(包括information_schema、mysql、performance_schema、sys)是因为它直接读取mysql的show databases结果,而这些系统库是mysql内置元数据仓库;可通过配置$cfg['servers'][$i]['hide_db'] = '^(information_schema|mysql|performance_schema|sys)$';正则隐藏,需锚定^和$以防误匹配,修改后须重启web服务生效。
为什么 phpmyadmin 会显示所有数据库,包括系统库?
phpmyadmin 默认读取 mysql 的 information_schema、mysql、performance_schema 和 sys 这类信息架构数据库(information schema databases),它们是 mysql 自带的元数据仓库,不存放业务数据,但对权限校验、查询优化等底层功能至关重要。普通用户通常不需要在导航面板里看到它们——不是不能访问,而是干扰视觉、拖慢加载、增加误操作风险。
用 $cfg['Servers'][$i]['hide_db'] 配置项隐藏指定数据库
这是最直接、最稳定的方式,修改 phpMyAdmin 的主配置文件 config.inc.php(通常位于 phpMyAdmin 根目录下)。该配置项支持正则表达式,适合批量隐藏:
/* 在 config.inc.php 的 $cfg['Servers'][$i] 区块内添加或修改 */ $cfg['Servers'][$i]['hide_db'] = '^(information_schema|mysql|performance_schema|sys)$';
- 必须写在
$cfg['Servers'][$i]的大括号范围内,不能放在外面,否则无效 - 正则需用
^和$锚定全名,避免误匹配如my_mysql_backup - 如果只隐藏部分,比如仅去掉
information_schema和sys,就写'^(information_schema|sys)$' - 修改后需重启 Web 服务(如 Apache/Nginx)或至少清空浏览器缓存,phpMyAdmin 不自动热重载此配置
为什么不用 SHOW DATABASES 权限控制来“隐藏”?
有人尝试通过 MySQL 用户权限限制(如撤销 SHOW DATABASES)来让数据库“消失”,但这会导致 phpMyAdmin 导航栏完全空白或报错 #1044 - Access denied for user...。因为 phpMyAdmin 依赖 SHOW DATABASES 获取列表,即使你只想看自己的库,它也需要先执行这个命令再过滤——权限粒度太粗,不是“隐藏”,而是“剥夺入口”。
-
GRANT SELECT ON `myapp\_%`.* TO 'user'@'%';这类通配授权不影响数据库列表显示 - 真正生效的隐藏逻辑只在 phpMyAdmin 层,不在 MySQL 层
- 若服务器共用且多租户,建议配合 MySQL 账户的
SHOW DATABASES权限 + phpMyAdmin 的hide_db双重约束
隐藏后仍能在 SQL 窗口查到这些库,正常吗?
完全正常。hide_db 只影响左侧导航树的渲染,不改变连接用户的实际权限或 MySQL 的可见性。你在 SQL 标签页中仍可执行 SELECT * FROM information_schema.TABLES; 或 USE mysql;。
- 这是设计使然:隐藏是为了减少干扰,不是安全隔离
- 如果需要禁止访问,必须在 MySQL 层用
REVOKE撤销对应库的权限,例如REVOKE ALL ON `mysql`.* FROM 'user'@'%'; - 注意
information_schema无法被REVOKE,它是只读虚拟库,但用户仍不能写入;它的“隐藏”纯属界面优化
$i 索引;生产环境修改前先备份 config.inc.php。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











