English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQLデータベースのinnodbが起動失敗し、再起動できない解決方法

問題紹介

コンピュータが使用中にクラッシュし、再起動した後、mysqlが正常に起動していないことが判明しました。エラーログを確認すると、innodbの問題がmysqlの起動失敗の原因であることが判明しました。

エラーログ

$ mysql.server start
MySQLを開始しています
. エラー!サーバーはPIDファイルを更新せずに終了しました(/usr/local/var/mysql/fdipzonedeMacBook-Air.local.pid).
22:08:37 mysqld_safe mysqldデーモンをデータベースから起動しています /usr/local/var/mysql
2016-04-23 22:08:38 0 [警告] TIMESTAMPの暗黙的なデフォルト値は廃止されています。使用してください --explicit_defaults_for_timestampサーバーオプション(詳細はドキュメントを参照してください)。
2016-04-23 22:08:38 0 [ノート] /usr/local/Cellar/mysql/5.6.24/bin/mysqld (mysqld 5.6.24)としてプロセスを開始します 3604 ...
2016-04-23 22:08:38 3604 [警告] lower_case_table_namesの設定を低い2 ファイルシステムのために /usr/local/var/mysql/ ケースセンスを無視しています
2016-04-23 22:08:38 3604 [ノート] プラグイン 'FEDERATED' は無効です。
2016-04-23 22:08:38 3604 [ノート] InnoDB: バッファプールページのref countにatomicsを使用しています
2016-04-23 22:08:38 3604 [ノート] InnoDB: InnoDBのメモリヒープは無効です
2016-04-23 22:08:38 3604 [ノート] InnoDB: Mutexesおよびrw_locksはGCCのatomic builtinsを使用しています
2016-04-23 22:08:38 3604 [ノート] InnoDB: メモリバリアは使用されていません
2016-04-23 22:08:38 3604 [ノート] InnoDB: 圧縮テーブルはzlibを使用しています 1.2.3
2016-04-23 22:08:38 3604 [ノート] InnoDB: CPU crcを使用しています32 指示
2016-04-23 22:08:38 3604 [ノート] InnoDB: バッファプールを初期化しています,サイズ= 128.0M
2016-04-23 22:08:38 3604 [ノート] InnoDB: バッファプールの初期化が完了しました
2016-04-23 22:08:38 3604 [ノート] InnoDB: サポートされる最高のファイル形式はBarracudaです。
2016-04-23 22:08:38 3604 [ノート] InnoDB: ログスキャンがチェックポイントLSNを超えて進行しています。 68929933440
2016-04-23 22:08:38 3604 [ノート] InnoDB: データベースは通常にシャットダウンされていません!
2016-04-23 22:08:38 3604 [ノート] InnoDB:クラッシュリカバリを開始しています。
2016-04-23 22:08:38 3604 [ノート] InnoDB: .ibdファイルからテーブルスペース情報を読み取っています...
2016-04-23 22:08:38 3604 [エラー] InnoDB: テーブルスペースのチェックサムが一致しません。/test_user/user_recommend_code#P#pmax.ibd (テーブル test_user/user_recommend_code#P#pmax)
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ:1024 分析するページ数:64
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ: 1024, 可能なspace_idの数:0
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ:2048 分析するページ数:48
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ: 2048, 可能なspace_idの数:0
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ:4096 分析するページ数:24
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ: 4096, 可能なspace_idの数:0
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ:8192 分析するページ数:12
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ: 8192, 可能なspace_idの数:0
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ:16384 分析するページ数:6
2016-04-23 22:08:38 3604 [ノート] InnoDB: VALID: スペース:2947354 page_no:3 page_size:16384
2016-04-23 22:08:38 3604 [ノート] InnoDB: ページサイズ: 16384, 可能なspace_idの数:1
2016-04-23 22:08:38 3604 [ノート] InnoDB: space_id:2947354, ページが一致する数: 1/1 (16384)
2016-04-23 22:08:38 3604 [ノート] InnoDB: 選択されたスペース:2947354
2016-04-23 22:08:38 3604 [ノート] InnoDB: テーブルスペースのページ0を復元中 2947354
2016-04-23 22:08:38 3604 [警告] InnoDB: スペースのpage_no=0にDoublewriteがありません: 2947354
2016-04-23 22:08:38 7fff79b9e300 InnoDB: オペレーティングシステムエラーナンバー 2 ファイル操作で。
InnoDB: エラーは、システムが指定されたパスを見つけることができないことを意味します。
InnoDB: InnoDBをインストールしている場合、以下のことを覚えておいてください。
InnoDB: ディレクトリを自分で作成します、InnoDBはそれらを作成しません。
InnoDB: エラー: .ibdファイルをオープンできませんでした-テーブルテーブルスペースファイル。/test_user/user_recommend_code#P#pmax.ibd
InnoDB: クラッシュリカバリを続けないのは、テーブルが
InnoDB: ログレコードをInnoDBログに適用できない場合、データが破損します。
InnoDB: 問題を解決し、mysqldを起動するには:
InnoDB: 1) ファイル内に権限問題がある場合、mysqldが
InnoDB: ファイルをオープンする場合、権限を変更する必要があります。
InnoDB: 2) テーブルが必要でない場合、またはバックアップから復元できる場合、
InnoDB: それでは、.ibdファイルを削除することができます、そして、InnoDBは通常の
InnoDB: クラッシュリカバリを実行し、そのテーブルを無視します。
InnoDB: 3) ファイルシステムやディスクが破損して、ファイルを削除できない場合、
InnoDB: .ibdファイル、my.cnfでinnodb_force_recovery > 0を設定できます
InnoDB: そして、InnoDBをこの場所でクラッシュリカバリを強制します。

解決策

1.データが重要でないか、既にバックアップがある場合、mysqlの起動を再開するだけで十分です

mysqlディレクトリに移動します、一般的には: /usr/local/var/mysql/

ib_logfileを削除します*

ibdataを削除します*

すべてのデータベースの物理ディレクトリを削除します(例えば、データベースがtest_dbの場合、rmを実行します) -rf test_db)

MySQLを再起動します

データベースを再構築し、バックアップを使用して上書きします。

2.データが重要でバックアップがない場合

innodb_force_recovery パラメータを使用して、mysqldがリカバリステップをスキップし、mysqldを起動し、データをエクスポートしてデータベースを再構築することができます。

innodb_force_recovery は以下のように設定できます1-6、大きな数字は前のすべての数字に影響を与えます

     1、(SRV_FORCE_IGNORE_CORRUPT): 検出されたcorruptページを無視します。

     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): ロールバックの操作を実行しません。

my.cnf(Windowsではmy.ini)に以下を追加します

innodb_force_recovery = 6 
innodb_purge_thread = 0

MySQLを再起動します

この時点では select、create、drop 操作しか実行できませんが、insert、update、delete 操作は実行できません。

ロジック エクスポートを実行し、完了後には innodb_force_recovery=0、innodb_purge_threads=1次にデータベースを再構築し、エクスポートしたデータを再びインポートします。

まとめ

これでこの記事のすべての内容が終わり、MySQLを学ぶまたは使用する際に役立つことを願っています。何か疑問があれば、コメントを残して交流してください。呐喊チュートリアルへのサポートに感謝します。

基本チュートリアル
おすすめ