如何在 Linux 上通过命令行列出 MySQL 数据库
从命令行列出所有 MySQL 数据库只需一条 SQL 语句 — SHOW DATABASES; — 在使用 mysql 客户端完成 MySQL 服务器身份验证后执行即可。此方法适用于任何运行 MySQL 5.7、MySQL 8.x 或兼容 MariaDB 服务器的 Linux 发行版,需要具备 SHOW DATABASES 权限或超级用户访问权限。
本指南不仅涵盖基本命令,还介绍了身份验证选项、权限范围可见性、非交互式脚本模式、性能模式过滤,以及即使是经验丰富的管理员也容易遇到的常见故障。
前提条件
在继续之前,请确认以下事项:
- MySQL Server 或 MariaDB 已安装且服务处于运行状态。
- 您拥有至少具备
SHOW DATABASES权限的用户账户,或以root身份进行身份验证。 mysql客户端二进制文件在您的 Shell 的PATH中可用(使用which mysql验证)。
如果您正在管理远程服务器 — 例如 VPS 托管环境 — 还需确保 MySQL 端口(默认 3306)可访问,或通过 SSH 进行连接。
第一步:验证 MySQL 服务是否正在运行
在尝试连接之前,确认守护进程处于活动状态:
sudo systemctl status mysql对于 MariaDB 安装,服务名称有所不同:
sudo systemctl status mariadb如果服务已停止,请启动它:
sudo systemctl start mysql启动失败的原因几乎总能在 journalctl -xe 或 /var/log/mysql/error.log 中找到。在假设存在配置问题之前,请先检查这些文件。
第二步:向 MySQL 服务器进行身份验证
标准交互式登录
mysql -u root -p-u root— 指定 MySQL 用户名。将root替换为任何有效账户。-p— 以交互方式提示输入密码。在生产环境中切勿直接在命令行传递密码(例如-pMyPassword),因为它会在进程列表和 Shell 历史记录中可见。
输入正确密码后,MySQL 提示符将出现:
mysql>连接到远程主机或非默认端口
mysql -u root -p -h 192.168.1.100 -P 3307-h— 指定远程主机 IP 或主机名。-P— 指定非默认端口号。
使用选项文件进行自动化
对于脚本和定时任务,将凭据存储在受保护的选项文件中,而不是将其嵌入命令中:
# ~/.my.cnf
[client]
user=root
password=YourSecurePassword创建文件后立即限制权限:
chmod 600 ~/.my.cnf有了此文件,mysql 无需任何标志即可完成身份验证:
mysql第三步:列出所有数据库
进入 MySQL Shell 后,运行:
SHOW DATABASES;在全新安装的 MySQL 8 实例上的示例输出:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)每个标准 MySQL 安装都包含以下四个系统模式:
| 模式 | 用途 |
|---|---|
| — | — |
| `information_schema` | 只读虚拟模式,公开所有其他模式、表、列和权限的元数据 |
| `mysql` | 核心授权表、时区数据和服务器配置 |
| `performance_schema` | 用于查询分析和诊断的底层检测数据 |
| `sys` | 基于 `performance_schema` 构建的人类可读视图 |
用户创建的数据库与这些系统模式一同显示。
第四步:筛选数据库列表
按名称模式筛选
SHOW DATABASES 接受 LIKE 子句,当服务器托管数十个数据库时非常有用:
SHOW DATABASES LIKE 'wp_%';这将只返回名称以 wp_ 开头的数据库 — 这是 WordPress 安装的常见命名约定。
查询 information_schema 进行高级筛选
如需更精确的筛选,可直接查询 information_schema.SCHEMATA 表:
SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY schema_name;此方法允许您按字符集、排序规则或任何其他元数据列进行筛选 — 这是 SHOW DATABASES 无法实现的。
第五步:检查特定数据库
要检查特定数据库的内容,使用 USE 切换上下文,然后列出其表:
USE database_name;
SHOW TABLES;要在一次查询中查看表大小、行数和存储引擎:
SELECT
table_name,
engine,
table_rows,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'database_name'
ORDER BY (data_length + index_length) DESC;这比单独使用 SHOW TABLES 更具实用价值,是 DBA 在规划迁移或备份策略前会运行的查询类型。
第六步:退出 MySQL Shell
EXIT;或使用键盘快捷键 Ctrl+D。
非交互式使用:从 Shell 列出数据库
在自动化流程中 — 备份脚本、监控代理、部署钩子 — 您需要在不进入交互式会话的情况下检索数据库列表。
使用 -e 标志的单行命令
mysql -u root -p -e "SHOW DATABASES;"为脚本编写抑制标题行
mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null--skip-column-names 标志会移除 Database 标题,生成适合在 Shell 循环中迭代的干净输出:
for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
echo "Processing: $db"
done使用 mysqlshow 作为替代方案
mysqlshow 工具无需进入 MySQL Shell 即可快速概览:
mysqlshow -u root -p它列出经过身份验证的用户可见的所有数据库,并接受数据库名称参数以深入查看表级详情:
mysqlshow -u root -p database_name权限范围:为何某些数据库被隐藏
这是 MySQL 中最容易被误解的行为之一。当用户缺少全局 SHOW DATABASES 权限时,SHOW DATABASES 只返回该用户至少持有一项权限的数据库。这是设计使然 — 这是安全边界,而非缺陷。
实际影响:受限的应用程序用户运行 SHOW DATABASES; 时可能只看到一两个数据库,即使服务器托管了五十个。这是正确行为。如果用户需要查看完整列表,请明确授予该权限:
GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;请谨慎使用此授权。在多租户环境中 — 例如共享虚拟主机设置或多客户端独立服务器部署 — 向应用程序用户公开完整数据库列表存在安全风险。
MySQL 与 MariaDB:行为差异
MySQL 和 MariaDB 都支持 SHOW DATABASES; 和 information_schema.SCHEMATA,但有一些值得了解的细微差异:
| 功能 | MySQL 8.x | MariaDB 10.x |
|---|---|---|
| — | — | — |
| `SHOW DATABASES` 语法 | 支持 | 支持 |
| `information_schema.SCHEMATA` | 可用 | 可用 |
| `performance_schema` 默认值 | 已启用 | 已启用(10.5+) |
| `sys` 模式 | 默认包含 | 可选,并非始终存在 |
| `SHOW DATABASES LIKE` | 支持 | 支持 |
| 基于角色的权限模型 | 原生支持(8.0+) | 原生支持(10.0.5+) |
| `mysql` 客户端二进制文件 | `mysql` | `mysql` 或 `mariadb` |
在较新的 MariaDB 安装中,规范二进制文件可能是 mariadb 而非 mysql,但符号链接通常会保留向后兼容性。
常见错误及解决方法
ERROR 1045 (28000): Access denied for user
这意味着身份验证失败。请仔细检查用户名、密码和主机。对于 MySQL 8 上的 root,默认身份验证插件为 caching_sha2_password。如果您的客户端不支持它,请通过套接字连接:
sudo mysql -u root以 Linux root 用户身份运行时,这将绕过密码身份验证,改用 auth_socket 或 unix_socket 插件。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket
MySQL 守护进程未运行,或套接字文件路径错误。请检查:
sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sockERROR 1044 (42000): Access denied for user to database
用户已通过身份验证,但对目标数据库缺少权限。使用以下命令查看授权:
SHOW GRANTS FOR 'username'@'host';实用决策矩阵
使用此参考表为您的情况选择正确的方法:
| 场景 | 推荐命令 |
|---|---|
| — | — |
| 交互式探索 | 在 `mysql` Shell 中使用 `SHOW DATABASES;` |
| 按名称前缀筛选 | `SHOW DATABASES LIKE 'prefix_%';` |
| 富元数据列表 | 查询 `information_schema.SCHEMATA` |
| Shell 脚本 / 自动化 | `mysql -e "SHOW DATABASES;" –skip-column-names` |
| 无需 Shell 的快速概览 | `mysqlshow -u root -p` |
| 远程服务器,非默认端口 | `mysql -u root -p -h host -P port` |
| 无密码自动化 | 带 `chmod 600` 的 `~/.my.cnf` 选项文件 |
| 调试访问问题 | `SHOW GRANTS FOR 'user'@'host';` |
关键技术要点
SHOW DATABASES;受权限范围限制。没有全局SHOW DATABASES权限的用户只能看到其具有明确访问权限的数据库 — 这是安全特性,而非配置错误。- 在生产环境中切勿将密码作为命令行参数传递。交互式会话使用
-p,自动化使用~/.my.cnf。 - 对于脚本化或筛选查询,
information_schema.SCHEMATA的功能严格优于SHOW DATABASES。 mysqlshow工具使用不足,可提供快速的非交互式数据库和表检查。- 在 MySQL 8 上,基于套接字的身份验证(
sudo mysql)通常是访问本地服务器 root 权限的最快途径。 - 在使用 带 cPanel 的 VPS 或其他控制面板管理多个数据库时,面板的数据库管理器是这些相同 SQL 命令的 GUI 封装 — 理解底层查询可让您在 GUI 不足时获得完全控制权。
- 对于数据库访问与 SSL 证书和加密连接绑定的环境,请在
mysql客户端调用中添加--ssl-mode=REQUIRED以强制执行传输中的 TLS。
常见问题
问:为什么 SHOW DATABASES 没有显示我服务器上的所有数据库?
答:您当前身份验证的用户账户缺少全局 SHOW DATABASES 权限。MySQL 只返回该用户至少持有一项权限的数据库。以 root 身份验证,或授予 SHOW DATABASES 权限以查看完整列表。
问:SHOW DATABASES 与查询 information_schema.SCHEMATA 有什么区别?
答:两者都返回可访问模式的列表,但 information_schema.SCHEMATA 公开了额外的元数据列 — 默认字符集、默认排序规则 — 并支持使用 WHERE、ORDER BY 和 JOIN 进行完整的 SQL 筛选。快速交互式检查使用 SHOW DATABASES,脚本化或分析查询使用 information_schema.SCHEMATA。
问:如何在不打开交互式会话的情况下列出远程 MySQL 服务器上的数据库?
答:结合主机和端口选项使用 -e 标志:
mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-names问:在不知道 root 密码的情况下能否列出 MySQL 数据库?
答:在您拥有 Linux root 访问权限的本地服务器上,可以。MySQL 的 auth_socket(或 MariaDB 上的 unix_socket)插件基于 Linux 操作系统用户进行身份验证。运行 sudo mysql,您将无需密码提示即可以 MySQL root 用户身份获得访问权限。
问:SHOW DATABASES 在 MariaDB 上的工作方式与 MySQL 相同吗?
答:语法完全相同,权限范围规则也相同。主要实际差异在于 MariaDB 默认情况下可能不包含 sys 模式,且在较新的 MariaDB 版本中,首选客户端二进制文件是 mariadb 而非 mysql,但 mysql 别名通常会保留以保持兼容性。
