2017-04-05 13 views
0

のMySQL 5.7 破損MySQLデータベース、のみアクセスinnodb_force_recoveryで= 6

のUbuntu 16.04 LTS上のデータベースは、私はそれを回復しようとしている最悪の時間を持つ、不適切なシステムのシャットダウンしたと仮定し何をした後に壊れました。以前のシステム管理者には最近のバックアップはありませんでしたが、データベースを修復/回復するために私ができることすべてを試す必要があります。

MySQLサーバのみで実行されます:innodb_force_recovery=6

のmysqldumpは、このエラーを与える:

Couldn't execute 'SHOW VARIABLES LIKE 'gtid_mode'': Table 'performance_schema.session_variables' doesn't exist (1146)

はあなたがどんな関連質問がある場合は、お問い合わせくださいinnodb_force_recovery=6

mysql_upgradeを実行することはできません。

+0

my.cnfでfile_per_tableを設定しましたか? ** MySQL 5.7の新しいシステムをUbuntu 16.04 LTS **にインストールし、各テーブルをコピーします。 –

+0

'file_per_table'はまだ設定されていません。私はこの時点でそれを追加することは有益ではないと言って正しいですか? – Seathre

+0

これはすぐに役立ちます。それがMySQLに設定されていれば、テーブルごとに独自のデータファイルを作成することができます。テーブルごとにテーブルを転送することはできますが、あなたのケースでは1つの大きなデータファイルしかなく、壊れています。 –

答えて

0

唯一の選択肢は、データを抽出し、ダンプからInnoDBデータベースを再作成することです。

ページのいずれかで破損した場合、MySQLがクラッシュすることがよくありますので、テーブルを1つずつダンプする方がよいでしょう。

ここでは、テーブルを個別にダンプして特定のケースを調整するスクリプトを示します。クラッシュした場合にMySQLを再起動し、「悪い」テーブルのリストをfailed.txtに保存します。

set -eux 

edir=export 

function ensure_mysqld() { 
     mysql -e 'select 1' && return 

     service mysql start 

     timeout=300 
     while [[ $timeout -gt 0 ]] 
     do 
       mysql -e 'select 1' && return 
       sleep 1 
       timeout=$(($timeout - 1)) 
     done 
     echo "failed to start MySQL" 
     exit 1 
} 

for d in $(cat databases) 
do 
     mkdir -p $edir/$d 
     set +e 
     ensure_mysqld 
     set -e 
     for t in $(mysql -S $socket -NBe "select TABLE_NAME from information_schema.TABLES WHERE TABLE_SCHEMA='$d' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'") 
     do 
       ensure_mysqld 
       mysqldump --skip-lock-tables $d $t > $edir/$d/$t.sql || echo "$d.$t" >> failed.txt 
     done 
done 
+0

大変な努力の結果、 Berndとあなたの両方に多くの感謝をします。 – Seathre