介绍
MariaDB 是一个开源的关系型数据库管理系统,是 MySQL 的流行直接替代品。由原 MySQL 开发者之一 Michael “Monty” Widenius 创建,MariaDB 在保持与 MySQL 完全兼容的同时,提供性能改进、额外的存储引擎,并承诺保持开源。它通常用作 LAMP(Linux、Apache、MySQL/MariaDB、PHP/Python/Perl)堆栈和 LEMP(Linux、Nginx、MySQL/MariaDB、PHP)堆栈的数据库组件。
本教程将指导您在 Ubuntu 服务器上安装 MariaDB,保护安装安全,创建具有密码认证的管理用户,并验证数据库服务器是否正常运行。您还将找到故障排除提示和生产部署的安全最佳实践。
已在 Ubuntu 20.04、22.04 和 24.04 上测试。 本指南中的命令适用于所有当前支持的 Ubuntu LTS 版本。Ubuntu 仓库中的默认 MariaDB 版本因发行版而异:Ubuntu 20.04 提供 MariaDB 10.3,Ubuntu 22.04 提供 MariaDB 10.6,Ubuntu 24.04 提供 MariaDB 10.11。无论 Ubuntu 版本或从默认仓库获取的 MariaDB 版本如何,所有安装和配置步骤均保持相同。
此安装的快速版本包括三个步骤:
- 使用
apt更新软件包索引 - 使用
apt安装mariadb-server软件包。该软件包还会拉取用于与 MariaDB 交互的相关工具 - 运行包含的
mysql_secure_installation安全脚本以限制对服务器的访问
- sudo apt update
- sudo apt install mariadb-server
- sudo mysql_secure_installation
关键要点
- MariaDB 可从 Ubuntu 的默认仓库安装,在 Ubuntu 20.04、22.04 和 24.04 上使用
sudo apt install mariadb-server。 - 安装后始终运行
mysql_secure_installation,以移除匿名用户、禁用远程 root 登录并删除测试数据库。 - 在 Ubuntu 上,MariaDB 的 root 账户默认使用
unix_socket认证,这意味着您使用sudo mariadb登录,而不是密码。这对本地管理更安全。 - 为需要基于密码的数据库访问的应用程序或工具(如 phpMyAdmin)创建单独的管理用户,并使用密码认证。
- 使用
systemctl命令管理 MariaDB 服务:start、stop、restart和status。
先决条件
要完成本教程,您需要一台运行 Ubuntu(20.04、22.04 或 24.04)的服务器。该服务器应具有非 root 管理用户,并配置了使用 UFW 的防火墙。请按照 Ubuntu 的初始服务器设置指南进行设置。
如果您第一次处理防火墙规则,在 Ubuntu 上使用 UFW 设置防火墙 教程涵盖了您所需的一切。
步骤 1:安装 MariaDB
Ubuntu 的默认 APT 仓库包含 MariaDB。版本取决于您的 Ubuntu 发行版:
| Ubuntu 版本 | 默认 MariaDB 版本 | 支持状态 |
|---|---|---|
| 20.04 LTS | MariaDB 10.3 | 2024 年 6 月 EOL |
| 22.04 LTS | MariaDB 10.6 | 支持至 2026 年 7 月 |
| 24.04 LTS | MariaDB 10.11 | 支持至 2028 年 2 月 |
注意: 如果您需要比 Ubuntu 发行版默认提供的更新的 MariaDB 版本,可以添加适用于您 Ubuntu 版本的官方 MariaDB 仓库。对于大多数使用场景,Ubuntu 默认仓库中的版本就足够好了。
首先,使用 apt 更新服务器上的软件包索引:
- sudo apt update
然后安装软件包:
- sudo apt install mariadb-server
这将安装 MariaDB server 以及客户端工具(mariadb、mysqladmin、mysqldump 等),您将使用这些工具与数据库交互。
如果 MariaDB 未运行,请启动它:
- sudo systemctl start mariadb.service
启用 MariaDB 在启动时自动运行:
- sudo systemctl enable mariadb.service
默认配置会让您的 MariaDB 安装没有 root 密码,并带有一些不安全的默认设置。下一步将使用包含的安全脚本来解决这个问题。
步骤 2:配置 MariaDB
对于新安装的 MariaDB,下一步是运行包含的安全脚本。此脚本会更改几个不太安全的默认选项,包括移除远程 root 登录和示例用户。
运行安全脚本:
- sudo mysql_secure_installation
这会引导你完成一系列提示,你可以更改 MariaDB 安装的安全选项。第一个提示会询问当前数据库 root 密码。由于你尚未设置密码,请按 ENTER 表示“无密码”。
Output注意:建议对所有用于生产的 MariaDB
服务器运行此脚本的所有部分! 请仔细阅读每个步骤!
为了登录 MariaDB 以对其进行加固,我们需要 root 用户的当前
密码。如果您刚刚安装了 MariaDB,并且
尚未 set 设置 root 密码,则密码为空,
因此您只需在此处按回车键。
Enter current password for root (enter for none):
下一个提示会询问是否要设置数据库 root 密码。在 Ubuntu 上,MariaDB 的 root 账户与自动化系统维护紧密相关,因此不应更改该账户的配置认证方法。这样做可能会导致软件包更新破坏数据库系统,因为它会移除对管理账户的访问。输入 N 然后按 ENTER。
Output. .. .
OK, successfully used password, moving on...
设置 root 密码可确保无人能未经适当授权登录 MariaDB
root 用户。
Set root password? [Y/n] N
在本教程的后面,你将学习如何为密码访问设置一个单独的管理账户,如果 socket 认证不适合你的用例。
从那里开始,你可以按 Y 然后 ENTER 来接受后续所有问题的默认值。这将移除一些匿名用户和测试数据库、禁用远程 root 登录,并加载这些新规则,以便 MariaDB 立即应用你所做的更改。
理解 unix_socket 认证
在 Ubuntu 上,MariaDB 默认为 root 用户使用 unix_socket 认证,而不是基于密码的认证。这意味着数据库通过你的操作系统用户名和 socket 连接来识别你,而不是要求输入密码。
当你运行 sudo mariadb 时,你的系统会通过 Unix socket 发送你的 OS 凭据,如果这些凭据匹配有效的数据库用户,MariaDB 就会授予访问权限。这种方法有几个好处:
- root 账户的数据库密码无法被暴力破解
- 系统级访问控制(谁能运行
sudo)保护数据库 - 自动化维护脚本如
logrotate和软件包升级无需在配置文件中存储密码即可继续工作
对于交互式使用和远程访问,请创建具有密码认证的单独用户,第 3 步将介绍这一点。
步骤 3:(可选)创建使用密码认证的管理用户
在运行 MariaDB 的 Ubuntu 系统上,默认情况下 root MariaDB 用户使用 unix_socket 插件进行认证,而不是密码。这种方式在许多情况下提供了更高的安全性和可用性,但当您需要为外部程序(如 phpMyAdmin 或 Web 应用程序)授予管理权限时,也会带来复杂性。
由于服务器使用 root 账户执行日志轮转、启动和停止服务器等任务,因此最好不要更改 root 账户的认证信息。修改 /etc/mysql/debian.cnf 配置文件中的凭据最初可能有效,但软件包更新可能会覆盖这些更改。包维护者建议不要修改 root 账户,而是创建一个单独的管理账户用于基于密码的访问。
为此,创建一个名为 admin 的新账户,该账户具有与 root 账户相同的权限,但配置为使用密码认证。从终端打开 MariaDB 提示符:
- sudo mariadb
然后创建一个具有 root 权限并使用密码访问的新用户。将用户名和密码更改为您偏好的值:
- GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
刷新权限以确保它们被保存并在当前会话中可用:
- FLUSH PRIVILEGES;
完成此操作后,退出 MariaDB shell:
- exit
最后,测试 MariaDB 安装。
步骤 4:测试 MariaDB
从默认仓库安装时,MariaDB 会自动启动运行。要测试此功能,请检查其状态:
- sudo systemctl status mariadb
您将收到类似于以下的输出:
输出● mariadb.service - MariaDB 10.6.16 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-02-26 13:38:18 UTC; 3min 55s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 25914 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 31 (limit: 2345)
Memory: 65.6M
CGroup: /system.slice/mariadb.service
└─25914 /usr/sbin/mysqld
. . .
如果 MariaDB 未运行,您可以使用命令 sudo systemctl start mariadb 启动它。
作为额外检查,可以尝试使用 mysqladmin 工具连接到数据库,该工具是一个允许您运行管理命令的客户端。例如,此命令使用 Unix socket 以 root 身份连接到 MariaDB 并返回版本:
- sudo mysqladmin version
您将收到类似于此的输出:
输出mysqladmin Ver 9.1 Distrib 10.6.16-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Server version 10.6.16-MariaDB-0ubuntu0.22.04.1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 4 min 49 sec
Threads: 7 Questions: 467 Slow queries: 0 Opens: 177 Flush tables: 1 Open tables: 31 Queries per second avg: 1.615
如果您配置了一个使用密码认证的单独管理用户,可以通过输入以下命令执行相同的操作:
- mysqladmin -u admin -p version
这确认了 MariaDB 已启动运行,并且您的用户能够成功认证。
步骤 5:基本的 MariaDB 管理命令
MariaDB 安装并运行后,以下是日常管理必需的命令:
| 命令 | 描述 |
|---|---|
sudo systemctl start mariadb |
启动 MariaDB 服务 |
sudo systemctl stop mariadb |
停止 MariaDB 服务 |
sudo systemctl restart mariadb |
重启 MariaDB 服务 |
sudo systemctl status mariadb |
检查 MariaDB 是否正在运行 |
sudo systemctl enable mariadb |
设置 MariaDB 开机自启 |
mariadb --version |
显示已安装的 MariaDB 版本 |
sudo mariadb |
以 root 用户打开 MariaDB shell |
要检查系统中安装的 MariaDB 版本:
- mariadb --version
要查看所有活动数据库:
- sudo mariadb -e "SHOW DATABASES;"
步骤 6:为生产环境加固 MariaDB
除了 mysql_secure_installation 脚本外,还有额外的步骤来加固生产环境的 MariaDB 服务器。
限制网络访问
默认情况下,MariaDB 仅监听 localhost (127.0.0.1),这意味着它不接受远程连接。您可以通过检查 MariaDB 配置中的 bind-address 指令来验证这一点:
- sudo grep bind-address /etc/mysql/mariadb.conf.d/50-server.cnf
输出bind-address = 127.0.0.1
如果需要远程数据库访问,请将 bind-address 更改为服务器的私有 IP 地址(生产环境中不要使用 0.0.0.0),并配置防火墙仅允许来自受信任 IP 地址的连接:
- sudo ufw allow from trusted_ip_address to any port 3306
警告: 将 bind-address 设置为 0.0.0.0 会使您的数据库暴露给整个互联网。在生产环境中始终限制访问特定 IP 地址或私有网络范围。
审查用户账户
定期审查哪些用户账户可以访问您的数据库:
- sudo mariadb -e "SELECT User, Host, plugin FROM mysql.user;"
删除不再需要的账户:
- DROP USER 'unused_user'@'host';
- FLUSH PRIVILEGES;
启用慢查询日志
慢查询日志有助于识别运行时间过长的查询,这对于性能调优很有用:
- sudo mariadb -e "SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2;"
这会记录执行时间超过 2 秒的任何查询。使用以下命令检查日志位置:
- sudo mariadb -e "SHOW VARIABLES LIKE 'slow_query_log_file';"
排查常见 MariaDB 问题
以下是安装过程中或安装后可能遇到的问题的解决方案。
MariaDB 无法启动
如果 MariaDB 无法启动,请检查错误日志:
- sudo journalctl -u mariadb --no-pager -n 50
常见原因包括:
- 端口冲突:另一个进程(如 MySQL)正在使用 3306 端口。使用
sudo ss -tlnp | grep 3306检查。 - 磁盘空间:数据目录(
/var/lib/mysql)需要可用磁盘空间。使用df -h验证。 - 权限问题:MariaDB 数据目录必须由
mysql用户拥有。使用sudo chown -R mysql:mysql /var/lib/mysql修复。
无法连接到 MariaDB
如果收到“访问被拒绝”错误:
- 验证 MariaDB 是否正在运行:
sudo systemctl status mariadb - 尝试使用 sudo 以 root 身份连接:
sudo mariadb - 检查您的用户的身份验证插件:
- sudo mariadb -e "SELECT User, Host, plugin FROM mysql.user WHERE User='root';"
如果插件显示为 unix_socket,则必须使用 sudo mariadb 以 root 身份连接。
mysql_secure_installation 报错失败
如果安全脚本失败,通常是因为 MariaDB 服务未运行。先启动它:
- sudo systemctl start mariadb
- sudo mysql_secure_installation
MariaDB vs MySQL:选择合适的数据库
由于 MariaDB 是 MySQL 的一个分支,你可能想知道该使用哪一个。这里有一个快速比较:
| 特性 | MariaDB | MySQL |
|---|---|---|
| 许可证 | GPL(完全开源) | GPL + 专有(Oracle) |
| Ubuntu 默认安装 | 是(自 20.04 起) | 作为单独包提供 |
| 存储引擎 | InnoDB、Aria、ColumnStore、Spider 等 | InnoDB、MyISAM、NDB |
| JSON 支持 | 是 | 是(某些情况下语法不同) |
| 直接替换 | 与 MySQL 客户端和协议兼容 | N/A |
| 社区开发 | 由 MariaDB Foundation 社区驱动 | 由 Oracle 企业驱动 |
对于大多数 Ubuntu 服务器部署,推荐使用 MariaDB。它包含在默认仓库中,接收及时的安全更新,并保持与 MySQL 工具和库的兼容性。如果你正在构建 LAMP 堆栈,MariaDB 可以作为 MySQL 的直接替代品。
常见问题解答
1. MariaDB 是 MySQL 的直接替换品吗?
是的。MariaDB 被设计为在协议和 API 级别与 MySQL 完全兼容。与 MySQL 合作的应用程序无需修改代码即可与 MariaDB 合作。mysql 命令行客户端、mysqldump 以及 MySQL Connector 等库都适用于两者。MariaDB 还支持相同的 SQL 语法、数据类型和复制协议。
2. 如何在 Ubuntu 上重置 MariaDB root 密码?
如果你使用 unix_socket 认证(Ubuntu 默认),则无需 root 密码。改用 sudo mariadb 连接即可。如果你设置了 root 密码但忘记了,请参考《如何重置 MySQL 或 MariaDB root 密码》指南,该指南将指导你停止服务、不带权限检查启动服务,并重置密码。
3. 为什么 MariaDB 在 Ubuntu 上使用 unix_socket 认证?
Ubuntu 配置 MariaDB 为 root 账户使用 unix_socket 认证,这样系统维护任务(日志轮转、包升级、自动化备份)无需以明文形式存储数据库密码即可运行。这更安全,因为它将数据库访问与你的操作系统用户权限绑定。只有能够运行 sudo 的用户才能访问 MariaDB root 账户。
4. 如何检查安装了哪个版本的 MariaDB?
运行 mariadb --version,或连接到数据库并运行 SELECT VERSION();。输出将显示版本号,例如 Ubuntu 22.04 上的 10.6.16-MariaDB 或 Ubuntu 24.04 上的 10.11.6-MariaDB。
5. 我可以在同一 Ubuntu 服务器上同时安装 MariaDB 和 MySQL 吗?
不可以。Ubuntu 上的 MariaDB 和 MySQL 包会冲突,因为它们提供相同的文件并使用相同的端口(3306)。你可以安装其中一个,但不能同时安装两者。如果你需要在它们之间迁移,请使用 mysqldump 导出和导入你的数据库。
结论
在本指南中,你在 Ubuntu 上安装了 MariaDB,使用 mysql_secure_installation 脚本对其进行了加固,并了解了 Ubuntu 上 unix_socket 认证模型的工作原理。你还可以选择创建具有密码认证的独立管理用户,并测试了 MariaDB 服务器以验证一切正常运行。
除了基础内容,本指南还涵盖了基本管理命令、生产环境安全加固、常见问题排查,以及 MariaDB 与 MySQL 的比较。
后续步骤
现在您已经拥有一个运行中且安全的 MariaDB 服务器,以下是一些资源,可帮助您继续构建您的环境:
- MySQL 或 MariaDB 中导入和导出数据库的方法:学习使用
mysqldump备份和恢复您的数据库。 - MySQL 查询简介:练习编写 SQL 查询,包括
SELECT、聚合函数和多表连接。这些查询在 MariaDB 中完全相同。 - 在 Ubuntu 上安装 LAMP 技术栈:使用 Apache、MariaDB(或 MySQL)和 PHP 构建完整的 Web 应用技术栈。
- 在 Ubuntu 上安装 Nginx:将 Nginx 设置为您的 Web 服务器,并与 MariaDB 搭配组成 LEMP 技术栈。
- 在 Ubuntu 上安装 PHP 并设置本地开发环境:配置 PHP 以连接您的 MariaDB 数据库,用于 Web 应用开发。
准备在生产环境中部署 MariaDB 了吗? 托管数据库服务会为您处理资源供应、维护、备份和扩展,让您专注于构建应用。您也可以快速创建一个运行 Ubuntu 的 Droplet,并按照本教程自行设置 MariaDB。