SHOW DATABASES仅显示当前用户有权限访问的数据库;权限不足时只显示系统库或为空,需用root账号、检查show_grants、skip_show_database配置及information_schema.SCHEMATA查询补全。

直接执行 SHOW DATABASES 查看当前用户有权限的数据库
MySQL 不允许普通用户看到所有数据库,SHOW DATABASES 返回的是当前登录用户具备 USAGE 或更高权限(如 SELECT、CREATE 等)的数据库列表。如果你只看到 information_schema、performance_schema、sys 这几个系统库,大概率是权限不足。
- 用 root 或高权限账号登录后执行:
SHOW DATABASES; - 想过滤掉系统库,加
WHERE条件(MySQL 8.0+ 支持):SHOW DATABASES WHERE `Database` NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql'); - 注意:MySQL 5.7 及更早版本不支持
SHOW DATABASES ... WHERE,只能靠客户端过滤或查information_schema.SCHEMATA
用 SELECT SCHEMA_NAME FROM information_schema.SCHEMATA 获取更完整的库名列表
这个方式绕过部分权限限制(只要对 information_schema 有读权限就能查),但依然受 show_database_priv 全局变量影响。如果 MySQL 配置了 skip-show-database,即使有权限也看不到其他用户的库。
- 执行:
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA; - 可加条件排除系统库:
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql'); - 注意:
information_schema中的SCHEMATA表不包含数据库的字符集或排序规则等元数据,需要额外查SCHEMA_DEFAULT_CHARACTER_SET_NAME字段
检查是否被 skip-show-database 限制
这个启动参数会让 MySQL 忽略 SHOW DATABASES 命令的输出(除自己创建的库外),属于服务器级安全策略,客户端无法绕过。
- 登录后执行:
SHOW VARIABLES LIKE 'skip_show_database';—— 如果返回ON,说明该限制已启用 - 确认方法:用非 root 用户登录,执行
SHOW DATABASES;,只看到自己创建的库或空结果,就是它在起作用 - 修改需重启 MySQL,并在配置文件中移除或注释
skip-show-database行
权限不足时,SHOW DATABASES 不报错但结果为空或极简
这是最容易让人困惑的一点:命令执行成功、没报错、也没提示“权限拒绝”,但结果只有系统库甚至一个都没有。这不是 bug,是 MySQL 的默认行为设计。
- 验证权限:执行
SHOW GRANTS;,检查输出里是否有类似GRANT USAGE ON *.* TO 'xxx'@'%'—— 这种最低权限只能看到系统库 - 真正能列出业务库的最小权限组合是:
SELECT或CREATE权限在某个具体数据库上,或者全局SHOW DATABASES权限 - 别依赖错误信息判断——没报错 ≠ 有权限;得看结果是否符合预期
实际查库时,先确认身份和权限,再选命令;SHOW DATABASES 简洁但受限多,information_schema.SCHEMATA 更可控但要小心字段含义和兼容性。跳过权限检查直接查表,反而容易漏掉关键限制点。











