web-dev-qa-db-ja.com

破損したInnoDBテーブルを復元する方法は?

データが失われました。MySQLデータベースが削除され、ibdファイルからテーブルを復元する必要があります。バックアップが古すぎるため、削除されたデータベースファイルを元に戻す必要があります。ほとんどのテーブルは復元されますが、そのうちの3つが破損しています。

InnoDBストレージドライバーを使用します。

  • テーブル構造を復元し、
  • 次に、テーブルのテーブルスペースを削除し、
  • 次に、復元したInnoDBファイルをデータベースにコピーしました。
  • それから私は元のibdファイルをロードしようとしました
alter table tbl import tablespace

ほとんどのibdファイルはこの方法で復元できますが、そのうちの3つが破損しています。どうすれば修正できますか?テーブルの回復可能なデータをすべてロードしたいと思います。 ibdファイルを修正してロードするにはどうすればよいですか?

34GBのibdデータファイルをロードしようとすると、次のエラーが発生しました。

alter table xmlobjects import tablespace;
ERROR 1034 (HY000): Incorrect key file for table 'xmlobjects'; try to repair it

Innochecksumを使用すると、次のエラーが発生します。

innochecksum -v /var/lib/mysql/FET_TDB/xmlobjects.ibd 
InnoDB offline file checksum utility.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           TRUE
debug                             FALSE
count                             FALSE
start-page                        0
end-page                          0
page                              0
file /var/lib/mysql/FET_TDB/xmlobjects.ibd = 36423331840 bytes (2223103 pages)...
InnoChecksum; checking pages in range 0 to 2223102
page 959 okay: 0.043% done
page 6783 okay: 0.305% done
page 12735 okay: 0.573% done
page 18559 okay: 0.835% done
page 24575 okay: 1.105% done
page 30527 okay: 1.373% done
page 36287 okay: 1.632% done

...

page 2213695 okay: 99.577% done
page 2221247 okay: 99.917% done
Error; bytes read (12288) doesn't match page size (16384)

mysqlエラーログ:

2017-09-15 08:57:55 1 [Warning] IP address '172.17.0.1' could not be resolved: Name or service not known
2017-09-15 08:57:55 1 [Warning] InnoDB: Table '"FET_TDB"."xmlobjects"' tablespace is set as discarded.
2017-09-15 08:57:55 7f80bbeaf700 InnoDB: cannot calculate statistics for table "FET_TDB"."xmlobjects" because the .ibd file is missing. For help, please refer to http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html
2017-09-15 08:57:55 1 [ERROR] InnoDB: File size 36423331840 is not a multiple of the page size 16384
2017-09-15 08:57:55 1 [Note] InnoDB: Discarding tablespace of table "FET_TDB"."xmlobjects": Data structure corruption

その他のテーブル:

alter table xmlindex__mo import tablespace;
ERROR 2013 (HY000): Lost connection to MySQL server during query

また、ログファイルに次のメッセージが表示されます。

2017-09-15 08:39:52 1 [Warning] IP address '172.17.0.1' could not be resolved: Name or service not known
2017-09-15 08:39:52 1 [Warning] InnoDB: Table '"FET_TDB"."xmlindex__mo"' tablespace is set as discarded.
2017-09-15 08:39:52 7f33f0570700 InnoDB: cannot calculate statistics for table "FET_TDB"."xmlindex__mo" because the .ibd file is missing. For help, please refer to http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html

ls -la /var/lib/mysql/FET_TDB/xmlindex__mo.ibd 
-rw-rw---- 1 mysql mysql 2759852032 Sep 15 08:39 /var/lib/mysql/FET_TDB/xmlindex__mo.ibd

チェックサム出力は正しいようです:

innochecksum -v /var/lib/mysql/FET_TDB/xmlindex__mo.ibd 
InnoDB offline file checksum utility.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           TRUE
debug                             FALSE
count                             FALSE
start-page                        0
end-page                          0
page                              0
file /var/lib/mysql/FET_TDB/xmlindex__mo.ibd = 2759852032 bytes (168448 pages)...
InnoChecksum; checking pages in range 0 to 168447
page 9983 okay: 5.927% done
page 26623 okay: 15.805% done
page 32639 okay: 19.377% done
page 38399 okay: 22.796% done
page 44223 okay: 26.254% done
page 49215 okay: 29.217% done
page 60543 okay: 35.942% done
page 66239 okay: 39.324% done
page 72127 okay: 42.819% done
page 86719 okay: 51.482% done
page 92671 okay: 55.015% done
page 98559 okay: 58.511% done
page 105087 okay: 62.386% done
page 139903 okay: 83.055% done
page 159359 okay: 94.605% done
4
Dániel Kis

削除されていないファイルは常に破損しています。 MySQLパーティションをstream_parser(google undrop-for-innodb)で解析し、インデックスページからレコードをフェッチする必要があります。

1
akuzminsky