如何在 Ubuntu(20.04 / 22.04 / 24.04)上安装 MariaDB – 完整的安装与安全指南

目次

在 Ubuntu 上最快安装 MariaDB 的方法(支持 20.04 / 22.04 / 24.04)

如果您想立即在 Ubuntu 上使用 MariaDB,只需按照以下步骤完成安装和启动验证。除非有特定原因,否则从 Ubuntu 默认仓库安装是最安全、最稳定的选择。

① 更新软件包信息

sudo apt update
sudo apt upgrade -y

② 安装 MariaDB

sudo apt install -y mariadb-server mariadb-client

安装过程中无需特殊配置。完成后,MariaDB 服务会自动启动。

③ 验证 MariaDB 是否正在运行

sudo systemctl status mariadb

如果显示 active (running),则 MariaDB 正常运行。

④ 启用自动启动(通常不需要,但建议确认)

sudo systemctl enable mariadb

⑤ 连接 MariaDB 并验证操作

sudo mysql

如果看到以下提示,则安装成功:

MariaDB [(none)]>

要退出,请输入 exit;

安装后必须进行的安全初始化

安装后,MariaDB 只应用了最小的安全设置。务必运行以下命令:

sudo mysql_secure_installation

通常,推荐以下答案:

  • 删除匿名用户 → Y
  • 禁止 root 远程登录 → Y
  • 删除测试数据库 → Y
  • 重新加载权限表 → Y

至此,Ubuntu 上的安全 MariaDB 环境已完成配置。

Ubuntu 版本对应的 MariaDB 版本

  • Ubuntu 20.04 → MariaDB 10.3 系列
  • Ubuntu 22.04 → MariaDB 10.6 系列
  • Ubuntu 24.04 → MariaDB 10.11 系列(LTS)

对于大多数用户来说,Ubuntu 默认版本已足够。只有在需要最新功能时才考虑使用官方仓库。

安装失败或服务未启动时的快速检查

  • 使用 sudo systemctl status mariadb 检查错误
  • 使用 sudo journalctl -xe 查看详细日志
  • 使用 df -h 检查磁盘空间

大多数情况下,问题要么是磁盘空间不足,要么是配置文件拼写错误。

为您的 Ubuntu 版本选择合适的 MariaDB 版本

在 Ubuntu 上使用 MariaDB 时,大多数情况下最安全的选择是 默认仓库版本。安全更新和依赖兼容性会自动维护,非常适合初学者和中级用户。

Ubuntu 默认仓库版本(推荐)

  • Ubuntu 20.04 → MariaDB 10.3 系列
  • Ubuntu 22.04 → MariaDB 10.6 系列
  • Ubuntu 24.04 → MariaDB 10.11 系列(LTS)

除非有特定需求,否则这些版本在生产环境中完全实用。

如果需要最新版本(添加官方 MariaDB 仓库)

如果需要最新功能,可以添加官方 MariaDB 仓库。由于 apt-key 已弃用,这里使用 signed-by 方法。

① 保存 GPG 密钥

sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://mariadb.org/mariadb_release_signing_key.asc \
  | sudo gpg --dearmor -o /etc/apt/keyrings/mariadb.gpg

② 检查您的 Ubuntu 代号

lsb_release -cs

示例:

  • 20.04 → focal
  • 22.04 → jammy
  • 24.04 → noble

③ 添加官方仓库(示例:10.11 系列)

echo "deb [signed-by=/etc/apt/keyrings/mariadb.gpg] \
https://mirror.mariadb.org/repo/10.11/ubuntu \
$(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/mariadb.list

④ 更新软件包并安装

sudo apt update
sudo apt install mariadb-server mariadb-client

使用官方仓库时的注意事项

  • 可以使用比 Ubuntu 默认版本更新的功能
  • 将来可能会出现依赖冲突的风险
  • 生产服务器需要进行充分的测试

在生产环境中,需要明确是优先考虑稳定性还是最新功能。

如何检查当前已安装的 MariaDB 版本

mysql --version

示例:

mysql  Ver 15.1 Distrib 10.6.16-MariaDB

通过明确确认版本,故障排除和迁移工作会变得更加容易。

MariaDB 初始安全设置完整指南(mysql_secure_installation)

在安装 MariaDB 后,默认只应用了最小的安全设置。要安全运行,请务必执行以下命令:

sudo mysql_secure_installation

执行后会出现多个提示。大多数情况下,推荐使用以下答案。

推荐答案

  • Enter current password for root: → 按回车键(首次运行时未设置)
  • Switch to unix_socket authentication? → Y(在 Ubuntu 上推荐)
  • Change the root password? → N(如果使用 unix_socket 认证)
  • Remove anonymous users? → Y
  • Disallow root login remotely? → Y
  • Remove test database and access to it? → Y
  • Reload privilege tables now? → Y

这完成了基本的安全配置。

为什么无法以 root 登录(访问被拒绝错误)

在 Ubuntu 上,root 用户默认使用 unix_socket 认证。因此,标准的基于密码的登录将无法工作。

示例症状

mysql -u root -p

Access denied for user 'root'@'localhost'

正确的登录方式(Ubuntu 默认)

sudo mysql

这是最安全且推荐的方式。

如何将 root 改为密码认证(仅在必要时)

仅当必须从外部工具或应用程序以 root 身份连接时才更改认证方式。

① 连接到 MariaDB

sudo mysql

② 更改认证插件

ALTER USER 'root'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'StrongPasswordHere';

FLUSH PRIVILEGES;

③ 确认更改

SELECT user, host, plugin FROM mysql.user;

如果显示 mysql_native_password,则更改成功。

如何检查当前的认证方式

sudo mysql -e "SELECT user, host, plugin FROM mysql.user;"

主要的认证方式:

  • unix_socket → Ubuntu 默认,安全
  • mysql_native_password → 基于密码的认证

除非有特定原因,否则保持 root 使用 unix_socket 认证是最安全的做法。

常见错误及解决方案

错误 1698 (28000):Access denied for user ‘root’@’localhost’

  • 原因:尝试基于密码的登录
  • 解决方案:使用 sudo mysql 登录

未找到 mysql_secure_installation

  • 使用 which mysql_secure_installation 检查
  • 如果未安装,运行 sudo apt install mariadb-server

将字符编码设置为 utf8mb4(防止乱码)

为了在 MariaDB 中安全处理多语言文本和表情符号,建议使用 utf8mb4。如果未设置此编码,可能会遇到字符编码问题或数据丢失。

① 编辑配置文件

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

[mysqld] 部分添加或修改以下行:

[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_general_ci

② 重启 MariaDB

sudo systemctl restart mariadb

③ 验证设置

sudo mysql -e "SHOW VARIABLES LIKE 'character_set%';"

如果显示 utf8mb4,则配置成功。

创建数据库时指定 utf8mb4(推荐)

如果希望无论全局设置如何都显式定义字符集,请在创建数据库时指定。

CREATE DATABASE sample_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

此数据库中创建的所有表都将继承 utf8mb4。

创建应用用户并授予权限

在生产环境中,切勿使用 root 用户进行应用连接。请创建专用用户,仅授予最小必要的权限。

① 登录 MariaDB

sudo mysql

② 创建用户(本地连接)

CREATE USER 'app_user'@'localhost'
IDENTIFIED BY 'StrongPasswordHere';

③ 授予数据库权限

GRANT ALL PRIVILEGES
ON sample_db.*
TO 'app_user'@'localhost';

FLUSH PRIVILEGES;

创建远程访问用户(仅在需要时)

仅在需要从外部服务器或云环境连接时才进行此配置。

CREATE USER 'app_user'@'%'
IDENTIFIED BY 'StrongPasswordHere';

GRANT ALL PRIVILEGES
ON sample_db.*
TO 'app_user'@'%';

FLUSH PRIVILEGES;

注意: “%” 通配符允许来自任何主机的连接。在生产环境中,指定特定 IP 地址更安全。

如何检查当前用户和权限

SELECT user, host FROM mysql.user;

SHOW GRANTS FOR 'app_user'@'localhost';

常见权限错误及解决方案

用户 ‘app_user’ 被拒绝访问

  • 主机指定错误(localhost 与 % 的区别)
  • 未执行 FLUSH PRIVILEGES
  • 连接时数据库名称错误

未知数据库

  • 数据库名称拼写错误
  • 未对目标数据库授予权限

如何在 MariaDB 中允许远程连接(外部访问失败时的修复)

默认情况下,MariaDB 只允许 本地连接。如果需要从外部服务器或云环境连接,请配置以下设置。

① 更改 bind-address

编辑配置文件:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

找到以下行:

bind-address = 127.0.0.1

要允许外部连接,请将其更改为:

bind-address = 0.0.0.0

保存后,重启 MariaDB:

sudo systemctl restart mariadb

② 在防火墙中打开 3306 端口

如果在 Ubuntu 上使用 UFW:

sudo ufw allow 3306
sudo ufw reload

为提升安全性,请指定源 IP 地址:

sudo ufw allow from 192.168.1.10 to any port 3306

③ 创建远程访问用户

CREATE USER 'app_user'@'%'
IDENTIFIED BY 'StrongPasswordHere';

GRANT ALL PRIVILEGES
ON sample_db.*
TO 'app_user'@'%';

FLUSH PRIVILEGES;

为了更好的安全性:

CREATE USER 'app_user'@'192.168.1.10'
IDENTIFIED BY 'StrongPasswordHere';

无法进行外部连接时的检查清单

1. MariaDB 是否正在运行?

sudo systemctl status mariadb

2. 3306 端口是否在监听?

sudo ss -tulnp | grep 3306

如果显示 0.0.0.0:3306,则表示已在所有接口上正确监听。

3. 使用云环境时(AWS / GCP / VPS)

  • 确认安全组已打开 3306 端口
  • 确认没有外部防火墙阻止连接

4. 错误信息导致的原因

无法连接到 MySQL 服务器

  • 端口关闭
  • bind-address 未更改
  • 防火墙阻止了连接

用户被拒绝访问

  • 用户主机指定错误
  • 密码错误
  • 权限未授予

连接超时

  • 云端安全设置
  • 网络路由问题

重要安全注意事项

  • 在生产环境中避免使用 “%”
  • 尽可能使用 VPN 访问
  • 考虑启用 SSL/TLS 连接
  • 切勿允许远程 root 登录

MariaDB 启动失败时的故障排除(错误)

① 检查服务状态

sudo systemctl status mariadb

② 检查详细日志

sudo journalctl -xe
sudo cat /var/log/mysql/error.log

③ 常见原因

  • 配置文件语法错误
  • 磁盘空间不足
  • 端口冲突(MySQL 已在运行)

④ 检查磁盘空间

df -h

拒绝访问错误原因汇总

  • 密码错误
  • 主机指定错误(localhost 与 % 的区别)
  • 未执行 FLUSH PRIVILEGES
  • 尝试使用标准方式登录 root(需要 sudo mysql

基础性能提升(适用于初学者)

不需要高级调优,但至少请确认以下设置。

① 启用慢查询日志

将以下内容添加到 50-server.cnf

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

重启 MariaDB:

sudo systemctl restart mariadb

② 检查索引使用情况

慢查询可能缺少适当的索引。

EXPLAIN SELECT * FROM sample_table WHERE column_name = 'value';

③ 检查服务器资源

top
htop

如果内存不足,请考虑升级服务器套餐。

常见问题 (FAQ)

如何在 Ubuntu 22.04 上锁定 MariaDB 版本?

使用 apt-mark hold mariadb-server

如果忘记 root 密码,如何重置?

您可以通过以安全模式启动并重新配置密码来重置。请参阅我们的专门指南获取详细步骤。

如何更改 MariaDB 端口号?

50-server.cnf 修改为类似 port = 3307 的设置,然后重启服务。

结论:在 Ubuntu 上安全使用 MariaDB

  • 使用默认仓库的版本是最安全的选择
  • 始终运行 mysql_secure_installation
  • 永不在应用程序连接中使用 root
  • 仅在必要时启用远程访问
  • 故障排除时,检查日志是首要任务

遵循这些步骤,您可以在 Ubuntu 上构建安全且可投入生产的 MariaDB 环境。