WordPressの「データベース接続の確立エラー」をデバッグする方法
序章
WordPressは、世界で最も人気のあるオープンソースコンテンツ管理システムの1つです。 当初はブログに重点を置いていましたが、長年にわたって、一般的なWebサイト向けのより柔軟なプラットフォームに発展してきました。 ほぼ15年の開発の後、それは非常に洗練され、堅牢ですが、それでも問題が発生する可能性があります。
最近WordPressを利用したWebサイトを読み込もうとして、代わりに「データベース接続の確立中にエラーが発生しました」というメッセージが表示された場合、ほとんどの場合、原因は次のいずれかです。
- 多くの場合、サーバーのメモリ不足が原因でデータベースがクラッシュしました
- WordPress構成でデータベースのログイン資格情報が正しくありません
- WordPressデータベーステーブルが破損しています
これらの問題を一度に1つずつ確認して、影響があるかどうか、およびそれらを修正する方法を確認しましょう。
前提条件
このチュートリアルでは、次のことを前提としています。
- コマンドラインと
sudo
アクセス権を持つマシンでWordPressを実行している - データベースはWordPressと同じサーバーで実行されています(通常は自己ホスト型のWordPressセットアップであり、共有型のWordPressホスティング環境では一般的ではありません)
- データベースのユーザー名、パスワード、およびWordPress用に作成されたデータベースの名前を知っています。 この情報は、WordPressインストールの初期セットアップ中に作成されている必要があります。
手順1—サーバーのメモリリソースを確認する
この問題をデバッグするための良い最初のステップは、サーバーにログインして、システムが正常であり、MySQLが実行されているかどうかを確認することです。
SSH経由でサーバーにログインします。以下で強調表示されている部分を、自分のユーザーとサーバーの詳細に置き換えることを忘れないでください。
- ssh sammy@your_server_ip
サーバーへのログインについてサポートが必要な場合は、記事SSHを使用してドロップレットに接続する方法を参照してください。
注:接続の詳細は正しいと確信しているが、それでもログインに問題がある場合は、サーバーのメモリが不足しているか、非常に大きな負荷がかかっている可能性があります。 これはあなたのウェブサイトへのトラフィックの突然のバーストが原因である可能性があり、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)は、サービス名にプレーンなmysql
の代わりにmysqld
を使用します。 必要に応じて代用してください。
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
上記のような1つ以上の行が表示された場合は、MySQLサーバーのメモリが不足して終了しています。 1行だけの場合は、一時的に異常なトラフィックが発生している可能性があります。 エラー行が多い場合、サーバーは定期的にメモリの制約を受けています。 いずれにせよ、解決策は、より多くの使用可能なメモリを備えたサーバーに移行することです。 ほとんどのクラウドプロバイダーでは、最小限のダウンタイムで既存のサーバーをアップグレードするのは簡単です。
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
これにより、構成変数といくつかの説明テキストでいっぱいのテキストファイルが開きます。 一番上にあるのは、データベース接続情報です。
/** 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');
記録に基づいて、これら3つの変数が正しいことを確認してください。 正しく表示されない場合は、必要に応じて更新し、保存して終了します(CTRL-O
、nano
を使用している場合はCTRL-X
)。 ログイン情報が正しいように見えたとしても、念のため、コマンドラインからデータベースに接続してみる価値があります。 詳細を構成ファイルから次のコマンドにコピーして貼り付けます。
- mysqlshow -u database_username -p
パスワードの入力を求められます。 貼り付けてENTER
を押します。 アクセス拒否エラーが発生した場合は、ユーザー名またはパスワードが正しくありません。 それ以外の場合、mysqlshow
コマンドは、指定されたユーザーがアクセスできるすべてのデータベースを表示します。
Output+--------------------+
| Databases |
+--------------------+
| information_schema |
| database_name |
+--------------------+
データベースの1つがWordPress構成ファイルの内容と完全に一致していることを確認します。 もしそうなら、あなたはあなたの設定が正しいこと、そしてWordPressがデータベースに正常にログインできるはずであることを確認しました。 Webサイトをリロードして、エラーがなくなったかどうかを確認します。
まだ動作していません? 次に試すことは、データベースを修復することです。
ステップ3—WordPressデータベースを修復する
アップグレードの失敗、データベースのクラッシュ、またはプラグインの欠陥が原因で、WordPressデータベースが破損する場合があります。 この問題はデータベース接続エラーとして現れる可能性があるため、問題がMySQLサーバーまたは構成ファイルではない場合は、データベースを修復してみてください。
WordPressには、データベースを修復するための組み込みユーティリティが用意されています。 アクセス制御がなく、セキュリティの問題になる可能性があるため、デフォルトでは無効になっています。 この機能を有効にし、修復を実行してから、無効にします。
wp-config.php
ファイルをもう一度開きます。
- sudo nano /var/www/html/wp-config.php
空白行に、次のように貼り付けます。
define('WP_ALLOW_REPAIR', true);
これは、WordPressが修復機能を有効にするかどうかを決定するときに検索する変数を定義します。
ファイルを保存して閉じます。 ブラウザに切り替えて、次のアドレスをロードします。強調表示された部分は、サイトのドメインまたはIPアドレスに置き換えてください。
http://www.example.com/wp-admin/maint/repair.php
データベース修復ページがロードされます:
データベースの修復ボタンを押すと、結果ページが表示され、リアルタイムで行われているチェックと修復を確認できます。
プロセスが終了したら、必ずwp-config.php
ファイルを再度開いて、貼り付けたばかりの行を削除してください。
修理が行われていることに気づきましたか? サイトを再試行し、エラーがなくなったかどうかを確認してください。 修復不可能な問題が見つかった場合、データベースが利用可能な場合は、バックアップからデータベースを復元する必要があります。 その方法の詳細については、チュートリアルMySQLでデータベースをインポートおよびエクスポートする方法を参照してください。
データベースに問題が見つからなかった場合でも、問題は発見されていません。 それは、私たちが見逃している断続的な問題か、もっとあいまいな問題である可能性があります。 試してみる他のいくつかの可能性で締めくくりましょう。
結論
「データベース接続の確立エラー」の問題の大部分は、上記の3つの手順で解決されているはずです。 それでも、このように現れ続ける、よりとらえどころのない問題がある可能性があります。 このエラーの原因を追跡して中和するのに役立つ可能性のあるその他の記事を次に示します。
- トラフィックが多い(したがってパフォーマンスとエラーが少ない)原因となることが多いのは、WordPressのインストールに共通するブルートフォース攻撃です。 WordPressをXML-RPC攻撃から保護する方法に従って攻撃を無効にすることができます。
- WordPressのインストールにキャッシュを実装することで、サーバーリソースを節約できます。 WordPress用のシンプルなキャッシュプラグインはたくさんあります。 チュートリアルWordPressを高速化するためにRedisキャッシングを構成する方法では、特にパフォーマンスの高いRedisベースのキャッシュを構成する方法を説明します。