1.シーンの説明:
多くの場合、MySQLデータベースを起動できないためにデータにアクセスできませんが、アプリケーションデータは通常失われませんが、システムテーブルスペースなどの他のファイルが破損したり、MySQLのバグが発生したりします。
この時点でバックアップがない場合、多くの人がデータが失われたと思いますが、実際にはほとんどの場合データを保存できます。
MyISAMエンジンの表スペースについては、対応するデータファイルを新しいデータベースに直接コピーするだけで、データを復元できます。
InnoDBエンジンのデータベーステーブルスペースの場合、テーブルスペースを転送することでデータを
レスキューできます。MySQLがパラメーターinnodb_file_per_table = 1の独立したテーブルスペースファイルを有効にしていることが前提です。
MySQLデータテーブルスペースファイルibdataファイルが破損しているか、変更または削除されていない場合、MySQLサービスは再起動に失敗します。同時に、MySQLデータは時間内にバックアップされません。現時点でできるだけ多くのMySQLデータを取得するにはどうすればよいですか??
2.ケースのデモンストレーション:
2.1。MySQLの障害を確認する前に、ライブラリ内の各テーブルにはいくつのレコードがありますか?
for n in `mysql -e "use db_bbs;show tables;"|sed '1d'`;do echo $n; mysql -e "use db_bbs;select count(*) from $n;";done >test.txt
MySQLの障害を確認する前に、ライブラリにあるテーブルの数は次のとおりです。
一共是39张表:
[root@10-10-127-11 ~]# mysql -e "use db_bbs;show tables;"|sed '1d'|wc -l
39
2.2。ibdataの削除の失敗をシミュレートします。
ibdataファイルを削除します(これは実稼働環境では禁止されています)
innodb_force_recovery = 6この時点でMySQLサービスを開始するには、MySQLの必須の起動パラメーターを使用しますが、これは役に立ちません。データテーブルスペースファイルであるため、ibdataファイルが削除されます。そのため、現時点ではMySQLサービスを開始できません。
MySQLで使用されるinnodbエンジンのため。そして、独立表スペース・パラメーターinnodb_file_per_table = 1がオンになります。したがって、この時点で、送信表スペースを使用してデータをレスキューできます。
2.3。データを取得する方法:
まず、不足しているテーブル構造を作成します。
まず、障害が発生したMySQLサーバーにmysql-utilitiesをインストールします。
yum -y install mysql-utilities
mysqlfrmを使用して、.frmファイルからテーブル作成ステートメントを取得します。
.frmファイルを分析して、テーブルを作成するためのステートメントを生成します
mysqlfrm --diagnostic
[root@test02 db_bbs]# mysqlfrm --diagnostic /data/mysql/data/db_bbs/t_admin.frm |grep -v "^#"
CREATE TABLE `db_bbs`.`t_admin` (
`f_id` int(4) NOT NULL AUTO_INCREMENT,
`f_type` tinyint(1) NOT NULL,
`f_username` varchar(80) NOT NULL,
`f_password` varchar(80) NOT NULL,
`f_nick_name` varchar(80) NOT NULL,
`f_real_name` varchar(80) NOT NULL,
`f_create_time` bigint(4) NOT NULL,
`f_update_time` bigint(4) NOT NULL,
`f_last_login_time` bigint(4) DEFAULT NULL,
`f_last_login_ip` varchar(80) DEFAULT NULL,
`f_status` tinyint(1) NOT NULL,
PRIMARY KEY `PRIMARY` (`f_id`) USING BTREE
) ENGINE=InnoDB ROW_FORMAT = 2;
すべてのテーブル作成ステートメントを/tmp/create.sqlファイルにインポートします。
[root@test02 ~]# cd /data/mysql/data/db_bbs/
[root@test02 db_bbs]# for n in `ls -l /data/mysql/data/db_bbs/*.frm|awk -F '/' '{print $NF}'|xargs -n 40`;do mysqlfrm --diagnostic $n|grep -v "^#" >>/tmp/create.sql;done
本番テーブル作成ステートメントを新しいMySQLインスタンスデータベースにインポートします。
[root@10-10-127-11 ~]# mysql db_bbs < create.sql
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '5' at line 10
原因是获取到的建表sql中包含了ROW_FORMAT = 2 这样的参数导致的
###テーブル作成ステートメントでROW_FORMAT = 2、ROW_FORMAT = 5を含む文字を削除します。テーブル作成ステートメントを再インポートします###
バッチ置換コマンドは次のとおりです。
cat /tmp/create.sql|sed -e 's/ENGINE=InnoDB ROW_FORMAT = 2;/ENGINE=InnoDB ;/g'|grep ROW_FORMAT |uniq -c
cat /tmp/create.sql|sed -e 's/ENGINE=InnoDB ROW_FORMAT = 5;/ENGINE=InnoDB ;/g'|grep ROW_FORMAT |uniq -c
sed -i 's/ENGINE=InnoDB ROW_FORMAT = 2;/ENGINE=InnoDB ;/g' /tmp/create.sql
sed -i 's/ENGINE=InnoDB ROW_FORMAT = 5;/ENGINE=InnoDB ;/g' /tmp/create.sql
cat /tmp/create.sql|grep ROW_FORMAT |uniq -c
テーブル作成ステートメントを新しいMySQLインスタンスdb_bbsライブラリにエクスポートすると、エラーフィールドが長すぎます。
[root@10-10-127-11 ~]# mysql db_bbs -f < create.sql
ERROR 1074 (42000) at line 232: Column length too big for column 'f_content' (max = 16383); use BLOB or TEXT instead
ERROR 1074 (42000) at line 299: Column length too big for column 'f_desc' (max = 16383); use BLOB or TEXT instead
ERROR 1074 (42000) at line 365: Column length too big for column 'f_body_image' (max = 16383); use BLOB or TEXT instead
ERROR 1074 (42000) at line 406: Column length too big for column 'f_content' (max = 16383); use BLOB or TEXT instead
ERROR 1074 (42000) at line 433: Column length too big for column 'f_summary' (max = 16383); use BLOB or TEXT instead
フィールド長タイプを変更した後、テーブル構築SQLを新しいMySQLデータベースに再インポートします
[root@10-10-127-11 ~]# mysql db_bbs -f < create.sql
[root@10-10-127-11 ~]#
[root@10-10-127-11 ~]#
[root@10-10-127-11 ~]# mysql -e "use db_bbs;show tables;"|sed '1d'|wc -l
39
###新しく作成されたMySQLインスタンスのデータを含まない.ibdファイルを破棄してから、障害が発生したデータベースの.idbファイルをインポートします###
新しく作成されたライブラリのデータ.ibdファイルを破棄します。
mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;done
[root@10-10-127-11 db_bbs]# ll *.ibd|wc -l
39
[root@10-10-127-11 db_bbs]# mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;done
[root@10-10-127-11 db_bbs]# ll *.ibd|wc -l
ls: cannot access *.ibd: No such file or directory
0
*すべての.idbファイルが破棄されていることがわかります。次に、データを含む古い.ibdファイルをこの新しいMySQLインスタンスの./data/db_bbs/ディレクトリにコピーし、所有者を変更することを忘れないでください:chown mysql。、そしてこれらのデータファイルをデータベースにインポートします**。
[root@test02 db_bbs]# scp *.ibd [email protected]:/data/mysql/data/db_bbs/
[email protected]'s password:
browse_record.ibd 100% 100MB 50.0MB/s 00:02
t_admin.ibd
........
........
[root@10-10-127-11 db_bbs]# ll *.ibd|wc -l
39
[root@10-10-127-11 db_bbs]# ll *.ibd
-rw-r----- 1 root root 104857600 Mar 14 21:56 browse_record.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_admin.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_anonymous_code.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_apply.ibd
-rw-r----- 1 root root 9437184 Mar 14 21:56 t_attach.ibd
-rw-r----- 1 root root 147456 Mar 14 21:56 t_banner.ibd
-rw-r----- 1 root root 163840 Mar 14 21:56 t_banner_log.ibd
-rw-r----- 1 root root 114688 Mar 14 21:56 t_black_ip.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_black_user.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_block_userbaseinfo.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_collect.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_country_code.ibd
-rw-r----- 1 root root 163840 Mar 14 21:56 t_ct_goods.ibd
-rw-r----- 1 root root 131072 Mar 14 21:56 t_ct_goods_record.ibd
-rw-r----- 1 root root 9437184 Mar 14 21:56 t_ct_integral.ibd
-rw-r----- 1 root root 46137344 Mar 14 21:56 t_ct_integral_record.ibd
-rw-r----- 1 root root 27262976 Mar 14 21:56 t_ct_news.ibd
-rw-r----- 1 root root 9437184 Mar 14 21:56 t_ct_order.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_feedback.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_lexicon.ibd
-rw-r----- 1 root root 327680 Mar 14 21:56 t_logs.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_manage.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_module.ibd
-rw-r----- 1 root root 9437184 Mar 14 21:56 t_post_extend.ibd
-rw-r----- 1 root root 12582912 Mar 14 21:56 t_post.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_post_video.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_realtime_message.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_recommend.ibd
-rw-r----- 1 root root 46137344 Mar 14 21:56 t_reply.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_reward.ibd
-rw-r----- 1 root root 196608 Mar 14 21:56 t_sensitive_word.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_system_message.ibd
-rw-r----- 1 root root 9437184 Mar 14 21:56 t_userbaseinfo.ibd
-rw-r----- 1 root root 344064 Mar 14 21:56 t_userextendinfo.ibd
-rw-r----- 1 root root 12582912 Mar 14 21:56 t_user_health.ibd
-rw-r----- 1 root root 98304 Mar 14 21:56 t_user_message.ibd
-rw-r----- 1 root root 442368 Mar 14 21:56 t_user_read_module_log.ibd
-rw-r----- 1 root root 17825792 Mar 14 21:56 t_viewpoint.ibd
-rw-r----- 1 root root 114688 Mar 14 21:56 t_white_ip.ibd
[root@10-10-127-11 db_bbs]# chown mysql.mysql *.ibd
mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;done
各表の表スペースをインポートするときに、個別の表エラーが発生しました。
[root@10-10-127-11 db_bbs]# mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;done
ERROR 1808 (HY000) at line 1: Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)
表ファイルを確認すると、browse_record表のみが独立表スペースにインポートされ、エラーが報告されていることがわかりました。これにより、この表のデータ回復が失敗します。
[root@10-10-127-11 db_bbs]# mysqlcheck -c db_bbs
db_bbs.browse_record
Warning : InnoDB: Tablespace has been discarded for table 'browse_record'
Error : Tablespace has been discarded for table 'browse_record'
error : Corrupt
db_bbs.t_admin OK
db_bbs.t_anonymous_code OK
db_bbs.t_apply OK
db_bbs.t_attach OK
db_bbs.t_banner OK
db_bbs.t_banner_log OK
db_bbs.t_black_ip OK
db_bbs.t_black_user OK
db_bbs.t_block_userbaseinfo OK
db_bbs.t_collect OK
db_bbs.t_country_code OK
db_bbs.t_ct_goods OK
db_bbs.t_ct_goods_record OK
db_bbs.t_ct_integral OK
db_bbs.t_ct_integral_record OK
db_bbs.t_ct_news OK
db_bbs.t_ct_order OK
db_bbs.t_feedback OK
db_bbs.t_lexicon OK
db_bbs.t_logs OK
db_bbs.t_manage OK
db_bbs.t_module OK
db_bbs.t_post OK
db_bbs.t_post_extend OK
db_bbs.t_post_video OK
db_bbs.t_realtime_message OK
db_bbs.t_recommend OK
db_bbs.t_reply OK
db_bbs.t_reward OK
db_bbs.t_sensitive_word OK
db_bbs.t_system_message OK
db_bbs.t_user_health OK
db_bbs.t_user_message OK
db_bbs.t_user_read_module_log OK
db_bbs.t_userbaseinfo OK
db_bbs.t_userextendinfo OK
db_bbs.t_viewpoint OK
db_bbs.t_white_ip OK
上記のbrowse_recordテーブルの復元失敗エラーレポートの解決策は次のとおりです。
参照:https ://blog.csdn.net/weixin_30607659/article/details/94987901
新しいMySQLインスタンスにインポートされたbrowse_recordテーブルを削除してから、次のテーブル作成ステートメントを実行して、新しいbrowse_recordテーブルを作成します。
CREATE TABLE `browse_record` (
`id` int(4) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(4) unsigned NOT NULL,
`user_id` int(4) unsigned NOT NULL,
`status` tinyint(1) unsigned NOT NULL,
`update_time` bigint(4) unsigned NOT NULL,
`create_time` bigint(4) unsigned NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `browse` (`post_id`,`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=compact;
ヒント:新しいMySQLインスタンスでbrowse_recordテーブルを個別に削除する場合、削除が失敗した場合は、db_bbsライブラリを新しいMySQLインスタンスに直接ドロップし、db_bbs内のすべてのテーブルのテーブル作成ステートメントを再インポートしてから、次のコマンドを実行します。 :
mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;done
表領域を新しいインスタンスMySQLに再インポートします。
[root@10-10-127-11 db_bbs]# mysql -e "show tables from db_bbs" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;done
[root@10-10-127-11 db_bbs]#
データの修復はここで完了します
MySQLdb_bbsライブラリのテーブルを確認します。
[root@10-10-127-11 db_bbs]# mysqlcheck -c db_bbs
db_bbs.browse_record OK
db_bbs.t_admin OK
db_bbs.t_anonymous_code OK
db_bbs.t_apply OK
db_bbs.t_attach OK
db_bbs.t_banner OK
db_bbs.t_banner_log OK
db_bbs.t_black_ip OK
db_bbs.t_black_user OK
db_bbs.t_block_userbaseinfo OK
db_bbs.t_collect OK
db_bbs.t_country_code OK
db_bbs.t_ct_goods OK
db_bbs.t_ct_goods_record OK
db_bbs.t_ct_integral OK
db_bbs.t_ct_integral_record OK
db_bbs.t_ct_news OK
db_bbs.t_ct_order OK
db_bbs.t_feedback OK
db_bbs.t_lexicon OK
db_bbs.t_logs OK
db_bbs.t_manage OK
db_bbs.t_module OK
db_bbs.t_post OK
db_bbs.t_post_extend OK
db_bbs.t_post_video OK
db_bbs.t_realtime_message OK
db_bbs.t_recommend OK
db_bbs.t_reply OK
db_bbs.t_reward OK
db_bbs.t_sensitive_word OK
db_bbs.t_system_message OK
db_bbs.t_user_health OK
db_bbs.t_user_message OK
db_bbs.t_user_read_module_log OK
db_bbs.t_userbaseinfo OK
db_bbs.t_userextendinfo OK
db_bbs.t_viewpoint OK
db_bbs.t_white_ip OK
2.4。新しいMySQLインスタンスのdb_bbsライブラリにインポートされたテーブルレコードを取得し、元のライブラリのtest.txtテーブルレコードファイルと比較します。
[root@10-10-127-11 ~]# for n in `mysql -e "use db_bbs;show tables;"|sed '1d'`;do echo $n; mysql -e "use db_bbs;select count(*) from $n;";done >test.txt11
和原来的库test.txt表记录文件对比。
[root@test02 ~]# vimdiff test.txt11 test.txt
表记录完全一致
これまでのところ、MySQLデータは修復されています。
参考資料:
https ://mp.weixin.qq.com/s/r3KTPsFay292JnO0lgTLUg
https://www.cnblogs.com/jiangxu67/p/4744283.html
https://blog.csdn.net/Sonny_alice/article/details / 80198200
https://www.cnblogs.com/jiangxu67/p/4744283.html