2026年7月14日
2026年7月14日
WordPressのAPI通信で「Error establishing a database connection」が返る原因と対処
REST API(/wp-json/)や admin-ajax.php、外部アプリからのAPI通信だけが「Error establishing a database connection」で失敗する場合、データベースへの接続数の上限や、データベースサーバーの一時的な停止が疑われます。ページはキャッシュから表示されるため正常に見えても、APIはキャッシュを通らずに毎回データベースへ接続するため、先に症状が表に出るのです。この記事では、API通信に絞って原因を切り分け、接続エラーを減らすための対処を説明します。
なぜAPIだけがデータベース接続エラーになるのか
「Error establishing a database connection」は、WordPressが wp-config.php の設定を使ってデータベースに接続しようとして失敗したときに表示されるメッセージです。REST APIもWordPress本体を読み込んで動くため、データベースに接続できなければ同じエラーになります。
それなのに「APIだけが失敗する」と感じる理由は、主に次の2つです。
- ページはキャッシュで表示されている:ページキャッシュやCDNが有効だと、訪問者向けのページはデータベースに接続せずに返されます。一方、REST APIや
admin-ajax.php、ログイン中の管理画面はキャッシュされないことが多く、データベースの不調がそのまま表に出ます - APIのほうがリクエスト数が多い:ヘッドレス構成のフロントエンド、スマートフォンアプリ、外部サービスとの連携、ブロックエディターの自動保存など、APIは短時間に多数のリクエストを送ることがあります。データベースへの同時接続数が上限に達すると、あふれた分だけが接続エラーになります
API利用者の側では、エラーページがHTMLで返ってくるため「JSONとして解析できない」というエラーに見えることもあります。ブロックエディターで「更新に失敗しました。返答が正しいJSONレスポンスではありません。」と表示される場合も、原因の一つとしてこのエラーが考えられます。
作業前の準備
データベースの設定を変更したり、サーバーの設定を見直したりする前に、データベースのバックアップを取ります。接続が不安定な状態でのバックアップは失敗することがあるため、アクセスの少ない時間帯に行い、出力されたファイルのサイズが不自然に小さくないかを確認してください。
wp db export before-db-check.sql
エラーの出方を確認する
APIの応答を直接見る
まず、APIへのリクエストがどのような応答になっているかを確かめます。curl でヘッダーと本文を確認すると、状況がつかめます(example.com は自分のサイトに置き換えます)。
curl -i https://example.com/wp-json/
正常なら、ステータス200とJSON形式のサイト情報が返ります。ステータス500などとともに「Error establishing a database connection」を含む本文が返るなら、データベース接続の段階で失敗しています。何度か繰り返して、毎回失敗するのか、ときどき失敗するのかを確認します。
- 毎回失敗する:
wp-config.phpの接続情報の誤り、データベースサーバーの停止、ユーザー権限の問題が考えられる - ときどき失敗する:同時接続数の上限、データベースサーバーのメモリ不足による再起動、負荷の集中が考えられる
ブラウザの開発者ツールの「ネットワーク」タブでも、wp-json や admin-ajax.php へのリクエストのステータスと応答本文を確認できます。
デバッグログで接続失敗の理由を見る
画面に出るメッセージは同じでも、接続に失敗した理由はさまざまです。wp-config.php のコピーを保存してから、デバッグログを有効にします。
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
WP_DEBUG が有効な場合、データベースへの接続失敗時の警告が wp-content/debug.log やPHPのエラーログに記録されることがあります。そこに含まれるエラー番号が手がかりになります。
1040(Too many connections):同時接続数が上限に達している1045(Access denied):ユーザー名・パスワード、または接続元ホストの許可設定が誤っている2002(Connection refused、No such file or directory):データベースサーバーが停止している、またはホスト名・ソケットの指定が誤っている2006(MySQL server has gone away):接続中にデータベースサーバーが応答しなくなった
調査が終わったら、WP_DEBUG を false に戻し、debug.log は削除するか外部から読めない状態にしてください。
原因別の対処
接続情報の誤り(毎回失敗する場合)
サーバーの移転やパスワード変更の後であれば、wp-config.php の DB_NAME、DB_USER、DB_PASSWORD、DB_HOST を確認します。API用に別のサーバーやコンテナを立てている構成では、そちらの wp-config.php や環境変数だけ古いままになっていることがあります。WP-CLIで簡単な問い合わせを実行すると、接続できるかをすぐに確認できます。
wp db query "SELECT 1;"
同時接続数の上限(ときどき失敗する場合)
データベースにSSHやphpMyAdminで接続できるなら、現在の上限と、これまでに使われた最大の接続数を比べます。
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
Max_used_connections が max_connections と同じ値になっていれば、上限に達したことがあります。対処は「上限を上げる」と「接続を減らす」の両面から考えます。
上限を上げる場合、MySQLやMariaDBの設定ファイルで max_connections を見直しますが、接続1本ごとにメモリを使うため、むやみに増やすとデータベースサーバーがメモリ不足になります。あわせて、PHP-FPMの pm.max_children など、同時に動くPHPの数がデータベースの上限を大きく超えていないかを確認してください。PHPの同時実行数がデータベースの上限より多いと、負荷が高いときにあふれた分が接続エラーになります。
共用サーバーでは、これらの値を利用者側で変更できないことが多いため、接続を減らす対策が中心になります。
APIへのリクエストが多すぎる
アクセスログで、どのAPIにどれくらいのリクエストが来ているかを確認します。
grep -c "/wp-json/" /var/log/nginx/access.log
grep -c "xmlrpc.php" /var/log/nginx/access.log
grep -c "admin-ajax.php" /var/log/nginx/access.log
ログのパスはサーバーによって異なります。xmlrpc.php への大量のアクセスは、パスワードを総当たりで試す攻撃であることが多く、使っていなければWebサーバーやセキュリティ系プラグインで遮断します。特定のIPアドレスからREST APIへの過剰なアクセスがある場合は、Webサーバーやファイアウォールでの回数制限を検討します。
自分で運用しているヘッドレスのフロントエンドや外部連携が原因なら、取得結果をフロント側でキャッシュする、同じデータを短時間に何度も取得しない、といった呼び出し側の見直しが効果的です。admin-ajax.php へのリクエストが多い場合は、管理画面を開いたままにしたときの定期通信(Heartbeat API)や、プラグインの定期的なAjax通信が原因のこともあります。
データベースサーバーの停止・再起動
同じサーバーでWebとデータベースを動かしている場合、メモリが足りなくなるとOSがデータベースのプロセスを強制終了し、その間だけ接続エラーになることがあります。SSHが使えるなら、次のコマンドで記録を確認します。
dmesg -T | grep -i -E "out of memory|killed process"
データベースのエラーログに再起動の記録が繰り返し出ている場合は、メモリの増設、データベースのバッファ設定の見直し、時間のかかるクエリの改善が必要です。Redisなどの永続オブジェクトキャッシュを導入すると、APIリクエストごとのデータベースへの問い合わせを減らせる場合があります。
エラー時の表示を整える
原因を取り除くまでの間、利用者に表示される画面を整えたい場合は、wp-content/db-error.php を用意すると、データベース接続エラー時にWordPressがこのファイルを読み込みます。API利用者向けには、エラー時に適切なステータスコードを返すことで、呼び出し側が再試行やエラー表示をしやすくなります。ただし、あくまで表示の調整であり、接続エラーそのものを解決するものではありません。
まとめ
API通信で「Error establishing a database connection」が返るときは、次の順で確認します(2026年10月現在のWordPress・MySQL系データベースの一般的な構成を前提にしています)。
- ページはキャッシュで表示され、キャッシュされないAPIで先に症状が出ることが多い
curl -iでAPIの応答を確認し、毎回失敗するのか、ときどき失敗するのかを見分けるdebug.logやPHPのエラーログのエラー番号から、接続情報の誤り・接続数の上限・サーバー停止を切り分ける- 接続数の上限なら、
max_connectionsとPHPの同時実行数のバランスを見直す - アクセスログでAPIや
xmlrpc.phpへの過剰なリクエストを探し、遮断や呼び出し側の見直しで接続数を減らす