web-dev-qa-db-ja.com

起動しません:InnoDB:破損したページ...テーブルスペースが見つかりませんでした

サーバーのクラッシュ後(Ubuntu 16.04)、innodb_force_recovery=0を使用してMysql(Mysql 5.7)を起動しようとすると、起動せず、error.logに次のように表示されます。

InnoDB: Checksum mismatch in datafile: ./panel_financiero_v2/kpis_analytics.ibd, Space ID:93, Flags: 33. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
InnoDB: Corrupted page [page id: space=93, page number=0] of datafile './panel_financiero_v2/kpis_analytics.ibd' could not be found in the doublewrite buffer.
InnoDB: Tablespace 93 was not found at ./panel_financiero_v2/kpis_analytics.ibd.
InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace.
InnoDB: Cannot continue operation.

innodb_force_recovery=6を使用してMysqlを開始できます(エラーメッセージが示すように、innodb_force_recovery = 1を使用してMysqlを開始できません)。問題のあるテーブルの.ibdファイルと.frmファイルは正しいディレクトリにあります(空のファイルはありません)。私は(念のため、本当の希望がない場合)これら2つのファイルを削除(別のディレクトリに移動)しようとしましたが、どちらも機能しません。

テーブルを修復または回復する方法(innodb_force_recovery = 6はMysqlを読み取り専用モードで起動し、新しいテーブルを作成できないことさえ覚えておいてください)?少なくとも、問題のあるテーブルの情報を失っても、(innodb_force_recovery=0を使用して)mysqlを正常に起動する方法はありますか?

5
Felipe Alonso

https://dev.mysql.com/doc/refman/5.7/en/repair-table.html は言う:

REPAIR TABLEはMyISAM、ARCHIVE、およびCSVテーブルで機能します。

つまり、REPAIR TABLEはInnoDBに対しては何もしません。 InnoDBには、起動時に実行される独自の 自動クラッシュリカバリ があります。

ただし、InnoDBクラッシュリカバリは、クラッシュ時に進行中であった失われた変更に対してのみ機能します。これは、REDOログと二重書き込みバッファを使用して、失われたダーティページを再構築します。このプロセスでは、保存時に破損したデータを再構築できません。

エラーメッセージは実際に何をすべきかを教えてくれます:

InnoDB:innodb_force_recovery = 1を設定してこれを無視し、テーブルスペースへのすべての変更を永久に失います。

https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html で詳細をお読みください:

1(SRV_FORCE_IGNORE_CORRUPT)破損したページを検出した場合でもサーバーを実行できます。 SELECT * FROM tbl_nameが破損したインデックスレコードとページを飛び越えようとするので、テーブルのダンプに役立ちます。

テーブルスペースファイルを元の場所に戻した後、innodb_force_recovery=1でサーバーを起動します。

次に、mysqldumpを使用してテーブルをダンプし、破損したページをスキップして、読み取り可能なページを読み取る必要があります。次に、ダンプからインポートする新しいテーブルを作成できます。

CREATE TABLE mytable_new LIKE mytable;
RENAME TABLE mytable TO mytable_bad, mytable_new TO mytable;

次に、ダンプしたデータを再インポートします。

単一のテーブルをダンプしてダンプファイルをインポートするのに手助けは必要ないと思います。


あなたのコメントを再:

より広範囲の腐敗があるようです。次の手順をお勧めします。

  1. MySQLサーバーをinnodb_force_recovery=6で起動します
  2. mysqldumpを使用して、データのallをダンプします。
  3. MySQLサーバーをシャットダウンします。
  4. より多くのデータを回復できるかどうか専門家の助けを借りたい場合に備えて、datadirの内容をバックアップします。 https://twindb.com を試してみてください。これらはMySQLデータベースのリカバリにおける最高のエキスパートです。
  5. 新しいdatadirを初期化します(新しいディスクデバイスを使用し、古いディスクには未知の損傷があるため、サービスを停止します)。
  6. mysqldumpで作成したデータダンプを復元します。
9
Bill Karwin

Bitnami Wordpressアプライアンスで同じ問題が発生しました。この問題を解決するために多くのWebサイトと手順を調査しました。調査した記事、ブログ、投稿のいずれにも必要な解決策がありませんでしたが、以下をつなぎ合わせます。

  1. ログファイルの確認:

    cd/opt/bitnami/mysql tail -400 mysqld.log

リストされたエラー:

[ERROR] [MY-012224] [InnoDB] Checksum mismatch in datafile: ./bitnami_wordpress/wp_redirection_404.ibd 
[ERROR] [MY-012237] [InnoDB] Corrupted page [page id: space=2126, page number=0] of datafile './bitnami_wordpress/wp_redirection_404.ibd' could not be found in the doublewrite buffer. 
[ERROR] [MY-013183] [InnoDB] Assertion failure: fil0fil.cc:5551:err == DB_SUCCESS || err == DB_INVALID_ENCRYPT 
  1. 問題と関連オブジェクトを特定します。

    data/bitnami_wordpress/wp_redirection_404.ibd

  2. 問題のあるファイルを削除します。

    mv data/bitnami_wordpress/wp_redirection_404.ibd/tmp /。

  3. エラーを無視してMySQLを起動するように構成ファイルを変更します。

    vi /opt/bitnami/mysql/my.cnf

- 追加 'innodb_force_recovery = 1 'をセクションの最後に追加「[mysqld]

  1. MySQLをリカバリモードで起動します。

    /opt/bitnami/ctlscript.sh start mysql

    /opt/bitnami/ctlscript.sh status MySQL

  2. MySQLをNORMALモードで起動するように構成ファイルを変更します。

    vi /opt/bitnami/mysql/my.cnf

-セクション「[mysqld]」から「innodb_force ...」を削除します

  1. MySQLを再起動して、正しく起動することを確認します。

    /opt/bitnami/ctlscript.sh start mysql

    /opt/bitnami/ctlscript.sh status MySQL

  2. 確認Wordpress Webサイトが正しく表示されます:参照 http://websiteurl.company.com

  3. 最新のバックアップからMySQLデータベースを復元します。

    • 「root」セッションを終了して「bitnami」アカウントセッションに

-ローカルMySQLデータベースをクリアします。

cd /opt/bitnami/mysql/data/${dbname} ; /home/bitnami/blankwpdb.sh ${dbname} ${dbuser}

-プライマリバックアップからMySQLデータベースを復元します

cd /opt/bitnami/mysql/data/${dbname} ; cat ${current_mysql_bkup} | /opt/bitnami/mysql/bin/mysql -u ${dbuser} -p${dbpw} ${dbname}

--MySQLおよびApache HTTPサービスを再起動します。

/opt/bitnami/mysql/scripts/ctl.sh restart
/opt/bitnami/Apache2/scripts/ctl.sh restart

=====/blankwpdb.sh======
#!/bin/bash
EXPECTED_ARGS=2
E_BADARGS=65
MYSQL=`which mysql`
dbpw=`grep DB_PASSWORD /opt/bitnami/apps/wordpress/htdocs/wp-config.php | cut -d \' -f 4`
C1="DROP DATABASE IF EXISTS $1;"
C2="CREATE DATABASE $1;"
COMMANDS="${C1}${C2}"
if [ $# -ne $EXPECTED_ARGS ]
then
  echo "Usage: $0 dbname dbadmin"
  exit $E_BADARGS
fi
$MYSQL -u$2 -p$dbpw -e "$COMMANDS"
  1. 確認Wordpress Webサイトが正しく表示されます:

参照してください http://websiteurl.company.com

これがこの特定の問題を現在または将来も経験し続ける人の助けになることを願っています。

0
Shaun Walter