保留中のトランザクションのあるMySQLテーブルの削除


10

MySQLで保留中のトランザクションがあるInnoDBテーブルまたはデータベースを(できればファイルシステムレベルで)削除する方法はありますか?

どうした:

MySQL 5.5.28を使用して実行LOAD DATA INFILE…し、巨大なデータセット(3億行)をInnoDBテーブルにインポートしました。set autocommit = 0;以前は使用していませんでした。残念ながら、mysqldインポートの途中で中止されました。

を再起動mysqlすると、トランザクションがロールバックされ、次のようなメッセージがシステムログに記録されます。

mysqld_safe [4433]:121212 16:58:52 InnoDB:1つのアクティブなトランザクションが完了するのを待機しています

問題は、ロールバックが25時間を超えて実行されている間 mysqld、ソケット接続を受け入れていないことです。

/var/lib/mysql/*このマシンには他にもいくつかのInnoDBデータベース/テーブルがあるため、削除して最初から始めることはできません。ただし、問題のあるテーブルは、別のデータベース内の唯一のテーブルです。後ですべてのデータを再インポートできるため、テーブル全体またはデータベース全体を削除しても問題ありません。

回答:


8

ibdata1内のUNDOテーブルスペースを介しロールバックが実行されているため、実際にできることはありません。

mysqldプロセスを終了してmysqlを再起動すると、クラッシュリカバリサイクルの一部として中断したところから再開されます。

免責事項:データ損失の責任はありません

他のテーブルのデータが失われる可能性がありますが、InnoDBの通常のクラッシュリカバリサイクルを回避するためにできることがいくつかあります。

innodb_force_recoveryと呼ばれる起動オプションがあり、InnoDBクラッシュリカバリのさまざまな段階をバイパスできます。

MySQLドキュメントの強制によるInnoDBリカバリによると、設定とその効果は次のとおりです。

1(SRV_FORCE_IGNORE_CORRUPT)

破損したページを検出した場合でも、サーバーを実行させます。SELECT * FROM tbl_nameが破損したインデックスレコードとページを飛び越えられるようにしてください。これはテーブルのダンプに役立ちます。

2(SRV_FORCE_NO_BACKGROUND)

マスタースレッドが実行されないようにします。パージ操作中にクラッシュが発生した場合、このリカバリ値によりクラッシュが防止されます。

3(SRV_FORCE_NO_TRX_UNDO)

クラッシュリカバリの後にトランザクションロールバックを実行しないでください。

4(SRV_FORCE_NO_IBUF_MERGE)

挿入バッファーのマージ操作を防止します。クラッシュの原因となる場合は、実行しないでください。テーブル統計を計算しません。

5(SRV_FORCE_NO_UNDO_LOG_SCAN)

データベースを起動するときに取り消しログを見ないでください:InnoDBは不完全なトランザクションでさえコミットされたものとして扱います。

6(SRV_FORCE_NO_LOG_REDO)

リカバリに関連してREDOログのロールフォワードを実行しないでください。

トランザクションの変更がUNDOおよびREDOログに埋め込まれていると、

  • 書き込まれるはずのデータを失う
  • 削除予定のデータを保持する

悪い副作用が予想される場合は、/ var / lib / mysql全体をバックアップし、ibdata1、ib_logfile0、およびib_logfile1をコピーして通常のリカバリを再試行する場合に備えて、どこかに置きます。

mysqlがいずれかのモードで完全に起動している場合

  • mysqldumpは問題のテーブルを除くすべてのデータ
  • mysqlのシャットダウン
  • / var / lib / mysql / mysqlを除く/ var / lib / mysql内のすべてを削除します
  • mysqlを起動する
  • mysqldumpをリロードします

警告:必ずすべてをバックアップしてください!!!

これが役に立てば幸いです!!!


1

今週も同じような状況でした。

そして、テストサーバーに完全バックアップを復元し、巨大な保留中のトランザクションを含むテーブルを削除、削除、または削除しようと4回繰り返した後、最終的に金曜日の午後に到達し、そのまま実行することにしました。3日間で、サーバー負荷がごくわずかでトランザクションが終了し、データベースは正常でした。これは、試行して失敗した.frmファイルとmysqlテーブルに対する手動操作よりもはるかに優れていました。

私の解決策:削除しないでください。数日間他の操作を延期したり、ディスク容量をどこかに見つけたり、スレーブサーバーに負荷をかけたりする必要がある場合でも、保留中のトランザクションを終了させます。

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