15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
15.10.2024
3 +1

如何在 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.xMariaDB 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_socketunix_socket 插件。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket

MySQL 守护进程未运行,或套接字文件路径错误。请检查:

sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sock

ERROR 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 公开了额外的元数据列 — 默认字符集、默认排序规则 — 并支持使用 WHEREORDER BYJOIN 进行完整的 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 别名通常会保留以保持兼容性。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用