WordPress 数据库连接错误:完整修复指南
"Error establishing a database connection" 是 WordPress 最令人恐慌的错误之一——整个网站瞬间变为空白页面,只有一个冰冷的技术错误信息。这个错误意味着 WordPress 无法连接到 MySQL 或 MariaDB 数据库,因此无法加载任何页面内容。
常见原因包括:数据库凭据不正确、数据库服务未运行、连接数耗尽、数据库表损坏,或 wp-config.php 文件被意外修改。好消息是,这个问题几乎总能通过系统排查在几分钟内解决。本文将按照从最常见到最少见的顺序,逐步引导您定位并修复问题。
步骤 1:检查 wp-config.php 凭据
首先检查 WordPress 根目录下的 wp-config.php 文件,确认数据库连接信息是否正确。这是最常见的原因——尤其在迁移网站或更换数据库密码之后:
# 查看 wp-config.php 中的数据库配置
grep -E "DB_NAME|DB_USER|DB_PASSWORD|DB_HOST" wp-config.php
// wp-config.php 中的关键配置项
define('DB_NAME', 'wordpress_db'); // 数据库名称
define('DB_USER', 'wp_user'); // 数据库用户名
define('DB_PASSWORD', 'your_password'); // 数据库密码
define('DB_HOST', 'localhost'); // 数据库主机地址
逐一核对这些值是否与数据库中实际配置一致。如果数据库位于另一台服务器,DB_HOST 应填写远程 IP 而非 localhost。某些主机商使用特定的数据库地址(如 db.example.com 或 IP 地址加端口号 127.0.0.1:3306)。
步骤 2:验证 MySQL/MariaDB 是否运行
如果凭据正确,下一步确认数据库服务本身是否在运行。数据库服务崩溃是第二大常见原因:
# 检查 MySQL 服务状态
sudo systemctl status mysql
# 或 MariaDB
sudo systemctl status mariadb
# 或 MySQL (某些系统)
sudo systemctl status mysqld
# 如果服务已停止,启动它
sudo systemctl start mysql
sudo systemctl enable mysql
# 检查服务是否监听 3306 端口
sudo ss -tlnp | grep 3306
如果 MySQL 频繁崩溃,检查系统日志排查根本原因,常见的是内存不足导致 OOM Killer 杀死 MySQL 进程:
# 检查 MySQL 错误日志
sudo tail -50 /var/log/mysql/error.log
# 或
sudo tail -50 /var/log/mysqld.log
# 检查系统是否因内存不足杀死了 MySQL
dmesg | grep -i "oom\|mysql"
步骤 3:手动测试数据库连接
使用 wp-config.php 中的凭据手动连接数据库,可以精确定位问题是出在 WordPress 还是数据库本身:
# 使用 wp-config.php 中的凭据手动连接
mysql -u wp_user -p wordpress_db
# 测试远程数据库连接
mysql -h db_host_ip -u wp_user -p wordpress_db
# 如果连接成功,会看到 MySQL 提示符
# mysql>
# 验证 WordPress 表是否存在
SHOW TABLES;
# 退出
exit
如果手动连接失败并提示 Access denied,说明用户名或密码错误。如果提示 Can't connect to MySQL server,说明 MySQL 服务未运行或网络不通。如果连接成功但 WordPress 仍然报错,问题可能出在 WordPress 的 PHP 代码或文件权限上。
步骤 4:检查数据库服务器资源
即使数据库服务在运行,如果资源耗尽也会导致连接失败。MySQL 的 max_connections 限制可能已被耗尽:
# 查看当前连接数
mysqladmin -u root -p processlist | wc -l
# 查看 max_connections 设置
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"
# 查看当前活跃连接数
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
# 检查磁盘空间(磁盘满会导致 MySQL 无法写入临时表)
df -h
如果连接数接近上限,可以临时增大 max_connections:
# 临时增大连接数(重启后失效)
mysql -u root -p -e "SET GLOBAL max_connections = 200;"
# 永久修改:编辑 MySQL 配置文件
# /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf
# [mysqld]
# max_connections = 200
如果是内存不足导致的问题,考虑增加服务器内存或优化 WordPress 插件,减少不必要的数据库连接。
步骤 5:修复损坏的数据库
数据库表损坏也会导致连接错误,尤其在服务器意外断电或磁盘空间耗尽之后。WordPress 内置了数据库修复功能:
# 在 wp-config.php 中添加以下行(在 /* That's all, stop editing! */ 之前)
define('WP_ALLOW_REPAIR', true);
# 然后访问以下 URL 进行修复
# https://example.com/wp-admin/maint/repair.php
# 或者使用命令行工具修复数据库
mysqlcheck -u root -p --repair wordpress_db
# 修复所有数据库
mysqlcheck -u root -p --repair --all-databases
# 优化数据库表
mysqlcheck -u root -p --optimize wordpress_db
修复完成后,务必从 wp-config.php 中移除 WP_ALLOW_REPAIR 行,因为该页面无需登录即可访问,存在安全风险。
步骤 6:检查 wp-config.php 文件是否损坏
如果以上步骤都未解决问题,可能是 wp-config.php 文件本身被损坏。常见问题包括 BOM(字节顺序标记)、错误的文件编码、或手动编辑引入的语法错误:
# 检查文件编码和 BOM
file wp-config.php
# 检查是否包含 BOM(应输出 0)
hexdump -C wp-config.php | head -1
# 如果有 BOM,使用 sed 移除
sed -i '1s/^\xEF\xBB\xBF//' wp-config.php
# 验证 PHP 语法是否正确
php -l wp-config.php
如果文件严重损坏,可以从 WordPress 安装包中提取 wp-config-sample.php,填入正确的数据库信息后替换原文件。确保文件权限设置为 640 或 644,所有者为 Web 服务器用户(如 www-data 或 nginx)。
快速参考:原因与修复
| 症状 / 日志信息 | 根本原因 | 修复方法 |
|---|---|---|
| 全站显示数据库连接错误 | wp-config.php 中凭据不正确 | 核对 DB_NAME、DB_USER、DB_PASSWORD、DB_HOST |
Can't connect to MySQL server |
MySQL/MariaDB 服务未运行 | 使用 systemctl start mysql 启动服务 |
Access denied for user |
数据库用户权限不足或密码错误 | 重置数据库用户密码并授予权限 |
| 间歇性连接错误 | max_connections 耗尽 | 增大 max_connections 或优化插件减少连接数 |
| 服务器断电后出现错误 | 数据库表损坏 | 使用 WP_ALLOW_REPAIR 或 mysqlcheck --repair 修复 |
| 编辑配置后出现错误 | wp-config.php 编码或语法错误 | 移除 BOM,验证 PHP 语法 php -l |
| 内存不足导致 MySQL 崩溃 | OOM Killer 杀死 MySQL 进程 | 增加服务器内存或优化 MySQL 配置 |