質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.79%

データベースエラーが頻発しており、原因を調査、解決したいです。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,357

score 12

前提・実現したいこと

現在WEBサイトを運営しているサーバー上で
データベースエラーが頻発しております。
サーバーをrebootすれば一時的には解決され
サイトが表示できるようになるのですが、
しばらくするとまたエラーになってしまいます。

こちらの問題の根本原因を調査し、解決したいのですが
サーバー、データベースが素人なので方法がわかりません。
ご協力お願いいたします。

利用環境
【サーバー】さくらのVPS
【OS】CentOS Linux release 7.5.1804 (Core)
【Apache】Apache/2.4.6 (CentOS)
【php】PHP Version 7.1.20
【DB】mysql  Ver 15.1 Distrib 5.5.56-MariaDB
【CMS】wordpress

発生している問題・エラーメッセージ

Error establishing a database connection


サイトにアクセスすると上記のエラーメッセージが表示されます。
またエラー発生時にphpMyadminにアクセスしようとすると、アクセスを拒否されてしまいます。

また、サーバーをrebootで再起動をすると、
apacheが落ちてしまう問題も発生しており
systemlctl start httpd.service 
こちらでapacheを再起動して、一時的に元の状態に戻しております。

試したこと

さくらインターネットに問い合わせたところ
「クエリが溜まってしまってエラーが起きているので、サイトの作り方に問題がある」
とのような指摘を受けました。

また、通常時にphpMyadminから負荷状況を確認すると
以下のような動きをして、その直後にエラーになってしまいました。
phpMyadminから

調査中の内容

ワードプレスで投げているクエリ
クエリ

ssl_error_logに出て来た内容(一部編集、省略しています)

PHP Warning:  mysqli_query(): MySQL server has gone away in /var/www/html/wp-includes/wp-db.php on line 1924, referer: https://xxx.jp/wp-login.php


wp-db.phpの内容

1923 if ( ! empty( $this->dbh ) && $this->use_mysqli ) {
1924 $this->result = mysqli_query( $this->dbh, $query );


error_logに出て来た内容

[Tue Feb 19 20:40:09.197235 2019] [auth_digest:notice] [pid 1369] AH01757: generating secret for digest authentication ...
[Tue Feb 19 20:40:09.198151 2019] [lbmethod_heartbeat:notice] [pid 1369] AH02282: No slotmem from mod_heartmonitor
[Tue Feb 19 20:40:09.352513 2019] [mpm_prefork:notice] [pid 1369] AH00163: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.1.20 configured -- resuming normal operations
[Tue Feb 19 20:40:09.352571 2019] [core:notice] [pid 1369] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Tue Feb 19 20:58:11.618087 2019] [mpm_prefork:notice] [pid 1369] AH00170: caught SIGWINCH, shutting down gracefully
[Tue Feb 19 21:00:06.554993 2019] [suexec:notice] [pid 917] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Feb 19 21:01:27.270616 2019] [auth_digest:notice] [pid 917] AH01757: generating secret for digest authentication ...
[Tue Feb 19 21:01:27.271686 2019] [lbmethod_heartbeat:notice] [pid 917] AH02282: No slotmem from mod_heartmonitor
[Tue Feb 19 21:01:27.412179 2019] [mpm_prefork:notice] [pid 917] AH00163: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.1.20 configured -- resuming normal operations
[Tue Feb 19 21:01:27.412242 2019] [core:notice] [pid 917] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

横から失礼します。

CMSがwordpressということなのでインストール・有効化したプラグイン群の中に重たいクエリを実行しているのではないでしょうか?
自作プラグイン・導入したプラグインの中でクエリを投げている部分がないか調べ、apacheのログファイルでエラーが頻発している時間・対象URLを確認していけばきっと解決できるはずです!頑張ってください

サーバーをrebootで再起動をすると、apacheが落ちてしまう問題も発生しており...

こちらはapacheの自動起動設定を行うことで解決するのではないでしょうか?
「apache 自動起動 centOS7」などで調べて頂くと色々と情報が出てくると思います(既に設定済みでしたら申し訳ないです、、)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/19 21:49 編集

    ワードプレスが投げているクエリの一覧と、エラーログの内容、エラーにあったwp-db.phpの内容も確認してみましたが、僕の知識、技術力ではわかりませんでした。(追記しております。)
    見る箇所が違っているのか、見る箇所があっているが内容を理解していないのかもわからない状態です。
    素人質問で大変申し訳ありませんが、見る箇所を間違えているか、みている箇所はあってるとすれば、どういった問題が確認できるか、教えていただけないでしょうか?

    キャンセル

  • 2019/02/20 10:06

    (横から...)

    WordPress のクエリですが、83個で 0.0658 秒であれば、極端に遅いクエリはなさそうですね。

    キャンセル

  • 2019/02/20 18:49

    CHERRY様
    ありがとうございます。

    同じような事例をネットで調べていたところ
    WPプラグインの機能を使って解決することができました。
    ご協力ありがとうございました

    キャンセル

+1

単純に考えると、
データベースとのコネクションをクローズしないまま、次のオープンを行っている
パターンに見えます。

プログラムの中でデータベースとのコネクションをどう処理しているか確認しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/19 21:25

    scsi様
    ありがとうございます。勉強してみます。

    取り急ぎ本件の解決を最短で行いたいため、本ケースにおける解決方法、調査方法をご存知でしたら教えていただけると助かります。
    ※他の方のご指摘を踏まえて、ワードプレスが投げているクエリの一覧と、エラーログの内容を追記してみました。

    キャンセル

  • 2019/02/19 22:05

    私はデータベースエンジニアではないのでss,iostat,top,iostat,psコマンドの結果やsyslogから当たりをつけます。手っ取り早く解決したいならクラウドワークスなどでお金払って解決してもらうのがいいかと思います。

    キャンセル

  • 2019/02/20 18:49

    scsi様
    ありがとうございます。

    色々調べましたが原因は特定できませんでした。
    ただ、別ルートで同じような事例をネットで調べていたところ
    WPプラグインの機能を使って解決することができました。
    ご協力ありがとうございました

    キャンセル

+1

取り急ぎ本件の解決を最短で行いたいため、本ケースにおける解決方法、調査方法をご存知でしたら教えていただけると助かります。

残念ながら、質問の内容では情報が少なくて回答できる内容ではないので、一般論で....


設定が間違っていない(直前まで稼働していて変更していない)状態で急に

Error establishing a database connection

のようなエラーが発生する状況だとプロセス数が多すぎることによるメモリ不足が原因と思われます。

-- 

Web サーバーのアクセスログを調べると負荷が高くなるあたりから急激にアクセスが増えていたりしないでしょうか?

/wp-login.php へのアクセスが多いのであれば、「ブルートフォースアタック(パスワード総当たり攻撃)」を受けている可能性が高いでしょう。

不正なアタック攻撃ではなく、普通のコンテンツへのアクセスが多いのであれば、サーバーのスペックを見直すか現在のスペックに合わせてメモリ不足にならない程度に接続数を絞るなどの対策が必要です。

古いバージョンの WordPress だと XSS を狙われた可能性もありますが...

また、さくらの VPS の下位プランだと MySQL と Apache のプロセス数等の設定が CentOS の yum でインストールしたデフォルト設定のままの場合、WordPress へのアタック攻撃等の多数のアクセスがあると 同時アクセスの上限に引っかかる前にメモリ不足になり、メモリスワップが発生して負荷が急激に高くなりますが、この状態になっているのではないかと思います。

-- 

対策ですが...

■ /wp-login.php への不正アクセスであれば、 firewalld 等で 不正にアクセスしてくるIPアドレスからのアクセスを遮断する。

■ さくらの VPS なら SiteGuard Lite が使えると思いますので、導入する。( CMSのセキュリティ対策 ~SiteGuardシリーズでセキュリティ強化(その3)~ 参照 )

■ スペックに合わせて apache / mysql ( mariadb ) の設定を最適化する。or サーバのプランを見直す。

などでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/20 18:56

    CHERRY様

    重ねて御礼になりますが、
    詳しくご説明いただきましてありがとうございます。

    一時的には解決いたしましたが、引き続き調査を続け、スケールアップ等も検討してみます。

    キャンセル

check解決した方法

0

http://netaction.hatenablog.jp/entry/2016/05/21/215343
こちらの記事を参考に
ワードプレスのプラグイン「WP-DBManager」を使って
repairを実施したところ、エラーの頻発が止まりました。

完全な原因特定とまでは至っておりませんが、これで一旦解決と判断しました。

情報提供をしてくださった皆様、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る