MySQLデータベースが予期せずクラッシュし、テーブルデータファイルが破損して起動できなくなる問題を解決します。

MySQLデータベースが予期せずクラッシュし、テーブルデータファイルが破損して起動できなくなる問題を解決します。

問題:

MySQL データベースが予期せずクラッシュしたため、データベースを起動できませんでした。

エラーログ:

起動エラー: サービス mysqld の再起動

エラー! MySQL サーバーの PID ファイルが見つかりませんでした。
MySQL を起動しています。エラー! サーバーは PID ファイル (/www/wdlinux/mysql/var/iZ2358oz5deZ.pid) を更新せずに終了しました。

データベース エラー ログ:

200719 22:07:43 InnoDB: データベースは正常にシャットダウンされませんでした。
InnoDB: クラッシュリカバリを開始しています。
InnoDB: .ibd ファイルからテーブルスペース情報を読み取っています...
InnoDB: エラー: 名前 './ob_wp/ob_termmeta.ibd' のテーブルスペース 840 を追加しようとしています
InnoDB: テーブルスペースのメモリキャッシュに、ただしテーブルスペース
InnoDB: 名前 './dev_nss/dg_queue.ibd' の 840 がテーブルスペースにすでに存在します
InnoDB: メモリ キャッシュ!
200719 22:07:43 mysqld_safe mysqld は pid ファイル /www/wdlinux/mysql/var/iZ2358oz5deZ.pid から終了しました

ヒント: データベースの起動時にテーブル スペース情報が読み取られる場合、ob-wp ライブラリ内の ob_users.ibd テーブルのデータ ファイルはテーブル スペースにすでに存在します。

拡大する:

ストレージエンジンはmyisamです。データベースディレクトリには、.frm、.myi、.mydの3種類のファイルがあります。
(a) *.frm - テーブル定義。テーブル構造を記述するファイルです。
(b) *.MYD - 「D」データ情報ファイル。これはテーブルのデータ ファイルです。
(c) *.MYI - 「I」インデックス情報ファイル。テーブル データ ファイル内の任意のインデックスのデータ ツリーです。ストレージ エンジンは InnoDB です。データ ディレクトリには、.frm と .ibd の 2 種類のファイルがあります。
(a) *.frm - テーブル構造を持つファイル。
(b) *.ibd - テーブルデータファイル

出典: https://www.cnblogs.com/liucx/

方法1:

プロンプト情報によると、InnoDBテーブルが破損していると判断されたので、dev_nssライブラリディレクトリ内のテーブル構造とテーブルデータファイルをバックアップしてみてください。
mv ob_termmeta.ibd ob_termmeta.ibd,bak
mv ob_termmeta.frm ob_termmeta.frm.bak
その後、mysql を再起動しましたが、それでも起動できませんでした。他のテーブル データ ファイルがすでに存在するというメッセージが表示されました。破損したファイルを 3 回続けてバックアップしましたが、それでも起動できませんでした。したがって、この方法は放棄されます。

方法2:

1. 公式ウェブサイトのドキュメントを参照し、MySQL設定ファイル/etc/my.cnfに設定を追加して正常に起動します。
[mysqld]
innodb_force_recovery = 1

2. データベースをバックアップする
mysqldump -h172.168.2.100 -uroot -p -A > mysql_all_bak.sql
レポートが存在しない場合は、mysqldumpはパラメータ--forceを追加してエラーをスキップすることができます。

3. データベースを削除する
drop database hxdb; または mv hxdb hxdb_bak (安全のため)

4. パラメータinnodb_force_recoveryを削除します。
以前に設定したパラメータを削除した後、データベースを再起動します。

5. データのインポート
mysql -uroot -p < mysql_all_bak.sql
警告: コマンド ライン インターフェイスでパスワードを使用すると安全でない可能性があります。
エラー 1050 (42S01) 25 行目: テーブル '`hxdb`.`tb_info`' は既に存在します

テーブルがすでに存在するというメッセージが表示される場合は、innodb_force_recovery パラメータを削除した後、データベースがロールバックして対応する ibd ファイルを生成するため、ファイルを削除して再インポートする必要があります。
mysql -uroot -p < mysql_all_bak.sql

注記:

innodb_force_recovery パラメータの説明: クラッシュ リカバリ モード。通常は、深刻なトラブルシューティング状況でのみ変更されます。可能な値は0から6までです。

緊急の場合にのみこの変数を 0 より大きい値に設定し、InnoDB を起動してテーブルをダンプできるようにします。安全対策として、InnoDB は innodb_force_recovery が 0 より大きい場合、挿入、更新、または削除操作を防止します。
5.6.15 では、InnoDB を読み取り専用モードにするために、innodb_force_recovery が 4 以上に設定されています。 relay_log_info_repository=TABLE および master_info_repository=TABLE は InnoDB テーブルに情報を保存するため、これらの制限によりレプリケーション管理コマンドがエラーで失敗する可能性があります。

innodb_force_recovery はデフォルトで 0 です (強制リカバリなしの通常の起動)。 innodb_force_recovery に許可されるゼロ以外の値は 1 から 6 です。値が大きいほど、小さい値の機能が含まれます。たとえば、値 3 には値 1 と 2 のすべての機能が含まれます。
innodb_force_recovery 値が 3 以下でテーブルをダンプできる場合は、破損した単一ページのデータの一部のみが失われるという比較的安全な状況になります。 4 以上の値は、データ ファイルが永久に破損する可能性があるため危険であると見なされます。値 6 は、データベース ページが古い状態のままになり、B ツリーやその他のデータベース構造がさらに破損する可能性があるため、過剰であると考えられます。

安全上の理由から、innodb_force_recovery が 0 より大きい場合、InnoDB は INSERT、UPDATE、または DELETE 操作を防止します。 MySQL 5.6.15 以降では、innodb_force_recovery を 4 以上に設定すると、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)
挿入バッファのマージ操作を防止します。クラッシュを引き起こす場合は、実行しないでください。表の統計は計算されません。この値により、データ ファイルが永久に破損する可能性があります。この値を使用した後は、すべてのセカンダリ インデックスを削除して再作成する準備をしてください。 MySQL 5.6.15 では、InnoDB を読み取り専用に設定します。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
データベースを起動するときには、UNDO ログを参照しないでください。InnoDB は、不完全なトランザクションであってもコミット済みとみなします。この値により、データ ファイルが永久に破損する可能性があります。 MySQL 5.6.15 では、InnoDB を読み取り専用に設定します。
6 (SRV_FORCE_NO_LOG_REDO)
リカバリ時にREDOログのロールフォワードは実行されません。この値により、データ ファイルが永久に破損する可能性があります。データベース ページを古い状態のままにしておくと、B ツリーやその他のデータベース構造にさらに破損が生じる可能性があります。 MySQL 5.6.15 では、InnoDB を読み取り専用に設定します。

出典: https://www.cnblogs.com/liucx/

公式サイトを参照してください:
強制的な innodb リカバリ
https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_force_load_corrupted

これが役に立つことを願います

これで、MySQL データベースが予期せずクラッシュし、テーブル データ ファイルが破損して起動できなくなる問題の解決方法についての記事は終わりです。MySQL データベースが予期せずクラッシュし、テーブル データ ファイルが破損して起動できなくなる問題の関連ソリューションについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します
  • MySQL 全体または単一のテーブルデータのエクスポート
  • MySQLでデータを削除してもディスク領域が解放されないのはなぜですか
  • Ubuntu でディスク容量不足により MySQL が起動しない場合の解決策
  • MySQL ストレージ エンジン MyISAM の一般的な問題 (テーブル破損、アクセス不能、ディスク容量不足)
  • lnmp でディスク領域を保護するために MySQL ログをオフにする方法
  • ディスク容量を節約するためにMySQLを縮小するためのいくつかの提案
  • Mysql InnoDB のデータを削除した後にディスク領域を解放する方法
  • MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

<<:  Dockerコンテナにnginxを簡単にデプロイするプロセスの分析

>>:  JavaScript コードベースをよりクリーンにする 5 つの方法

推薦する

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭...

vue-routerのマッチングに基づいてパンくずリスト機能を実現する

この記事では主にvue-routerのmatchedをベースにしたbreadcrumb機能を紹介し、...

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

MySQLデータベースとテーブルシャーディングの概要

プロジェクトの開発中に、データベースのデータがどんどん大きくなり、その結果、1 つのテーブルにデータ...

CUDA8.0とCUDA9.0はUbuntu16.04で共存します

序文Github にある以前のコードには、CUDA 8.0 環境が必要なものもあります。初心者の場合...

NginxにLuaモジュールを追加する方法

luaをインストールする http://luajit.org/download/LuaJIT-2.0...

MySQL でデータを削除してもテーブル ファイルのサイズが変更されないのはなぜですか?

長期間稼働しているデータベースの場合、テーブルがストレージ領域を占有しすぎるという問題がよく発生しま...

Tomcat でタイムアウトしたセッションを監視および削除する方法

序文偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効で...

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...

js で虫眼鏡効果を実現するためのアイデアとコード

この記事の例では、虫眼鏡効果を実現するためのjsの具体的なコードを参考までに共有しています。具体的な...

HTML テーブル マークアップ チュートリアル (37): 背景画像属性 BACKGROUND

テーブル ヘッダーの背景画像を設定します。任意の GIF または JPEG 画像ファイルを使用できま...

VMware+centOS 8 で http プロトコルに基づく Git サービスを構築する方法

目次1. 原因2. デバイス情報3. 準備4. Apacheをインストールする5. gitを設定する...

jsはシングルクリックでテーブルを変更することを実装します

Pure jsは、参照用にワンクリックで編集可能なテーブル(トランスクリプトに似たもの)を実装してい...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...