InnoDB が破損したので修復を試みたところ MySQL 全体が不安定になってしまった。そこから一部のデータを捨てて復旧に至る。
このブログは Movable Type を管理システムとして使っていてデータベースは MySQL である。このブログサーバには,ネットワーク監視システム Zabbix も導入していてデータベースは MySQL である (nlog(n): Zabbix 2.0.1 のインストール)。つまり,MySQL には2つのデータベースが入っている。
Zabbix を一旦導入したものの,システム更新した時には再インストールせず,そのままにしてあった (nlog(n): サーバの OS を Vine Linux 4.2 から 6.2 へ更新)。そしてこの度,監視してグラフ化したいものが出てきたため,Zabbix を再インストールした。ところが動作がおかしい。データベースが破損しているようだった。そこで,mysqlcheck コマンドを使ってデータベースを修復したところ (MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.3 mysqlcheck — テーブル保守プログラム),MySQL 全体が不安定になってしまい,Movable Type まで動作しなくなってしまったのである。
動作環境は,Vine Linux 6.2, MySQL 5.1.73, mysqlcheck 2.5.0, Zabbix 2.0.9 である。
MySQL の症状としては,ソケット経由での接続ができないというものだった。データベースのあるサーバで mysql コマンドを入力すると次のメッセージが表示された。
しかし,少し待ってから再度 mysql コマンドを入力すると,今度は接続できるのである。接続できないときには /var/lib/mysql/mysql.sock が消えていて,少し待ってみるだけで自動的に復活する。つまり,mysql.sock が消えたり生成されたりを繰り返していた。ただし,mysqldump による Zabbix データベースのバックアップには必ず失敗していた。
ハードディスクが不調だったときに破損したのだと思われる (nlog(n): 自宅サーバのハードディスクが死にかけ)。
この現象に,どのように対処するのがよいのか。Zabbix データベースをバックアップしようとすると必ず同じ場所でエラーとなることから,Zabbix データベースに問題があることは確実である。一番簡単なのは Zabbix データベース全体を削除し,最初から登録しなおすことである。ただ,どうせ削除してなおるなら,その前にいろいろやってみてからでも遅くない。そこで,データベースの修復を試してみて,どうしようもなくなった時点で諦めて作りなおすということにした。
流れは次の通り。ここで扱うデータベースは Zabbix が使う innoDB のみである。Movable Type は対象外として特に何もしない。最後に動作確認をするくらいである。
Zabbix が扱うデータベースエンジンは InnoDB である。InnoDB の修復をマニュアルに沿って行う (MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.19.2 InnoDB のリカバリの強制的な実行)。
MySQL の設定ファイル /etc/my.cnf を編集して設定値を変えながらバックアップを試していく。
設定値を変更したら,MySQL を再起動してバックアップを試す。
innodb_force_recovery の値を 2, 3, 4 まで変えながら MySQL を再起動して試したが,バックアップはすべて失敗した。
少なくとも「history」テーブルに問題があるのは確実なようだ。そこで,このテーブルを削除することにした。
そして同じ手順でバックアップを試していく。
「innodb_force_recovery = 1」では失敗。そこで「innodb_force_recovery = 2」としたところ,
バックアップに成功した。
Zabbix データベースをまるごと削除する。しかし,以下のように1回目は失敗し,続けて同じコマンドを入力すると2回目は成功した。
MySQL サーバを止めて InnoDB 関連のファイルを削除 (戻せるように移動) する。削除対象は ib_logfile0, ib_logfile1, ibdata1, localhost.localdomain.err である。
innodb_file_per_table を有効にすると,データベースの肥大化が防げるという。これはデータベースを構築する前に指定しておく必要がある。Zabbix データベースを削除した今,絶好の機会だと言える。データベースのバックアップは完了したので,innodb_force_recovery を無効にし,innodb_file_per_table を有効化する。
上の実行結果は,表記が分かりづらくなっている。vi の前の「#」は root のプロンプト,innodb_force_recovery = 2 の前の「#」は設定ファイル内のコメント記号である。
MySQL を起動し,バックアップした Zabbix のデータベースをリストアする。ただし,バックアップには history テーブルが削除されているため不完全であるので,リストアする前に Zabbix データベースを初期化再構築しておく必要がある (1 データベース作成スクリプト [Zabbix Documentation 2.0])。
MySQL に複数のデータベースがある場合,どれか1つのデータベースに問題があると MySQL 全体が不安定になることがある。mysqlcheck で修復すると障害がより深刻になることがある。
Posted by n at 2016-07-05 21:50 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957