本文约 2,772 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:到底该装哪个
装环境时你会遇到选择:apt install mysql-server 还是 mariadb-server?很多教程各执一词。
事实是:对 WordPress 而言,两者都能跑,差异只在细节。真正的差别体现在版本对应关系、默认排序规则、认证方式,以及少数插件用到的 JSON/GIS 特性。
原理分析:两者的渊源与分歧
MariaDB 是 MySQL 创始人 Monty 在 Oracle 收购 MySQL 后做的分支,目标是保持开源与兼容。早期几乎完全兼容(5.5 时代可以直接替换),但从 MySQL 8.0 / MariaDB 10.3 之后,两者开始明显分道扬镳。
主要分歧点:
| 方面 | MySQL 8.0 | MariaDB 10.6~11.x |
|---|---|---|
| 默认认证 | caching_sha2_password | mysql_native_password |
| 默认排序规则 | utf8mb4_0900_ai_ci | utf8mb4_unicode_ci / utf8mb4_general_ci |
| JSON 类型 | 原生 JSON | 是 LONGTEXT 的别名(行为略有差异) |
| 窗口函数 | 支持 | 支持 |
| 查询缓存 | 移除 | 10.6 前支持,之后移除 |
| 线程池 | 企业版才有 | 社区版自带(高并发有优势) |
| 序列、虚拟列 | 支持 | 支持(语法有差异) |
保姆级实操:版本对应与选择
WordPress 的官方最低要求
- MySQL 5.7.0+ 或 MariaDB 10.4+(新版推荐 MySQL 8.0+ / MariaDB 10.6+)。
版本对应速查
| MySQL | 大致对应的 MariaDB |
|---|---|
| 5.7 | 10.2 ~ 10.3 |
| 8.0 | 10.4 ~ 10.6(非严格对应) |
| 8.4 LTS | 11.4 LTS |
注意这是”特性大致相当”,不是二进制兼容。从 MySQL 8 导出的数据导入 MariaDB 可能遇到排序规则不存在的问题(utf8mb4_0900_ai_ci MariaDB 不认)。
选择建议
| 场景 | 推荐 | 理由 |
|---|---|---|
| 新装环境、用面板(宝塔等) | MariaDB 10.11 | 面板默认支持好、资源占用低、线程池社区版可用 |
| 老 PHP(7.4 以下) | MariaDB | 默认 native 认证,不用折腾 |
| 用商业插件要求 MySQL 8 | MySQL 8.0 | 避免兼容性扯皮 |
| 高并发读写 | MariaDB + 线程池 | 社区版就有线程池 |
| 已有 MySQL 5.7 老站 | 先原地升级或保持 | 贸然切换风险大 |
从 MySQL 迁移到 MariaDB 的步骤
# 1. 导出(注意排序规则)
mysqldump -u root -p --default-character-set=utf8mb4 --single-transaction \
--routines --triggers wordpress > dump.sql
# 2. 检查并替换 MariaDB 不支持的排序规则
grep -c 'utf8mb4_0900_ai_ci' dump.sql
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql
# 3. 安装 MariaDB(先停 MySQL)
sudo systemctl stop mysql
sudo apt install -y mariadb-server
# 4. 导入
mysql -u root -p -e "CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p wordpress < dump.sql
# 5. 验证
wp db check
wp option get home
反方向(MariaDB → MySQL) 流程类似,但要额外处理 mysql_native_password 用户:
ALTER USER 'wpuser'@'localhost' IDENTIFIED WITH caching_sha2_password BY '密码';
配置要点(MariaDB)
/etc/mysql/mariadb.conf.d/50-server.cnf:
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
max_connections = 200
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
thread_handling = pool-of-threads # MariaDB 线程池,高并发可选
常见踩坑与失败案例
- 导入时报
Unknown collation: 'utf8mb4_0900_ai_ci'—— 从 MySQL 8 往 MariaDB 迁移的必然问题,用 sed 替换为utf8mb4_unicode_ci。 - 案例:某站从 MySQL 5.7 迁到 MariaDB 10.6 后,一个用 JSON 字段的插件行为异常(排序结果不同)。原因是 MariaDB 的 JSON 是 LONGTEXT 别名,排序按字符串而非 JSON 值。最后改为在 PHP 层排序。
- 面板默认装了 MariaDB 而教程讲 MySQL —— 配置文件路径不同(
/etc/mysql/mariadb.conf.d/vs/etc/mysql/mysql.conf.d/),照抄教程会找不到文件。 mysql命令实际是 MariaDB 客户端 —— 用mysql --version确认,别想当然。- WordPress 站点健康检查提示”数据库版本过旧” —— MariaDB 10.3 被判定为过旧,升级到 10.6+ 即可。
总结
选择原则很实际:新装环境优先 MariaDB 10.11(省事、资源友好、面板支持好);已有 MySQL 就别折腾切换;商业插件明确要求 MySQL 8 就照它说的做。真正需要你记住的技术点是那条排序规则差异——跨引擎迁移时 90% 的问题都出在 utf8mb4_0900_ai_ci 上。无论用哪个,把 innodb_buffer_pool_size 配好、字符集统一成 utf8mb4_unicode_ci,WordPress 跑起来都不会有本质差别。
