サーバーのクラッシュ後(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を正常に起動する方法はありますか?
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;
次に、ダンプしたデータを再インポートします。
単一のテーブルをダンプしてダンプファイルをインポートするのに手助けは必要ないと思います。
あなたのコメントを再:
より広範囲の腐敗があるようです。次の手順をお勧めします。
innodb_force_recovery=6
で起動しますmysqldump
を使用して、データのallをダンプします。mysqldump
で作成したデータダンプを復元します。Bitnami Wordpressアプライアンスで同じ問題が発生しました。この問題を解決するために多くのWebサイトと手順を調査しました。調査した記事、ブログ、投稿のいずれにも必要な解決策がありませんでしたが、以下をつなぎ合わせます。
ログファイルの確認:
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
問題と関連オブジェクトを特定します。
data/bitnami_wordpress/wp_redirection_404.ibd
問題のあるファイルを削除します。
mv data/bitnami_wordpress/wp_redirection_404.ibd/tmp /。
エラーを無視してMySQLを起動するように構成ファイルを変更します。
vi /opt/bitnami/mysql/my.cnf
- 追加 'innodb_force_recovery = 1
'をセクションの最後に追加「[mysqld]」
MySQLをリカバリモードで起動します。
/opt/bitnami/ctlscript.sh start mysql
/opt/bitnami/ctlscript.sh status MySQL
MySQLをNORMALモードで起動するように構成ファイルを変更します。
vi /opt/bitnami/mysql/my.cnf
-セクション「[mysqld]」から「innodb_force ...」を削除します
MySQLを再起動して、正しく起動することを確認します。
/opt/bitnami/ctlscript.sh start mysql
/opt/bitnami/ctlscript.sh status MySQL
確認Wordpress Webサイトが正しく表示されます:参照 http://websiteurl.company.com
最新のバックアップからMySQLデータベースを復元します。
-ローカル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"
参照してください http://websiteurl.company.com
これがこの特定の問題を現在または将来も経験し続ける人の助けになることを願っています。