如何调试WordPress“建立数据库连接时出错”
介绍
WordPress 是世界上最流行的开源内容管理系统之一。 虽然它开始专注于博客,但多年来它已发展成为一个更灵活的网站平台。 经过近 15 年的发展,它已经相当完善和强大,但仍然会出现问题。
如果您最近尝试加载由 WordPress 提供支持的网站,但看到一条消息指出“建立数据库连接时出错”,原因通常是以下之一:
- 数据库已崩溃,通常是由于服务器内存不足
- 您的 WordPress 配置中的数据库登录凭据不正确
- WordPress 数据库表已损坏
让我们一次一个地浏览这些问题,以确定它们是否会影响您,以及如何解决它们。
先决条件
本教程假定以下内容:
- 您正在一台具有命令行和
sudo
访问权限的机器上运行 WordPress - 您的数据库与 WordPress 运行在同一台服务器上(典型的自托管 WordPress 设置,不太典型的共享 WordPress 托管环境)
- 您知道您的数据库用户名、密码和为 WordPress 创建的数据库的名称。 此信息应在 WordPress 安装的初始设置期间创建。
第 1 步 — 检查服务器内存资源
调试此问题的第一步是尝试登录服务器以查看系统是否健康并且 MySQL 是否正在运行。
通过 SSH 登录到您的服务器,记住用您自己的用户和服务器详细信息替换下面突出显示的部分:
ssh sammy@your_server_ip
如果您在登录服务器时需要帮助,请参阅我们的文章 如何使用 SSH 连接到您的 Droplet 。
注意: 如果您确定您的连接详细信息正确但仍然无法登录,则可能是您的服务器内存不足或负载过重。 这可能是由于您网站的流量突然激增,并且可以解释 WordPress 错误。 您可能需要重新启动服务器才能登录。
现在我们已经成功登录,让我们检查一下我们的 MySQL 服务器是否正在运行:
sudo netstat -plt
netstat
命令打印有关我们服务器网络系统的信息。 在这种情况下,我们想要监听 tcp 套接字 (-t
) 上的连接 (-l
) 的程序名称 (-p
)。 检查输出中的行列表 mysqld
,突出显示如下:
OutputActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:mysql *:* LISTEN 1958/mysqld tcp 0 0 *:ssh *:* LISTEN 2205/sshd tcp 0 0 localhost:smtp *:* LISTEN 2361/master tcp6 0 0 [::]:http [::]:* LISTEN 16091/apache2 tcp6 0 0 [::]:ssh [::]:* LISTEN 2205/sshd tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN 2361/master
如果您的输出相似,我们知道 MySQL 正在运行并正在侦听连接。 如果您没有看到 MySQL 列出,请尝试手动启动 MySQL。 在大多数看起来像这样的系统上:
sudo systemctl start mysql
一些 Linux 发行版(尤其是 CentOS)使用 mysqld
而不是普通的 mysql
作为服务名称。 酌情替代。
MySQL 应该启动。 要验证,请重新运行我们上面使用的 netstat
命令,并检查 mysqld
进程的输出。
MySQL 和 WordPress 都需要大量内存才能正常运行。 如果 MySQL 由于内存不足而退出,我们应该在其错误日志中看到这一点的证据。 我们看看吧:
zgrep -a "allocate memory" /var/log/mysql/error.log*
zgrep
将搜索日志文件,包括已归档为压缩 .tar.gz
文件的旧日志文件。 我们正在 /var/log/mysql/
目录中的任何 error.log*
文件中搜索包含 allocate memory
的行。
Output2017-04-11T17:38:22.604644Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
如果你看到像上面这样的一行或多行,你的 MySQL 服务器内存不足并退出。 如果只有一条线路,您可能会暂时遇到异常流量。 如果有很多错误行,您的服务器经常会受到内存限制。 无论哪种方式,解决方案都是迁移到具有更多可用内存的服务器。 在大多数云提供商中,以最少的停机时间升级现有服务器是一件简单的事情。
如果您在运行 zgrep
命令后没有看到任何输出,则说明您的服务器没有内存不足。 如果您的网站仍然存在错误,请继续下一步,我们将查看我们的 WordPress 配置并确保 MySQL 登录详细信息正确。
第 2 步 — 检查数据库登录凭据
如果您刚刚在服务器或托管服务提供商之间移动了 WordPress 安装,您可能需要更新您的数据库连接详细信息。 这些存储在服务器上一个名为 wp-config.php
的 PHP 文件中。
首先,让我们找到我们的 wp-config.php
文件:
sudo find / -name "wp-config.php"
这将从根目录 (/
) 向下搜索所有内容,并找到任何名为 wp-config.php
的文件。 如果存在这样的文件,将输出完整路径:
Output/var/www/html/wp-config.php
现在使用您喜欢的文本编辑器打开配置文件。 我们将在这里使用 nano
编辑器:
sudo nano /var/www/html/wp-config.php
这将打开一个包含配置变量和一些解释性文本的文本文件。 向上是我们的数据库连接信息:
wp-config.php
/** The name of the database for WordPress */ define('DB_NAME', 'database_name'); /** MySQL database username */ define('DB_USER', 'database_username'); /** MySQL database password */ define('DB_PASSWORD', 'database_password');
根据您的记录检查这三个变量是否正确。 如果它们看起来不正确,请酌情更新,保存并退出(如果您使用的是 nano
,则为 CTRL-O
,然后是 CTRL-X
)。 即使登录信息看起来正确,也值得尝试从命令行连接到数据库,以确保。 将配置文件中的详细信息复制并粘贴到以下命令中:
mysqlshow -u database_username -p
系统将提示您输入密码。 将其粘贴并按 ENTER
。 如果您收到 Access denied 错误,则您的用户名或密码不正确。 否则 mysqlshow
命令将显示指定用户有权访问的所有数据库:
Output+--------------------+ | Databases | +--------------------+ | information_schema | | database_name | +--------------------+
验证其中一个数据库是否与您的 WordPress 配置文件中的内容完全匹配。 如果是这样,您已经验证了您的配置是正确的,并且 WordPress 应该能够成功登录到数据库。 重新加载您的网站以查看错误是否消失。
还是行不通? 接下来要尝试的是修复数据库。
第 3 步 — 修复 WordPress 数据库
有时,由于升级失败、数据库崩溃或插件错误,您的 WordPress 数据库可能会损坏。 此问题可能表现为数据库连接错误,因此如果您的问题不是 MySQL 服务器或配置文件,请尝试修复您的数据库。
WordPress 提供了一个内置实用程序来修复数据库。 默认情况下它被禁用,因为它没有访问控制并且可能是一个安全问题。 我们将启用该功能,运行修复,然后禁用它。
再次打开 wp-config.php
文件:
sudo nano /var/www/html/wp-config.php
在任何空白行上,粘贴以下内容:
wp-config.php
define('WP_ALLOW_REPAIR', true);
这定义了 WordPress 在确定是否应启用修复功能时查找的变量。
保存并关闭文件。 切换到您的浏览器并加载以下地址,确保将您网站的域或 IP 地址替换为突出显示的部分:
http://www.example.com/wp-admin/maint/repair.php
将加载数据库修复页面:
按下 Repair Database 按钮,您将进入结果页面,您可以在其中实时查看检查和修复情况:
该过程完成后,请务必再次打开 wp-config.php
文件,并删除我们刚刚粘贴的行。
您是否注意到正在进行任何维修? 再次尝试您的网站,并检查错误是否消失。 如果发现无法修复的问题,您可能需要从备份中恢复数据库(如果有可用的话)。 请参考我们的教程 如何在 MySQL 中导入和导出数据库以了解如何执行此操作的详细信息。
如果数据库没有发现问题,那么我们仍然没有发现问题。 这可能是我们刚刚遗漏的间歇性问题,或者更模糊的问题。 让我们总结一下其他一些尝试的可能性。
结论
大多数“建立数据库连接时出错”问题应该已经通过上述三个步骤解决了。 尽管如此,可能还有更多难以捉摸的问题继续以这种方式出现。 以下是一些可能有助于追踪和消除此错误原因的文章:
- 高流量(因此性能不佳和错误)的常见来源是 WordPress 安装常见的暴力攻击。 您可以按照 如何保护 WordPress 免受 XML-RPC 攻击 来中和攻击。
- 您可以通过在 WordPress 安装上实现缓存来节省一些服务器资源。 WordPress 有许多简单的缓存插件。 我们的教程 如何配置 Redis 缓存以加速 WordPress 将向您展示如何配置特别高性能的 Redis 支持的缓存。