无SHOW DATABASES权限时执行SHOW DATABASES返回空结果或ERROR 1044,因MySQL隐藏除information_schema等系统库外的所有库名;该权限为全局权限,须用GRANT SHOW DATABASES ON .授予,不依赖SELECT on mysql.db,且仅控制库名可见性。

MySQL 用户没有 SHOW DATABASES 权限时的现象
登录 MySQL 后执行 SHOW DATABASES;,返回空结果或报错 ERROR 1044 (42000): Access denied for user 'xxx'@'%' to database ''。这不是数据库为空,而是权限缺失导致 MySQL 隐藏了除 information_schema、performance_schema、sys(以及可能的 mysql)之外的所有库名。
授予 SHOW DATABASES 权限的正确方式
该权限属于全局权限,必须用 GRANT ... ON *.* 语法授予,不能限定到某个库或表。它不依赖于其他权限,但需注意账户是否已存在、是否需要刷新权限缓存:
- 若用户已存在:执行
GRANT SHOW DATABASES ON *.* TO 'username'@'host'; - 若用户不存在且需同时创建:用
CREATE USER 'username'@'host' IDENTIFIED BY 'password';+GRANT SHOW DATABASES ON *.* TO 'username'@'host'; - 授予权限后必须执行
FLUSH PRIVILEGES;(仅当直接修改mysql.user表时才强制需要;通过GRANT语句通常自动生效,但部分旧版本或特殊部署下建议显式刷新)
SHOW DATABASES 权限和 SELECT on mysql.db 的区别
有人误以为给用户 SELECT 权限在 mysql.db 表上就能看到库列表,这是错误的。MySQL 的 SHOW DATABASES 行为由全局权限控制,与底层系统表访问权限无关。即使你给了 SELECT 权限在 mysql.db 上,用户仍无法执行 SHOW DATABASES,除非明确授予 SHOW DATABASES 权限。
另外注意:SHOW DATABASES 权限不会让用户看到所有数据库的内容——它只影响“列出库名”这一动作。查看某库下的表、读取数据等,仍需对应库/表级的 SELECT 或其他权限。
安全考虑:为什么默认禁用 SHOW DATABASES?
MySQL 8.0+ 默认启用 show_compatibility_56=OFF,且从 5.7 开始就将 SHOW DATABASES 设为独立权限项,目的就是限制信息泄露。比如多租户环境里,你不希望用户 A 知道还有库叫 tenant_b_production。所以即使只是“只读账号”,也应按需授予该权限,而不是当作基础权限一并下发。
容易被忽略的一点是:如果用户拥有任意一个数据库的 CREATE、DROP、ALTER 等权限,MySQL 会隐式允许其看到该库名(哪怕没 SHOW DATABASES)。但这种“间接可见”不稳定、不可控,不应作为替代方案。


















