Word Press データベース接続エラー の 復旧作業 …
先日、起床後に自分のブログを確認したら「データベース接続エラー」なる表示が出て大慌て!前日の夜までは普通に稼働していたんですけどね!?
慌ててVPSコントロールパネルでWordPressを運用しているVPSの稼働状況を確認してみてもVPS自体は通常稼動してますし、履歴を見てみても
特に負荷がかかっていた訳でもなく
原因も判らないまま(汗)
取急ぎ、復旧作業に入ったのでありました!
その備忘録です…
WordPress データベース接続エラー
まず表示されていた「データベース接続エラー」ですが、読んで字の如くデータベースに「接続」する際に何らかのエラーが発生してますよ!?という意味らしいですね!?
WordPresss公式で確認してみると
wp-config.php内の不正な情報やWEBホストの問題、WEBサイトのハックなど(最後にサラッと怖い事が書いてありますね!?)とありましたが
今回は第三者によるサイトの改ざんやVPSの不具合もありませんでしたので
概ねチェックすべき所は
- wp-config.phpに記載されたMySQLとの接続情報に変更はないか?
- そもそものデータベースが壊れていないか?
以上の2点らしいです…
wp-config.php ファイルの確認
wp-config.phpファイルの内容には
- データベース名
- データベースのユーザー名
- データベースのパスワード
- データベースのホスト名
などのMySQLとの接続に必要な情報が記載されています!WordPressを設置する際に設定した内容ですね!?
ちなみに
wp-config.php ファイルの置いてある場所は(これは自分の為の覚書w)
1 |
/var/www/html/wordpress/wp-config.php |
wp-config.phpファイルなんてWordPressの設置作業をして以来、いじってませんから何もしていないのに急に内容が書き換えられるとは考えられません(汗)
一応、sshでVPSに繋ぎ
wp-config.phpファイルの中身を確認しましたが
案の定、問題なし!
書き換わっていたらそれこそWEBサイトのハックですw
そうなると
使用しているデータベース(MySQL)自体の不具合を懸念しなければなりませんが、まずはデータベースの何が壊れているのか?探し出す必要がありますよね!?
7つの手順で問題解決! データベース接続エラー の 修復方法
実際の修復作業の内容は割愛しますが、データベース接続エラーが発生した際の確認修復の手順を大まかに記載してみました!以下7つの手順で簡単修復です!
これで修復できない場合は
もっと詳しい人の記事を参考にして下さい(汗)
<(_ _)>
今回の作業の流れですが
データベースから問題のあるテーブルを特定して、バックアップ(ダンプリスト)から特定したテーブルのみ抽出し、問題のあるテーブルのみ復元しよう!というものです!(前回挫折した奴ですね!?)
ちなみに
agehaは、phpMyAdminなどはセキュリティの関係から使用していませんので、データベースのチェックも修復もコマンドラインを打って対応していく予定です!
また下記の修復手順において
WordPressのデータベース → database
データベースのバックアップ → blog_bp
と、実際のファイル名を置き換えて記載させて頂きます!
まずは
1 MySQLのログを確認
1 |
/var/log/mysqld.log |
MySQLのログは上記の場所に保管されていますので、エディターなどで開いて何のエラーが出ているのか?原因を特定していきます!
(管理者権限で実行しましょう)
1 |
# sudo -s |
MySQLのログを辿っていくと
前日の午後より頻繁に「wp-options」という項目でerorrとripairを繰り返していました!
wp-optionsテーブル
WordPress公式で調べてみると、どうやら?設定されたオプション設定情報を格納(プラグインの設定情報が格納されることも多い)しているテーブルのようです!
こんな感じで
問題のありそうなテーブルが見つかりましたので以下の流れで作業を進めて行きます!
2 MySQL テーブルのチェック
1 |
# mysqlcheck -C blog_db wp_options -u root -p |
コマンドラインからmysqlコマンドで指定したテーブルの状態を確認!
1 |
mysql> check table wp_options; |
mysqlに入ってからも同じように checkコマンドで確認できます…
3 MySQL テーブルのリペア
1 |
mysql> repair table wp_options; |
一応、mysql上でリペアできないか?コマンドを打ってみましょう!
repairコマンドで治る場合もあるらしいですが、リペア出来なかった場合はバックアップ(全体のダンプリスト)から問題のあるテーブルのみ抽出して修復します!直近で保存したダンプリストがあるのであれば
データベース全体を一括で復元しても良いのですが
今回、それをやってしまうと1〜2つ最新の記事(コメント含む)が消えてしまいそうだったので、苦肉の策で問題のあったテーブルのみを抽出して復元して行く予定です…
4 MySQL ダンプリストの内容を確認
1 |
$ egrep -in '^drop table if exists' blog_bp.sql |
database のバックアップファイル: blog_bp.sql の内容(行数)を調べましょう
1 2 3 4 5 |
~中略~ 333333:DROP TABLE IF EXISTS `wp_nxs_log`; 444444:DROP TABLE IF EXISTS `wp_options`; 555555:DROP TABLE IF EXISTS `wp_popularpostsdata`; ~省略~ |
テーブル wp-options を発見!上記(行番号はダミー)から、どうやら444444行から555554行(555555からは次のテーブル)までが wp-options のデータという事が判明しました!
5 MySQL ダンプリストからテーブルを抽出
1 |
$ sed -n '444444,555554p' blog_bp.sql > wp_options.dump |
sedコマンドで行番号(始めと終わり)を指定してテーブルデータを抽出し、テーブル名(wp_options.dump) という指定したテーブルのみのファイルを作成します!
6 抽出したテーブルを MySQL のデータベースへ復元
1 |
$ mysql -u root -p database < wp_options.dump |
作成したテーブルファイル(wp_options.dump)を使用してdatabaseへ復元(テーブル名を間違わないように注意)
7 MySQL 修復したテーブルの確認
1 2 3 4 5 6 7 |
mysql> check table wp_options; +---------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+----------+ | database.wp_options | check | status | OK | +---------------------+-------+----------+----------+ 1 row in set (0.00 sec) |
念の為、復元されたテーブルが正常かどうか?確認して終了です!
今回、参考にさせて頂いたサイト
とても参考になりました!どうもありがとうございました!<(_ _)>
勿論、問題のあった wp_options テーブルの修復が終了したらサイトも正常に稼働しました!どうやら?テーブル更新中にMySQLのプロスが停止してしまうと発生しやすいみたいですね…
特に
wp-optionsというテーブルは壊れやすい
(何故?)
そうなので
データベース接続エラーが出てしまったら真っ先に疑ってもいいみたいですね!?(汗)
おまけ: 作業中の失敗談(笑)
1 MySQL データベースのチェック時
1 2 3 4 5 6 7 8 |
# mysqlcheck -C database wp_options -u root -p Enter password: database.wp_options warning : Table is marked as crashed warning : 43 clients are using or haven't closed the table properly error : Record at pos: 590416 is not remove-marked error : record delete-link-chain corrupted error : Corrupt |
エラーの内容をちゃんと理解すれば、また違った対処方法もあったのでしょうか?今回は半分パニックになりながらの作業だったので
気にせず前に進みましたが…(笑)
2 MySQL バックアップファイルの作成
1 2 3 |
$ mysqldump -u root -p database > blog_bp_20180119.sql Enter password: mysqldump: Got error: 145: Table './database/wp_options' is marked as crashed and should be repaired when using LOCK TABLES |
念の為、作業を行う前にデータベースのバックアップファイルを作成しようとしたら wp-options テーブルでエラーが出ていて
バックアップ出来ないよ!!
と、怒られました…orz
3 MySQL テーブルのチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> use database; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> check table wq_options; +---------------------+-------+----------+--------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+--------------------------------------------+ | database.wq_options | check | Error | Table 'database.wq_options' doesn't exist | | database.wq_options | check | status | Operation failed | +---------------------+-------+----------+--------------------------------------------+ 2 rows in set (0.00 sec) |
えぇっと、何度チェックしても
Table ‘database.wq_options’ doesn’t exist
doesn’t exist って何だよ!?
と、思わずググってしまいましたが
そんなテーブル存在しないよ!?(爆)
との事ですが、当たり前です!
(誤)wq_optionsじゃなくて(正)wp_options
正確には「これ」に似た勘違いですw
ですからね!?(笑)
この時点ではタイピングしたテーブル名が間違っている事には気付かずに「存在しないなら上書きしちゃってもいいんじゃない?」と
こんな感じで
ミスがミスを呼び、もう該当テーブルだけバックアップから抽出して復元するしかないのかな?という流れになったのでありました…orz
スポンサーリンク