質問: 現在apache2.2、postgresql8.3.3、PHP5.3を利用しております。 起こった現象は表題の通りですが、以下に行った操作を列挙します。 ・新たにシステムへ手を加えるにあたりデータベースのバックアップを行うべくpg_dumpを発行した。 ・始めは問題なかったが、15分ほど経過した頃システムにつながらないことを確認。 ・pg_dumpをCtrl+Cで中断。 ・topコマンドで確認したところ、load averageが50くらい、cpu消費がsy20,waが70程度、またスワップ領域をかなり利用していた。 ・psコマンドで確認したところ、大量のselectプロセスが溜まっていた。 ・しばらくしたところサーバが応答を受け付けなくなった。 ・再起動を行ったが、新たにselectプロセスが発生しすぐにサーバが操作不能の状態になった。 ・再度再起動を行い、postgresqlを停止したところ、操作可能の状態に復帰した。 ・その後、また再起動したところ問題なくシステムが稼働している。 以上のようなことが起こったのですが、その後の調査でも再現せず、原因がつかめておりません。 以上の時システムは稼働中であり、利用者がいくらかいたと思われます。 またpostgresqlのログを確認したところ、その前後で大きなデータのupdateとselectが何度か走っていることがわかりました(一件当たりが大きく、5万文字のデータ)。 ちなみにpg_dumpは毎日利用者の少ない時間に走っており、特にエラー等は出ておりません。 環境は以下の通りです。 Apache 2.2 Postgresql 8.3.3(データベースのサイズは、ダンプしたところ数十Gほど) PHP 5.3 メモリ 16GB どなたかお力を貸していただけないでしょうか。 よろしくお願いします。
回答: ロックモードを洗い出して見てみると目星が付くかもしれません。 pg_dump は `ACCESS SHARE モード` でテーブルレベルのロックを取得します。 `ACCESS SHARE モード` は 次の場合に衝突します。 * `ALTER TABLE` `DROP TABLE` * `VACUUM` * `ACCESS EXCLUSIVE モード` で明示的にロックを取得したばあい * モードを省略した場合 (暗黙的に `ACCESS EXCLUSIVE モード`になる) *余談* pd_dumpのマニュアルが良くない(と私は思っている)のですが `pg_dumpは他のユーザによるデータベースへのアクセス(読み書き)をブロックしません` と書かれているので、一見、運用中でも影響なく取得できそうに思えますが、実際はロックモードの関係で排他制御が行われる可能性があります。