<p>SHOW TABLES返回空或报错主因是用户缺失库级USAGE权限,必须显式执行GRANT USAGE ON xxx.* TO 'user'@'host'才能USE该库并查看表;仅授SELECT权限不足。</p>

SHOW TABLES 返回空或报错:库存在但看不见表
这不是表丢了,而是用户没被授予对这个库的 USAGE 权限——MySQL 要求用户至少有 USAGE(连接权)才能 USE 到该库,否则 SHOW TABLES 会返回空,甚至直接报 ERROR 1044 (42000): Access denied for user ... to database 'xxx'。
执行 SHOW GRANTS FOR 'user'@'host';,检查输出里是否含 GRANT USAGE ON `xxx`.* 这一行。没有?说明库级权限根本没生效。
- 只执行了
GRANT SELECT ON xxx.* TO 'user'@'host';不够,USAGE 是隐式前提,必须显式存在或由 GRANT ALL 自动包含 - 若用的是
GRANT SELECT ON *.*,它不覆盖库级 USAGE,USE xxx仍会被拒 - 修复命令:
GRANT USAGE ON `xxx`.* TO 'user'@'host'; FLUSH PRIVILEGES;
DESCRIBE 或 SHOW CREATE TABLE 失败:权限粒度不够细
能 SHOW TABLES 不代表能看结构。MySQL 对表结构元数据的访问,实际校验的是 SELECT 权限 + SHOW VIEW(如果表是视图)+ 对 information_schema 的隐式读取能力。
常见现象:SELECT * FROM t1 成功,但 DESCRIBE t1 报 Access denied;或者 SHOW CREATE TABLE t1 直接拒绝。
- 确认用户有
SELECT权限到该表(不是只到库):GRANT SELECT ON `xxx`.`t1` TO 'user'@'host'; - 如果是视图,额外需要
SHOW VIEW:GRANT SHOW VIEW ON `xxx`.`v1` TO 'user'@'host'; - MySQL 8.0+ 默认禁止普通用户查
information_schema全字段,DESCRIBE内部依赖它;若禁用了INFORMATION_SCHEMA访问,会静默失败
USE 库后仍查不到表:host 匹配失败或账户状态异常
执行 USE xxx; 成功,但 SHOW TABLES; 为空,大概率是登录时匹配的账号和授权对象不一致。
比如你用 mysql -h 192.168.1.100 -u user -p 连,MySQL 实际认证的是 'user'@'192.168.1.100',而你只给 'user'@'%' 授了权——这两条记录在 mysql.user 表里是完全独立的。
- 查真实匹配项:
SELECT User, Host FROM mysql.user WHERE User = 'user'; - 确认返回的
Host值和你登录时的 host 字面量(IP 或域名)严格一致 - 同时检查账户状态:
SELECT account_locked, password_expired FROM mysql.user WHERE User = 'user' AND Host = '...';,锁定或过期会导致权限失效
表名大小写或反引号问题:Linux 下容易忽略的硬约束
在 Linux 系统上,MySQL 默认区分表名大小写(取决于 lower_case_table_names 配置),而 SHOW TABLES 和 DESCRIBE 都受其影响。
比如建表用的是 CREATE TABLE MyTable,但你查 describe mytable; 就会失败——因为文件系统里存的是 MyTable.frm,而 MySQL 按字面量去磁盘找 mytable.frm。
- 执行
SHOW VARIABLES LIKE 'lower_case_table_names';,值为 0 表示区分大小写 - 表名含保留字(如
order、group)、连字符或空格时,DESCRIBE必须加反引号:DESCRIBE `order`; - 不确定大小写时,先用
SHOW TABLES;看准确名称,再原样复制使用
权限没“落到库上”比没给权限更难排查——因为 GRANT 语句执行成功了,SHOW GRANTS 看起来也全,但只要 Host 字段不匹配、USAGE 缺失、或大小写碰上 Linux 文件系统,DESCRIBE 就会一声不响地失败。


















