ブログのDBがぶっ壊れた

たまたまその日のうちにすぐ気づいたけど、WordPressのDBであるMySQL(MariaDB)が突然壊れてた。何気なくスマホで自分のブログのページを表示させようとしたら、こんな画面。「データベース接続確立エラー」とな。orz

MySQLやOS(Raspbian)のアップグレードでしくじって起動しそこなうことはこれまでも時々あったけど、今日は何もしてないのにな…。ディスクパンクとかかなあ?

と思いながらログを漁ってみると、今日の19時ごろから突然、/var/log/mysql/error.logにこんなログが繰り返し出力されていた。

2021-08-14 19:00:48 3 [ERROR] [FATAL] InnoDB: InnoDB is trying to free page [page id: space=0, page number=20603] though it is already marked as free in the tablespace! The tablespace free space info is corrupt. You may need to dump your tables and recreate the whole database!Please refer to https://mariadb.com/kb/en/library/innodb-recovery-modes/ for information about forcing recovery.
210814 19:00:48 [ERROR] mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.

To report this bug, see https://mariadb.com/kb/en/reporting-bugs

We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.

Server version: ・・・(以下略

なんかバグを踏んでDBファイルが壊れた的な?DBを丸ごとダンプ&再作成しろと…。

うーむ、これは結構深刻な状況か?

最近バックアップサボってたけど最新のバックアップはいつのだっけ??と思って掘り起こしてみると、2018年末だと!?Σ( ̄ロ ̄lll)

最悪の場合、みんカラ側から手動でコピペか…。2年半分もやってられるか!((((;゚Д゚))))

ビクビクしながらリカバリ手順をググってみると、日本語ではここここの情報がヒット。これらの手順を組み合わせて復元にトライだ。

  1. MySQLのサービスを停める
    # service mysql stop
  2. datadir (/var/lib/mysql) を一応バックアップ
    # cp -a /var/lib/mysql /var/lib/mysql_20210814
  3. /etc/mysql/my.cnfを書き換えてInnoDBを強制リカバリモードにする
    ※innodb_force_recoveryは緊急時のみ0より大きい値にする。4以上にするとデータファイルが壊れることがあるので少しづつ上げること。
[mysqld]
innodb_force_recovery = 2
  1. MySQLを強制リカバリモードで起動
    # service mysql start
    ※innodb_force_recovery=1では起動しなかったが2にしたら起動した。
  2. 全データベースをダンプ
    # mysqldump -u root -p -x –all-databases > alldatabase.dump
  3. MySQLをシャットダウン
    # service mysql stop
  4. mysqlフォルダを除くすべてのデータファイルを削除
    # rm -rf `ls -d /var/lib/mysql/* | grep -v “/var/lib/mysql/mysql”`
  5. MySQLを再起動
    # service mysql start
  6. ダンプファイルをリストアする
    # mysql -u root -p < alldatabase.dump
  7. mysqlフォルダに残ったいくつかのファイル(*.ibd)がバッティングしているようでリストアできないようなので、/var/log/mysql/error.logのメッセージに従って該当のファイルを削除する。今回削除したのは多分、gtid_slave_pos.ibd, innodb_index_stats.ibd, innodb_table_stats.ibd
  8. リストア(上の9.)が正常終了したらOK

こちらのページの最後に書かれてた「教訓」はまさにその通り(汗)。今のサーバにしてからやってなかったけど、また定時バックアップのcronでも仕込んでおくか…。

それからこっちのページによると、原因はハードウェア起因ってことらしいので、そろそろサーバのSDカードを入れ替えるべきなのかなあ。。。さかのぼってみたら、このサーバを作ったのは約4年前のようだが、前のサーバのSSDが5年で死んだことを思えば、そろそろってことかな。一応書き込み頻度を抑える工夫はしてるが、SSDじゃなくて普通のmicroSDカードだもんな…。

たぽ
  • たぽ

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください