MySQLエラログで”InnoDB: Serious error! InnoDB is trying to free page though it is already marked as free in the tablespace! Assertion failure in thread in file fsp0fsp.c line mysqld got signal 11″

 

この記事で

症状

原因

解决策

リカバリ

今後同じようなことが起こることを防ぐ

リファレンス

 

適用範囲:

MySQLサーバのバージョン5.1以上

このドキュメントの情報は、すべてのプラットフォームに適用可能である。

Checked for relevance on 07Feb2013

 

症状

MySQLが実行中のInnoDBストレージエンジンで再起動できない。MySQLエラログにこのようなエラが現れる:

InnoDB: Serious error! InnoDB is trying to free page 11200

InnoDB: though it is already marked as free in the tablespa ce!

InnoDB: Assertion failure in thread 16363778 in file fsp0fsp.c line 2981

mysqld got signal 11 ;

 

ページ番号とスレッド番号の整合性がなくなる。fsp0fsp.cソースコードファイルの行が違っているが、ファイルが同じになる。

 

原因

可能な原因は三つがある。可能性高いから低いまでの順で配列する;

  • 電源が切れた、書き込みバッファーが起動した、あるいは書き込みコントローラーが実行しているバック電池のディスクドライブがないからである。
  • 二つのMySQLバックアップが同じInnoDBデータファイルと仕事をすると試している。
    • 同時に運用される二つMySQLバックアップのエラログの起動情報をコピして、時間スタンプを確認して、ロックするという方法はこのエラを避けられる。
  • InnoDBプラグインバーションのblobストレージのレアエラはMySQL 5.1.51と5.7でリカバリされた。この一連のbugsにはこういう場合も含んでいる:Bug:11762662, Bug:11762893, Bug:11763287

 

症状はInnoDBログでそれをシャットダウンリカバリの間に暇の状態を保つと指示して、一つページが暇だと標識された。

 

解决策

もしサビース要請を起動したら、損害が低い方法を見つけ出せる。自身の判断でリカバリするか助けを求めるかを判断してください。

 

リカバリ

まずはデータディレクトリ、すべてのサブディレクトリ及びほかのMySQLバックアップデータ位置の2進数バックアップを作成して、Gzipあるいはほかの解凍は’必要な時間を短縮できる。希に、一つのリカバリする方法は’ほかのリカバリを阻止する。リカバリがうまくいかないとデータを削除するかもしれないので、可用性が高いバックアップが必要である。

 

可能性が一番低いinnodb_force_recoveryレベルで再びデータを獲得してください、レベル2(5.5, 5.1, 5.0, 4.0とその以下)からである。もし高いレベルを使っていなければ、起動したあと数秒のシャットダウンが起こるサーバに対しては正常なことだから、サーバをアクセスしたあと60秒ほど待っていればいい。シャットダウンについては心配いらない。バックグラウンドクリンアップ、ロールバック、インサートバッファー、ログを合併や取り消すなどの操作を実行するから。次のレベルに移せば、以下のステップを実行してください:

  1. 以下の方法でデータバックアップを作成してください:
  2. ALTER TABLEですべてのInnoDBテーブルをMyISAMに変更する。もしinnodb_file_per_tableを使っていれば、この方法のディスク使用スペースが最低になって、運用中にスペースも解放される。必要であれば、インディクスでディスクスペースを使うことを避けられる。どれを削除したかを覚えてください、後で再構造する必要があるから。
  3. mysqldumpプログラムですべてのInnoDBテーブルのバックアップを作成する(5.5, 5.1, 5.0. 4.1とその以下)。作成したら、DROP TABLEで削除する。

3.この部分のリカバリに対して、InnoDBホットバックアップあるいは2進数コピのMySQL企業バーションバックアップを使わないでください。これはデータとエラを一緒にコピする。これは前に作成した2進数ファイルバックアップの付き添いである。二つのバックアップを格納するスペースがなければ。初期2進数コピで第一歩を完成してください。

  1. もしINFORMATION_SCHEMAがMySQLバーションにあるなら、SELECT from INFORMATION_SCHEMAですべてのテーブルが変更されたことを確保してくださいさもなければSHOW TABLESとオペレーションシステム検索サブディレクトリの*.ibdを使ってください。InnoDBのどんなデータも次のステップでなくなる、徹底的なテストが大事である。
  2. 残したすべてのInnoDBファイル、ib_logfile *和ibdata *を削除する。これはサーバにあるすべての有InnoDBデータを削除し、まだバックアップしていないデータをなくす。実行する前にバックアップしてください。それに、テーブルがMyISAMに変更したことを確保してください。
  3. MySQLを再起動して新しい空っぽなInnoDBファイルが作成する。

5.あるいはALTER TABLEでMyISAMからInnoDBに変更して、mysqldumpバックアップファイルを再びロールバックする。このオペレーションが完成したら、サーバがもとに戻たはずである。前にインディクスをしたことがあるなら、今また追加してください。

 

今後同じようなことを防ぐ

データを格納するに使われるため、すべてのディスクドライブのバッファが閉められる。

メモリーディスクコントローラーがバック電池が備えていることを確保してください。

If you are affected by the blob bug, upgrade to MySQL 5.1.51 or 5.5.7 or later. blob bugから影響を受けたら、MySQL 5.1.51あるいは5.5.7バーションにアップグレードしてください。

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号