show databases 只显示部分库是因 mysql 8.0+ 默认启用权限可见性机制,仅对用户显式授予 usage 或更高权限的 schema 才可见;库实际存在且可用,可通过 information_schema.schemata 验证。

SHOW DATABASES 只显示部分库,本质是权限可见性控制
不是数据库丢了,也不是元数据损坏,而是 MySQL 8.0+ 默认启用的权限可见性机制在起作用:只有用户对某个 schema 拥有显式授予的权限(哪怕只是 USAGE),该库才会出现在 SHOW DATABASES 结果里。执行 SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'orders'; 能查到,应用也能连上写入,恰恰说明库存在且可用——只是“不可见”。
检查 current_user() 和权限映射是否匹配
常见误区是看 user() 就以为是登录用户,实际生效的是 current_user(),它反映权限系统真正匹配到的账号(含 host 匹配逻辑)。匿名用户 ''@'localhost'、'ODBC'@'localhost' 或 'root'@'127.0.0.1' 都可能悄无声息接管连接,导致权限远低于预期。
- 先运行
SELECT USER(), CURRENT_USER();,对比二者差异 - 若
CURRENT_USER()返回''@'localhost',立刻查SELECT * FROM mysql.user WHERE user = '';,删掉空用户名账户 - 确认 host 是否精确匹配:比如你用
mysql -u root -h 127.0.0.1 -p连,但权限只给了'root'@'localhost',就无法命中
GRANT 权限没给到库级,SHOW DATABASES 就不显示
表级授权(如 GRANT SELECT ON db1.t1 TO 'u'@'%')不会让 db1 出现在 SHOW DATABASES 中;必须至少给库级 USAGE 或更高权限:
-
GRANT USAGE ON db1.* TO 'u'@'%';—— 最小代价让库“可见” -
GRANT SELECT ON db1.* TO 'u'@'%';—— 同时满足可见 + 可查 - 注意:MySQL 8.0+ 不再依赖
mysql.db表做粗粒度过滤,而是实时查information_schema.SCHEMA_PRIVILEGES - 如果启用了
partial_revokes=ON,撤销过部分权限后,原本可见的库也可能消失
服务器配置或云平台主动干预了可见性
某些环境会从外部限制结果集,和用户权限无关:
- 检查是否启动时加了
--skip-show-database:运行SELECT @@skip_show_database;,返回ON即表示启用 - 阿里云 RDS、腾讯云 CDB 等默认隐藏
mysql、performance_schema等系统库,这是平台策略,非 bug - 本地命令行直接输
mysql(没带-u)可能触发 ODBC 默认连接,CURRENT_USER()变成'ODBC'@'localhost',权限极低
最易被忽略的是 CURRENT_USER() 和 host 匹配的静默偏差——它不报错,也不提示,只安静地给你一个权限缩水的会话。











