InnoDBテーブルの破損をどのように識別しますか?


24

パーティション化されたいくつかのテーブルがあり、複製されたスレーブにいくつかのインデックスがあります。スナップショット(検証済みの安全な)を新しいスレーブにコピーし、mysqldを5.1.42から5.5.15にアップグレードしてレプリケーションを再開した後、InnoDBがクラッシュし、「Invalid pointer ...」というエラーメッセージが表示されます。

これらのエラーは、ハードウェアとO / Sが異なる2台のサーバーで発生しています。実行後:

ALTER TABLE .... COALESCE PARTION n;

そのテーブルの問題はなくなります。

私の質問の範囲はより広いですが、それは「InnoDBテーブルの破損をどのように識別するのですか?」です。または「InnoDBテーブルの状態をどのように評価しますか?」である「チェック表」プリクラッシュの問題を特定するために使用できるツールだけですか?

重要かどうかはわかりませんが、実行中にクラッシュが発生しました:バージョン: '5.5.15-55-log'ソケット: '/opt/mysql.sock'ポート:3306 Percona Server(GPL)、Release rel21.0、Revision 158


2
こんにちはランディ!ここでの回答は信頼できると思います-InnoDBは独自の破損を特定しました。質問を言い換える必要があるかもしれませんが、どうしてInnoDBが破損するのでしょうか?
モーガントッカー

回答:


18

モーガンは、InnoDBが読み取りページでチェックサムを実行することで、破損したページを常にチェックしているというコメントをヒントにしています。InnoDBがチェックサムの不一致を検出すると、クラッシュしてサーバーが停止します。

(InnoDBが破損したページを読み取るのを待つのではなく)そのプロセスを高速化する場合は、次を使用できますinnochecksum

チェックサムの不一致によりInnoDBが実行中のサーバーを意図的にシャットダウンするため、本番環境のサーバーが破損したページに遭遇するのを待つよりも、このツールを使用することをお勧めします。

興味深い警告:

innochecksumは、サーバーがすでに開いているテーブルスペースファイルでは使用できません。そのようなファイルの場合、CHECK TABLEを使用して、テーブルスペース内のテーブルをチェックする必要があります。

はい、オンラインテーブルCHECK TABLEはおそらくツールです(または別の回答で指摘されているように) mysqlcheck、一度に複数のデータベースを実行したい場合)。

データベースをシャットダウンできる場合は、次を使用して強制的にチェックサムを実行できます。 innochecksum

逸話: 29GBのinnodbテーブルスペース(でinnodb_file_per_table=1)で、このスクリプトは約2分かかりました

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

ただし、ボーナスとして、Perconaを実行しているため、高速innodbチェックサムの新しいメソッドを実装しました。使用したことはありませんが、プロセスを高速化する可能性があります。


1
ゴナがここにそれを試してみる、+1を探している@randymelderソリューションであると考えられる
マルシオ

2
Perconaサーバーには、他にも便利な機能がいくつかあります。参照してくださいinnodb_corrupt_table_action percona.com/doc/percona-server/5.5/reliability/...(!!)
モルガンTocker

@DTest:innochecksumが道です。これはキーパーです。+1 !!!
-RolandoMySQLDBA

@DTest:今日はこれに帽子をかぶる!!!!
RolandoMySQLDBA

@MorganTockerおもしろい。私の知識の真空を取得し、パーコナのいくつかの研究を行う必要があります
デレクダウニー

6

警告:これらの手順を試す前に、念のため、データベースの健全なバックアップが手元にあることを確認することを強くお勧めします。(警告については@Nickに感謝)

mysqlcheckコマンドを使用してみてください。ターミナルで:

mysqlcheck -u username -p --databases database1 database2

このコマンドは、すべてのテーブルのリストと、何らかの破損があったかどうかを示すステータスを出力します。

table1  OK
table2  OK
table3  OK
tableN  OK

それを手にすれば、どのテーブルを修復する必要があるかがすでにわかります。一度にすべてを修復したい場合に備えて:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

詳細mysqlcheckhttp : //dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

注:質問にタグを付け。私はそれが何であるか見当がつかなかったので、グーグルで検索しました。MySQLのフォークのようですが、コマンドに互換性がないと信じる理由はありません(指が交差しています)。


誰かが私に、このガイドを教えてくれました。このガイドには、データベース全体が起動しない、より重大な状況でのInnoDBデータベースリカバリの具体的な手順が記載されています。http//www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html


1
mysqlcheckは 'check table ...'の同義語です-1
randomx


違います。まず、mysqlcheckはコマンドラインユーティリティであり、CHECK TABLEはSQLステートメントです(オレンジとレモンを比較するのが好きです)。また、SQLステートメントにすべてのテーブル名を含めずにCHECK TABLEでデータベース全体をチェックすることはできません(それもあまり生産的ではないでしょう)
-marcio

また、mysqlcheckには、破損したテーブルを--auto-repairするオプションがありますが、CHECK TABLEはテーブルが破損しているかどうかのみをチェックしますが、修復はできません。
-marcio

2
@randymelder-mysqlcheckがの同義語であると言うのは間違っていますCHECK TABLE。あなたは状態にリンクされているドキュメントは、「mysqlcheckSQL文を使用してCHECK TABLEREPAIR TABLEANALYZE TABLE、およびOPTIMIZE TABLEユーザーのための便利な方法でそれはあなたが実行する操作に使用する文を決定し、実行するサーバに文を送ります。 」それは同義語ではありません。これは、ステートメントのコレクションへのユーザーインターフェイスです。
ニックチャマス

6

よるMySQLの5.0認定研究ガイド、ページ443444セクション30.4

InnoDBテーブルを確認するには、CHECK TABLEコマンドを使用するか、クライアントプログラムを使用してステートメントを発行します。ただし、InnoDBテーブルに問題がある場合、REPAIR TABLEを使用して修正することはできません。このステートメントはMyISAMにのみ適用されるためです。

テーブルチェックでInnoDBテーブルに問題があることが示された場合、mysqldumpでダンプし、ドロップし、そのダンプから再作成することで、テーブルを一貫した状態に復元できるはずです。

MySQLサーバーまたはそれが実行されているホストでクラッシュが発生した場合、一部のInnoDBテーブルの修復が必要になる場合があります。通常、InnoDBストレージエンジンは起動シーケンスの一部として自動回復を実行するため、サーバーを再起動するだけで十分です。まれに、InnoDB自動回復の失敗によりサーバーが起動しない場合があります。その場合は、次の手順を使用します。

  • --innodb_force_recoveryオプションを1から6の範囲の値に設定してサーバーを再起動します。これらの値は、クラッシュを回避する際の注意レベルの向上と、復元されたテーブルの不整合に対する許容レベルの向上を示します。始めるのに適した値は4です。

  • --innodb_force_recoveryをゼロ以外の値に設定してサーバーを起動すると、InnoDBはテーブルスペースを読み取り専用として扱います。したがって、InnoDBテーブルをmysqldumpでダンプしてから、オプションが有効なときにそれらを削除する必要があります。次に、-innodb_force_recoveryオプションなしでサーバーを再起動します。サーバーが起動したら、ダンプファイルからInnoDBテーブルを回復します。

  • 前の手順が失敗した場合、以前のバックアップからInnoDBテーブルを復元する必要があります。

InnoDB強制回復に関するMySQLドキュメントをお読みください  


3
FWIW、認定ガイドには非常に政治的に正しい答えがあります:) InnoDBテーブルでTABLEをチェックし、実際に破損している場合、「破損」として返されることはなく、サーバーがクラッシュします。InnoDBページを読み取るたびに(ページチェックサムを介して)破損がチェックされるため、このステートメントはInnoDBではほとんど使用されません。
モーガントッカー

2

InnoDBプラグインで作成されたInnoDBデータを誰かが使用してからInnoDBの別のバージョンに切り替えるとどうなるのかと思います。これにより、mysqldの目にはページが破損する可能性があります。

InnoDB File FormatのMySQLドキュメントがこの可能性について述べていることに注意してください:

一般に、InnoDBの新しいバージョンは、クラッシュ、ハング、誤った結果、破損のリスクなしに、以前のバージョンのInnoDBで安全に読み書きできないテーブルまたはインデックスを作成する場合があります。InnoDBプラグインは、これらの状況から保護し、データベースファイルとInnoDBのバージョン間の互換性を維持するための新しいメカニズムを導入します。

スレーブのデータを破棄します。実際、データの論理ダンプ(mysqldump)を取得することでブルートフォースを使用します。

  • スレーブでInnoDBを使用してすべてのデータベースを削除します
  • スレーブでmysqlをシャットダウンします
  • スレーブ上のibdata1、ib_logfile0、およびib_logfile1を削除します
  • スレーブでmysqlを起動し、ibdata1、ib_logfile0、およびib_logfile1を再作成します
  • mysqldumpマスターからスレーブへのデータ

投稿された元のアンサーは「古い学校」と見なされます。しかし、この場合、.ibdやibdata1で使用されているファイル形式を間違いなく調べます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.