show databases 默认漏掉无权限访问的库(如mysql、sys等)及损坏/权限异常的库;information_schema因虚拟性不显示属设计使然,非权限问题。

show databases 会漏掉哪些库
默认情况下 SHOW DATABASES 只显示当前用户有访问权限的数据库,不是“物理上存在的所有库”。比如 mysql 系统库如果用户没被授权 SELECT 或 USAGE 权限,就不会出现在结果里;同样,以 information_schema、performance_schema、sys 开头的系统库,也可能因权限或版本限制被过滤。
常见错误现象:SHOW DATABASES 返回空或只有 1–2 个库,但你知道实例里肯定不止这些。
- 用
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA绕过权限过滤(需有INFORMATION_SCHEMA查询权) - 确认用户权限:执行
SHOW GRANTS FOR CURRENT_USER(),检查是否含ALL PRIVILEGES ON *.*或至少SELECTonINFORMATION_SCHEMA - MySQL 8.0+ 默认隐藏
sys库,除非显式授权;performance_schema在某些只读实例中可能不可见
为什么 root 登录也看不到 information_schema
这不是权限问题,而是 MySQL 的硬性设计:information_schema 是虚拟库,不存于磁盘,由服务器运行时动态生成。它不会出现在 datadir 目录下,也不能被 DROP DATABASE 删除。但它的可见性受 skip_show_database 配置或账户的 SHOW DATABASES 权限控制。
使用场景:排查库是否存在、写自动化脚本前确认元数据入口。
- 若
SHOW DATABASES不返回information_schema,先检查 my.cnf 是否设置了skip_show_database=ON - 连接时加
--force参数不会影响该行为,它只作用于客户端错误处理 - 真正可靠的方式是直查:
SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'information_schema'
SHOW DATABASES 的性能和并发影响
这个命令本身极轻量,不锁表、不扫描数据文件,只是读取内存中的数据库目录缓存(mysql/db.frm 或数据字典表)。但在高并发元数据操作场景下,频繁执行仍可能触发短暂的 MDL(metadata lock)争用。
参数差异:无参数;不支持 LIMIT、WHERE 或排序子句,想过滤得靠客户端处理。
- 避免在循环脚本里每秒执行多次 —— 改用缓存结果 + 定期刷新
- MySQL 5.7 使用文件系统目录枚举,8.0+ 全部走数据字典,因此后者在大量数据库(>1k)时响应更稳定
- 注意:若 datadir 下存在损坏或权限异常的子目录,
SHOW DATABASES可能报错或跳过该库(错误如Can't read dir of './xxx/' (errno: 13))
替代方案:用 mysqlshow 命令行工具
mysqlshow 是 MySQL 自带的 shell 工具,本质是封装了 SHOW DATABASES,但它对权限失败更宽容,且支持简单过滤。
性能 / 兼容性影响:比纯 SQL 多一次进程启动开销,但胜在可直接在 bash 中管道处理。
- 列出所有库(含权限不足但目录存在的):
mysqlshow -u root -p --count - 过滤特定前缀:
mysqlshow -u root -p 'test%'(注意单引号防 shell 展开) - 它不依赖当前连接的默认库,也不受
USE db影响,适合写监控脚本
容易被忽略的地方:很多 DBA 习惯只用 SQL,却忘了 mysqlshow 能绕过部分权限校验逻辑,尤其在跨版本迁移或容器化部署中,它的输出更贴近文件系统真实状态。











