WordPressデータベース接続確立エラー原因別復旧法

「データベース接続確立エラー」がWordPressのページに表示された場合の原因と復旧方法をまとめています。

サーバの契約状態によって対応できる範囲が異なりますので、「1. レンタルサーバなどサーバ共通編」、「2. VPSや専用サーバ編」に編成を分けて内容をまとめています。原因についてはインストール時や運用時など原因はさまざまですので、診断方法の後に原因別にまとめています。

WordPressのページにデータベース接続確立エラーが表示される

目次

1. レンタルサーバなどサーバ共通編

「データベース接続確立エラー」がWordPressのページに表示された場合の原因と復旧方法についてまとめています。
レンタルサーバにしろ、VPSや専用サーバにしろ、どのサーバを利用していてもまずは以下の確認と対応を行います。

1.0. 「データベース接続確立エラー」の原因を診断する

「データベース接続確立エラー」は、WordPressからデータベースに接続できない場合に起こります。データベースに接続できる状態か、接続情報を記載している設定ファイルの状態などの確認を行っていきます。

wp-config.phpが定位置にあるか

まずは、wp-config.phpが定位置の<WP設置場所>の一番上に存在するかを確認します。何らかの操作で削除してしまったり、名前を変更したままになっていたり、移動してしまったりしていないか確認します。

wp-config.phpが文字化けていないか

wp-config.phpの日本語の記述が文字化けて正しくWordPressが設定を読み込めない状態になっていないでしょうか。

wp-config.phpのバージョンは正しいか

バージョンUP時や移設の際にwp-config.phpを古いものにした場合、記述の追加・変更・削除などバージョン不整合が起こる可能性はないといえません。該当バージョンのwp-config-sample.phpをコピーして、wp-config.phpを作成し、DBの接続先の設定など古いものと同等の設定を行う必要があります。

wp-config.phpのDB設定は正しいか

wp-config.phpの「DB_XXXX」の記述内容は正しいものになっているか確認します。データベース名やパスワードを何らかの理由で変更されたのに反映されていない、などあるかもしれません。今一度現在の設定になっているか確認します。

パスワードが不明な場合はパスワードを設定しなおして、確実にあっていると判断できるようにして確認します。MySQL5.7などはパスワードの有効期限機能がデフォルトでONとなっていたりします。たぶん大丈夫じゃなくて、確実に正しいと判断できるように確認します。

診断まとめ

上記の確認をもとに以下の条件毎の対応を行って復旧していきます。

wp-config.phpが定位置にない

1.1. WordPressの設定ファイルが定位置にない」で復旧します。

WordPressの設定ファイルにバージョン不整合が起きている

1.2. WordPressの設定ファイルに文字化けまたはバージョン不整合が起きている」で復旧します。

接続情報が正しくない場合

1.3. WordPressの設定ファイルの接続情報が正しくない」で復旧します。

それ以外の場合

レンタルサーバの場合はレンタルサーバ提供元に問い合わせます。VPSや専用サーバの場合は2. VPSや専用サーバ編を参考に対応します。

もし上記がよくわからない場合はお問合せフォームでお気軽にご質問いただければと思います。

1.1. WordPressの設定ファイルが定位置にない

「wp-config-sample.php」が使われていると思いこんだり、あれこれやっている内に変更してしまっているかもしれません。

「<WordPressの配置場所>/wp-config.php」ファイルの位置をwp-config.phpという正しいファイル名で、WordPressの配置場所の一番上のディレクトリという正しい場所に修正して復旧します。

1.2. WordPressの設定ファイルに文字化けまたはバージョン不整合が起きている

文字化けが起きたり、バージョンUP時や移設の際にwp-config.phpを古いものにした場合、記述の追加・変更・削除などバージョン不整合が起こる可能性はないといえません。

該当バージョンのwp-config-sample.phpをコピーして、wp-config.phpを行い、DBの接続先の設定など古いものと同等の設定を行います。Windowsなど自分のPCに一旦落としてから作業する場合などFTP転送の文字コードの設定が正しいか注意する必要があります。

1.3. WordPressの設定ファイルの接続情報が正しくない

インストール時の設定ミスや運用時に古いファイルのFTP転送などWordPressの設定ファイルが正しい状態じゃなくなることがあります。

「<WordPressの配置場所>/wp-config.php」ファイルのデータベース接続情報を正しいものに修正して復旧します。

2. VPSや専用サーバ編

レンタルサーバに関しては上記で解決しない場合は、MySQLの異常など利用者側で解決できないことが多いので、レンタルサーバ提供もとに問合せします。VPSや専用サーバでは、それ以外に対応できることがあります。以下にその内容をまとめています。

なお、LinuxやUnix環境を前提に、原因の切り分けや復旧のため、サーバーへのSSH接続が使えるサービスの利用を前提にしています。ssh接続の方法については「ssh接続とは?サーバ担当が不在、緊急時のssh接続方法」にまとめています。

2.0. 「データベース接続確立エラー」の原因を診断する

データベースの接続情報が正しくてもデータベースが停止していたり、ネットワーク上に問題が発生している場合、「データベース接続確立エラー」が発生します。以下ではSSHでサーバーに接続して、データベースやネットワークの状態を確認していきます。

SSHでサーバに接続

SSHでサーバに接続します。

WordPressの設定ファイルの接続情報を確認

WordPressの設定ファイル(wp-config.php)の接続情報の項目が正しく記述されているか確認します。

wp-config.phpの探し方

以下のコマンドでwp-config.phpのパスが確認できます。

# find /|grep wp-config.php
wp-config.phpの確認

以下のコマンドで接続先を確認します。

# cat <WordPressの配置パス>/wp-config.php | grep DB

以下のように表示されますので、データベース領域名、データベースユーザ名、データベースユーザのパスワード、データベースのホスト名またはIPアドレスを確認します。

define('DB_NAME', 'データベース領域名');
define('DB_USER', 'データベースユーザ名');
define('DB_PASSWORD', 'データベースユーザのパスワード');
define('DB_HOST', 'データベースのホスト名またはIPアドレス');
:

MySQLにコマンドラインで接続

以下のコマンドでMySQLに接続できるかを確認します。

$ mysql -h <データベースのホスト名またはIPアドレス> -u <データベースユーザ名> -p <データベースユーザ名>

もし接続できる場合は復旧していると思われます。ブラウザのキャッシュをクリアして、再表示して復旧を確認します。

MySQLのサーバに接続できるか確認

MySQLのサーバに接続できる場合は以下の確認を行います。

MySQLのDBのユーザのアクセス制限の確認

MySQLのrootユーザでMySQLに接続して、DBへ接続できる接続ホストとデータベースユーザを確認します。

データベースサーバでMySQLのrootユーザでMySQLに接続
$ mysql -h localhost -u root -p
MySQLのDBのユーザのアクセス制限の確認
select Host,Db,User from db;
+-----------+-----------------+-----------------+
| Host      | Db              | User            |
+-----------+-----------------+-----------------+
| %         | test            |                 |
| %         | test\_%         |                 |
| localhost | XXXXXXXXXXXX    | YYYY            |
:

%は任意の意味を表す文字です。「| localhost | XXXXXXXXXXXX | YYYY |」はデータベース名「XXXXXXXXXXXX」は「localhost」から「YYYY」ユーザで接続できる設定を表します。

MySQLのプロセス確認

MySQLが動作しているデータベースサーバへSSH接続して以下のコマンドでプロセスの存在を確認します。

# ps -ef |grep mysqld
root     12212     1  0 Jun21 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql    12611 12212  0 Jun21 ?        00:41:04 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --open-files-limit=10000 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
:
MySQLのプロセスが受信待ちしているポートの確認

MySQLが動作しているデータベースサーバへSSH接続して以下のコマンドでMySQLが受信待ちしているポートの存在を確認します。

# netstat -tnap|grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      12611/mysqld
MySQLのプロセスが受信待ちしているポートの制限の確認

セキュリティソフトやサーバのiptablesや経路上のファイアフォールの設定を確認し、MySQLのプロセスが受信待ちしているポートの制限を確認します。WordPressとMySQLが同一サーバ上に配置されている場合は、サーバ外の経路は関係ありません。

診断まとめ

上記の確認をもとに以下の条件毎の対応を行って復旧していきます。

接続情報が正しいが、「ERROR 1044 (42000): Access denied for user ・・・」のメッセージが表示される場合

2.1. WordPressからのMySQLへの接続が許可されていない」で復旧します。

接続情報が正しいが、「ERROR 2003 (HY000): Can’t connect to MySQL server on・・・」のメッセージが表示される、SSHでデータベースサーバに接続できる、プロセスが存在しない、使用ポートも見つからない場合

2.2. MySQLがダウンしている」で復旧します。

接続情報が正しいが、「ERROR 2003 (HY000): Can’t connect to MySQL server on・・・」のメッセージが表示されるまたは応答がない、SSHでデータベースサーバに接続できる、プロセスまたは使用ポートが見つかる、ポート制限がある場合

2.3. MySQLがダウンしている(プロセスあり、ポート制限あり)」で復旧します。

接続情報が正しいが、「ERROR 2003 (HY000): Can’t connect to MySQL server on・・・」のメッセージが表示されるまたは応答がない、SSHでデータベースサーバに接続できる、プロセスまたは使用ポートが見つかる、ポート制限がない場合

2.4. MySQLがダウンしている(プロセスあり、ポート制限なし)」で復旧します。

接続情報が正しいが、「ERROR 2003 (HY000): Can’t connect to MySQL server on・・・」のメッセージが表示されるまたは応答がない、SSHでデータベースサーバに接続できない場合

2.5. MySQLが動作しているサーバがダウンしている」で復旧します。

2.1. WordPressからのMySQLへの接続が許可されていない


WordPressの設定ファイルのMySQLユーザ以外で、権限設定が行えるMySQLユーザでMySQLに接続して、MySQLのユーザの接続設定を見直して接続許可を与えます。

GRANT ALL PRIVILEGES ON <データベース領域名>.* TO <データベースユーザ名>@<接続IPまたはホスト名> IDENTIFIED BY '<データベースユーザのパスワード>' WITH GRANT OPTION;

2.2. MySQLがダウンしている(プロセスなし)

MySQLを起動します。

# service mysqld start

2.3. MySQLがダウンしている(プロセスあり、ポート制限あり)

セキュリティソフトやサーバのiptablesや経路上のファイアフォールの設定などMySQLの疎通に必要なポートの制限を解除します。

2.4. MySQLがダウンしている(プロセスあり、ポート制限なし)

MySQLのプロセスの一部が異常終了した状態、フリーズした状態でMySQLが利用不可な状態になっています。MySQLのプロセスやロックファイルを削除して起動します。

通常のサービス再起動を試す

まずは、以下のコマンドだ復旧を試みます。

# service mysqld restart

手動再起動の実施

通常のサービス再起動がダメな場合は、MySQLのプロセスとロックファイルを手動で削除します。

ロックファイル削除
ロックファイルの場所を確認
# cat /etc/init.d/mysqld |egrep "get_mysql_option"
# Usage: get_mysql_option SECTION VARNAME DEFAULT
get_mysql_option(){
get_mysql_option mysqld datadir "/var/lib/mysql"
get_mysql_option mysqld socket "$datadir/mysql.sock"
get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid"
socketとpid-fileがあるかどうか確認

以下のコマンドで/var/lib/mysql/mysql.sockと表示されることを確認します。

# ls /var/lib/mysql/mysql.sock

同様に以下のコマンドで/var/run/mysqld/mysqld.pidと表示されることを確認します。

# ls /var/run/mysqld/mysqld.pid
socketとpid-file削除
# rm -f /var/lib/mysql/mysql.sock
# rm -f /var/run/mysqld/mysqld.pid
socketとpid-fileがないかどうか確認

以下のコマンドで/var/lib/mysql/mysql.sockと表示されないを確認します。

# ls /var/lib/mysql/mysql.sock

同様に以下のコマンドで/var/run/mysqld/mysqld.pidと表示されないを確認します。

# ls /var/run/mysqld/mysqld.pid
MySQLのプロセスのIDの確認
# ps -ef|grep mysqld
root     12212     1  0 Jun21 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql・・・
mysql    12611 12212  0 Jun21 ?        00:41:17 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql・・・
:

上記の場合、rootのプロセスのIDは12212、mysqlユーザのプロセスのIDは12611となります。

MySQLのプロセスをkill
# kill -9 12212 12611
MySQLのプロセスがなくなっていることを確認

プロセスIDの確認の時と同じコマンドでプロセスがなくなっていることを確認します。

# ps -ef|grep mysqld
MySQLを起動
# service mysqld restart

2.5. MySQLが動作しているサーバがダウンしている

サーバのコンソールに直接接続するなどして、サーバ自体が停止しているか確認し、停止している場合はサーバを起動します。

3. 番外編

「データベース接続確立エラー」は復旧はしたけれども、また「データベース接続確立エラー」が起きる、起きないようにするための内容をまとめています。

3.1. アクセス集中&メモリエラー(Linuxの場合OOM Killer)が発生している

同じサーバ内にWordPressとMySQLを同居させる構成の場合、bot攻撃や急なユーザ数の上昇などでメモリ不足に陥り、MySQLのプロセスがダウンさせられることがあります。

たとえば、Linuxの場合、シスログ(/var/log/messages)に「Out of memory: Kill process 12611 (mysqld) score 79 or sacrifice child」というメッセージが出力されます。メモリ不足の場合にOOM KillerというLinuxの機構がサーバが落ちないように任意のプロセスを落とします。つまり、メモリ不足でOOM KillerがMySQLのプロセスをKill(強制停止)させることがあります。

その場合、サーバーのメモリ容量を増やす、リクエストの処理速度を上げる、サーバ構成を変更する、などの対策が必要です。

単純な性能の見積もり例ですが、1ページのサーバサイドの処理時間が0.5秒(PHP5のWordPressの場合、何もしないとこれくらいが多い)だとしたら、1CPUで秒間2ページ分、攻撃系のボットクロールの耐性を考え、最低秒間30ページとすると、15CPU用意しないとリクエストが滞留して、どんどんつもり、メモリ不足になる計算です。

WordPressはマンモスみたいなPHPファイルを読み込みますので、同じサーバ内にWordPressとMySQLを同居させる構成の場合は、まずはPHPの処理速度に目をつけるべきと思います。例えば、PHP5を使用している場合、PHP7+OPCache+APCuにすることで10倍近く処理速度が向上します。だいたい1ページのサーバサイドの処理時間が0.5秒だったのが0.05秒くらいになります。

PHPの処理速度改善でも解決しない場合は、MySQLなどミドルウェアのチューニング、サーバのCPU、メモリのスペックを上げます。スペックを上げきっている場合は、ロードバランサでクラスター構成にして負荷分散構成を検討します。

参考)CentOS7にApache2.4+PHP7+mysql5.7のLAMP環境構築

CentOS7にApache2.4、PHP7、MySQL5.7をインストールしてLAMP環境を構築する手順をまとめています。特にWordPressを使用する場合はPHP5とPHP7で大違いです。WordPress用のLAMP環境を構築する場合は参考にしていただければと思います。

続きを読む

参考)RedisでPHP7+OPCache+APCu環境のWordPressよりも3倍以上高速化する方法

WordPressは、PHPの速度がサーバサイドの大半を占め、PHPの速度がものをいいます。PHP5をそのまま使うとかなり遅いです。PHP7+OPCache+APCuにするとかなり高速化されるのですが、Redisを使用することでさらに3倍以上も高速化されます。

※注意)本記事ですが、ページがキャッシュされるわけですので、キャッシュされてほしくないページがキャッシュされないか十分に検証が必要です。

続きを読む

参考)mkswapでLinuxのスワップ領域のサイズ拡張

応急的にはスワップを積んで、仮想メモリを増やすのもいいかもいいかもです。

本記事では、Linuxのスワップ領域のサイズをmkswap、swaponコマンドを使用して拡張する手順をまとめています。本記事の例はCentOS7の実施例になっていますが、Amazon Linuxなどでも実績があります。

続きを読む

3.2. アクセス監視して攻撃を受けて落ちる前に対処を

アクセスが集中した場合、最終的にはリソース不足に陥り「3.1. アクセス集中&メモリエラー(OOM Killer)が発生している」の状態になり、MariaDB(MySQL)がダウンし、WordPressにデータベース接続確立エラーが表示されてしまいます。そしてアクセス集中の原因の多くは脆弱性スキャンツールや負荷がけツールによる不正なアクセスです。

サーバのスペックやチューイングのレベルを上げても相手がそれよりも強ければ負けてしまいますので、まずはアクセス監視をしっかりして、レスポンス遅延が起きたらアクセスログを確認して、攻撃相手のIP制限ドロップする運用を取り入れるなどの対策が必要です。監視ツール導入していない場合はオープンソースのnagiosを導入して監視してみるといいと思います。

あと、ossecなんかは監視してIP制限も自動で行う機能があります。こちらもオープンソースですので、空きPCにでも入れてみるのも効果的と思います。ちなみにossecはエージェントを監視対象のサーバにインストールする必要があります。VPSの1G、2Gを利用している場合などはかえって重荷になる場合も考慮が必要です。

参考)監視ソフトNagios、メール解決などナギオスの初期手順

Nagiosは、統合監視ソフトです。読み方は「ナギオス」といいます。
CentOS7へのインストールからメールが飛ばない問題解決などの初期手順をまとめています。

続きを読む

3.3. その他、WordPress関連のリンク

参考)WordPressとは何か&セキュリティリスク要因

WordPressという言葉を初めて知って、どのようなものか知りたい、活用できるか検討してみたい、など、WordPressの開発を検討するときに必要な情報を想定して、WordPressとは何かをまとめています。

続きを読む

更新履歴

  • 2017年04月19日 監視ツールについて追加しました。
  • 2017年01月13日 アクセス集中&メモリエラーが発生している際の対策として参考リンクを追加しました。
  • 2016年08月10日 VPSや専用サーバ向けでしたが、レンタルサーバーでの対応方法に対応しました。
  • 2016年06月27日 記事をUPしました。

もし不明点などありましたら、お問合せフォームでご質問いただければと思います。

SNSでもご購読できます。