如何调试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 支持的缓存。