在运维和开发工作中,我们经常通过客户端或程序驱动连到某个MySQL实例上的特定数据库。当业务涉及跨库关联、数据同步或表结构对比时,就需要知道同一个实例下其他数据库的表清单。MySQL本身并不限制你查看实例内任意库的表名,只要账号有权限,就可以在已建立的连接上直接获取。

使用SHOW TABLES FROM直接列出目标库的表
最简单直观的办法是SHOW TABLES FROM语句。它的语法非常短,不需要去记元数据表字段,适合在命令行里快速敲一条看看结果。你当前连接可能在test库,但加上FROM子句就能看db_order库里有哪些表。
这条语句的返回结果只有一列,默认列名是Tables_in_目标库名。如果你连的账号没有目标库的任意权限,MySQL会报Access denied错误,所以使用前要确认账号被授予了至少USAGE级别或具体的SELECT权限。在程序里调用时,不同语言驱动都能直接执行这个SQL并取回结果集。
下面给出一个在MySQL命令行或任意SQL客户端执行的示例,查看db_log库的表列表:
-- 查看 db_log 数据库中的全部表 SHOW TABLES FROM db_log; -- 如果当前库名包含特殊字符,可以用反引号包裹 SHOW TABLES FROM `db-log`;
这种写法的优势是简单,不需要了解系统库结构。缺点也很明显:它只能拿到表名,拿不到表引擎、创建时间、数据行数等扩展信息;而且一次只能看一个库,要批量看多个库就得拼多条SQL。
查询information_schema.TABLES获取跨库表信息
MySQL把整个实例的库、表、列等元数据都放在一个名为information_schema的系统数据库里。其中的TABLES表每一行代表一个表,字段TABLE_SCHEMA是库名,TABLE_NAME是表名,还有ENGINE、TABLE_ROWS、CREATE_TIME等。通过SELECT这张表,你可以在一条SQL里过滤任意库,并同时取出多种属性。
相比SHOW TABLES,查元数据表的方式更灵活。例如你想列出db_a和db_b两个库的所有表,并按库名和表名排序,只要写WHERE TABLE_SCHEMA IN ('db_a','db_b')即可。还可以加TABLE_ROWS > 0这样的条件,只关心有数据的表。对做容量评估或找空表来说非常方便。
权限方面,访问information_schema通常只需要账号有全局的SELECT或USAGE,部分托管环境可能限制访问,这时就会查不到行。下面示例展示如何同时看多个库的表及引擎:
-- 查看多个数据库的表名和存储引擎
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA IN ('db_order', 'db_user')
ORDER BY TABLE_SCHEMA, TABLE_NAME;
-- 只列出某个库里以 log_ 开头的表
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_log'
AND TABLE_NAME LIKE 'log_%';
在代码里使用这种方式时,注意TABLE_SCHEMA和TABLE_NAME都是字符串,要用引号包起来。若库名来自用户输入,务必做白名单校验或用参数化查询,避免SQL注入。因为information_schema是只读的,不会对业务数据造成修改风险。
在应用程序中批量获取其他库的表列表
实际项目里,我们常在Java、Python或PHP程序里连上一个库后,需要动态发现同实例其他库的表,用来做自动报表或跨库校验。此时用information_schema更合适,因为可以用一层循环处理多个库,而不必在应用层多次切换连接。
以Python为例,使用pymysql连上实例后,执行一条带参数的查询,把结果转成字典列表。这样后续代码可以直接按库名分组。注意连接串里如果指定了database,也不影响你查别的库,因为information_schema是全局的。
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
user='app_user',
password='secret',
database='test',
charset='utf8mb4'
)
cur = conn.cursor(pymysql.cursors.DictCursor)
sql = """
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA IN (%s, %s)
"""
cur.execute(sql, ('db_order', 'db_user'))
rows = cur.fetchall()
for r in rows:
print(r['TABLE_SCHEMA'], r['TABLE_NAME'], r['ENGINE'])
cur.close()
conn.close()
如果采用SHOW TABLES FROM方式,在程序里就要对每个目标库单独发一次命令,代码上多了循环调用。对于只有两三个库的场景差别不大,但库数量多时就明显看出查元数据表更省事。另外,有些ORM框架提供了反射API,底层也是走information_schema,理解原理有助于你判断框架查询为什么慢。
最后提醒,不论用哪种方法,都不要在生产账号上开放过多权限。可以给专门用于巡检的账号只授information_schema的读权限,既满足查看表列表的需求,又避免误改业务库。这样在连接到一个MySQL数据库时,查看其他MySQL数据库的表列表就成为安全、可控的常规操作。
MySQLinformation_schemaSHOW_TABLES修改时间:2026-08-18 04:22:13