一生懸命書いてきた記事、一生懸命加工などをしてアップロードした画像などがある日突然何も表示されなくなったら・・・頭真っ白、顔真っ青・・・ですよね??
滅多にないことだとは思いますが、知人のサイトでこの現象が発生し、「何とかしてくれ~~」と修復を依頼されました。
サイトの管理画面を見させてもらうと
- 投稿一覧が空っぽ(1件も記事がない!!)
- 投稿一覧が空っぽ(1件も記事がない!!)
- メディアの画像一覧が空っぽ(1つも画像がない!!)
- 固定ページの一覧が空っぽ(1つも固定ページがない!!)
- 投稿の新規公開・編集後の更新ができない(プレビューすら不可)
- メディアのアップロードがエラーになる
という状況、以前に同じことが起こってレスキュー業者に頼んで修復してもらったそうで、いろいろ聞いても本人としては「何もしてないのに・・・」と、不具合が発生する要因に思い当たる節がない状態でした。
話を最初に聞いたとき一旦そのサイトのフロントエンドを見たところ、一部の記事を除いて表示されているようなされていないようなという感じでオールオアナッシングの状態ではなかったため、多分パーマリンクのリライトが何等かの形で不具合を起こしたんだろう・・・と思ってました(結局結果は全然違いましたけど・・・)。
私自身が管理するサイトでは発生した経験がなく、希なケースだと思いますが、それでも突然こんな状況になった・・・という方の参考に、そしてもしも私のサイトで同じ現象が起きたときのために備忘録として確認方法と対処方法を紹介しておきます。
お断りしておきますが、これと同じ現象が起きたらすべてこの対処でいい!!というわけではなく、あくまでも現象の1つですので悪しからず。
一部のページがフロントエンドで表示されたのはなぜ?の解明
WordPressのサイトそのものに何等かの障害があるのであれば、前述したようにオールオアナッシング(動くか動かないかのどちらか)になるはずなのに、一部が・・・というところが最初に引っかかりました。
が、この現象のからくりは・・キャッシュ系プラグインが有効になっていたことでした。
フロントエンド側をよく見ると
- 不具合発生前に公開または更新されている記事については問題なく表示される
- 不具合の発生前後に編集したものや公開したものについては404エラーが出る
- キャッシュ系プラグインでは生成されないカテゴリー一覧なども404エラーになる
という状況のようでしたので、3つ目の項目でピーーーンと来ましたね。
これでオールオアナッシングにならない問題はクリア!!ってまだ何が原因でどう修復するかは不明状態ですけど・・・。
エラーが発生した原因は何??
それじゃあ何が原因なんだろう・・・で現象をもう一度精査すると、どうやら何かを追加するときのID付加、データ行の挿入などがすべて不可のよう。
・・・ははーーん、多分データベースに何かあるんだろうなぁと想像しました。
そして見てみると・・・ビンゴ!!postsテーブル(投稿データを保存するテーブル)がロック状態のままになっていました。その時のスクリーンショットがこちら
ちょっと脱線して解説すると、WordPressは投稿などほとんどの情報をデータベースと言われる箱へ保存し、何かをするたびにそこからデータの出し入れを行うCMS(コンテンツマネージメントシステム)というホームページ作成ツールです。
そしてそれぞれの処理をする場合には、
- 〇〇してちょーだいという命令を受ける
- データベースではその命令に対する処理を行うため関係のあるデータをロック(他からの編集を禁止)する
- 命令に対する処理を行う
- 処理が完了したら別の命令に対処できるようにロックを解除する
- ・・・
というのをアクセスされる度に、管理側で何かをする度にせっせせっせと行っています(働き者です・・)。
今回は投稿データを格納する「posts」という箱で、上の流れのロック解除前に何か不具合が起きて処理がストップしてしまったというのが原因でした。
ちなみにこのテーブルをクリックして中身を表示しようとすると
と「データベース内の〇〇というテーブルが壊れてます。修復してください」というメッセージが表示され、中身を見ることはできません。どうやら修復を試みるしかなさそうです(修復方法については図説で後述します)
もう1つなぜこのロック状態になってしまったのかについてですが
- 本当に天文学的な同時タイミングで処理が走った
- 書き込もうとしているサーバースペースに余裕がなかった(サーバーのデータ容量オーバー)
- データベースが誤動作した
のいずれかで、エラーログなどを見るとヒントがありそうですが、今回のサイトが収容されているサーバーではログ機能がなかったため原因の特定には至りませんでした・・・。
長々と道程を書いてしまいましたね、それでは今回のような現象が起きたときの確認方法と対処方法を紹介していきます
データペースにエラーが出ているかの確認・修復の流れ
データベースに接続する情報を入手する
WordPressの基本的な情報やデータベースとの接続情報などはサイトの「index.php」があるのと同じ場所(ディレクトリ)にある「wp-config.php」というファイルに書かれています。
データベースの操作を行うためには接続情報が必要ですので、FTPクライアントツールやサーバーのファイルマネージャーを使って、該当サイトの「wp-config.php」をダウンロードします。
このファイルの重要性を十分に理解し、扱いに慣れていればファイルマネージャーなどで直接このファイルを開いて情報だけを使うということもできますが、誤って編集などしてしまうとサイトが表示できなくなる可能性がありますので、別の場所へダウンロードしたものを参照することをおすすめします。
ダウンロードが終わったら次へ進みましょう。
☆該当サイト?「wp-config.php」?という方は☆
何も知識なく自動インストールされている場合や複数のサイトを同じサーバーに設置している場合などでは、たくさんフォルダがあってどこが該当サイトなのか分からなくなることがあります。
誤ったデータをバックアップしても仕方がないので特定できないときはプラグインの力を借りてそのサイトが接続しているデータベースの情報を入手しましょう。
一番おすすめはWP Config File Editorです。プラグイン名で検索するか上記リンクから入手してインストール&有効化してください。
有効化したら「WPCF Editor」をクリックし、出てくる画面で「Preview」をクリックします
これでそのサイトの接続情報が見える(wp-config.phpをダウンロードして表示した状態と同じ)ので、そこから必要な情報を取得してください。
セキュリティ上の理由から、情報の入手が完了したらプラグインは停止、削除しましょう
このプラグインはサイトの接続情報を表示し、編集までできてしまうものです。意味も分からず編集してしまうとサイトに接続できなくなりますので、確認のみ行う場合、絶対に「SAVE」ボタンはクリックしないでください。
データベースの状況を確認する
順を追って画像を使いながら紹介していきます。先ほどダウンロードした「wp-config.php」を開いておきましょう。
必要となる部分は画像赤文字の情報です。以後の解説で同じ単語を使っていますので参照しながら進めてください。
1.データベースの編集ツールを開く
サーバー内にあるデータベースの内容を参照したり編集したりするには「pypMyAdmin」というサーバー内ツールを使用します。「pypMyAdmin」は通常メンテナンスツールとしてサーバーのコントロールパネル(サーバーパネルなどとも呼ばれます)にメニューがあり、そこから接続情報を用いてデータベースの中へ入ります。
サーバーによっては「pypMyAdmin」の使用を禁止していたり、使用する際には自身でこのツールをインストールする必要があるときがありますので、それらのスキルがなければ自身での修復はあきらめ、プロにお任せした方がいいでしょう。
「pypMyAdmin」を開くと
というログイン画面が開きますので、「wp-config.php」の「ユーザー名」「パスワード」、サーバーによっては「接続するホスト名」をコピーしてログインしてください。
2.サイトが使用しているデータベースを開く
ログインに成功すると先ほどのユーザーが管理しているデータベースの一覧が画面左側に表示されます。
「wp-config.php」に書かれている「データベース名」と同じ名前のリンクをクリックします。
すると、右側の画面にずらっと一覧が表示されます(これらをテーブルと言います)から、
のようにエラーとなっているテーブルがないかを確認します。
3.エラーの出ているテーブルを修復する
修復自体はデータベース(MySQL)のツールに頼ることになります。前述したように何がどうなってエラーになったのかが今回は判明しなかったので、天に任せて修復してもらうしかありません(笑)。画像のような感じで修復を進めます。
まずエラーが出ているテーブルの左のチェックボックスをONにします。
次に画面下の方にある「チェックしたものを」をクリックし、「テーブルを修復する」をクリックします
・・・しばらく待つと画面が変わり、緑色の成功メッセージ(スクショ撮り忘れました・・)が出たら修復完了です。
※成功するとエラー表示されていた「使用中」が消え、データ量も復活します
※今回はうまくいきましたが、赤い失敗メッセージが出た場合には残念・・もしくは別の対応が必要となります
以上がデータベース内の確認方法と、エラー発見時の対処方法となります。
手順としては非常に簡単ではあるものの、復旧できない場合もあるでしょうから、大切なデータを守るためにもバックアップを行うようにしましょう。
おまけ 壊れたテーブルをバックアップしても無駄
今回の対応で試したのが、壊れたテーブルを含め、別のデータベースに移行して見たらどうなるのか?ということ。もしも実サイトで修復に失敗したら本当に2度と元に戻せなくなるという懸念からの実験でした。
結果は・・・残念!!エラーの出ているテーブルはインポートできませんでした。
まあ当たり前と言えば当たり前ですけどねぇ。今回のようなエラーの場合は「バックアップがあるから安心」ということはなく、MySQLデータベースの修復機能頼みということになります。つまり一か八かということですね。
そうならないためにも正常に稼働している状態でデータベースのバックアップを取っておけば、今回のように修復しなくても、一旦テーブルを全部削除してバックアップの復元を行えばおしまい!!
バックアップからエラーが出るまでの間の情報はなくなってしまいますけどサイトが壊れてしまうよりはよっぽどマシですから、皆さんも転ばぬ先の杖としてきっちり復元できる状態でデータベースのバックアップを取るようにしましょう!!
データベースを確実に(手動で)バックアップする方法は
で紹介していますのでよかったら読んでみてくださいね。