How to Recover a Corrupted InnoDB Table Definition File

 

この記事で

ターゲット

リカバリ

リファレンス

適用範囲:

MySQLサーババーション

完全なshow create tableのテーブルインポートで定義ファイルを再構造できる。

目標

何のバックアップもない場合に、壊れたInnodbテーブル定義ファイルを再構造する。

リカバリ

以下のファイルはInnoDBに壊れたテーブル定義ファイルをリカバリする方法を示した。同じなテーブルを作成しないでその定義を壊れたテーブルからコピできる。

mysql [localhost] {msandbox} ((none)) > drop database test;

Query OK, 5 rows affected (0.44 sec)

mysql [localhost] {msandbox} ((none)) > create database test;

Query OK, 1 row affected (1.38 sec)

mysql [localhost] {msandbox} ((none)) > create table test.a (b int);

Query OK, 0 rows affected (0.09 sec)

mysql [localhost] {msandbox} (test) > insert into test.a values (1),(2);

Query OK, 2 rows affected (0.53 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql [localhost] {msandbox} (test) > select * from a;

+‐‐‐‐‐‐+

| b |

+‐‐‐‐‐‐+

| 1 |

| 2 |

+‐‐‐‐‐‐+

2 rows i n set (0.00 sec)

mysql [localhost] {msandbox} ((none)) > \q

Bye

$ l s ‐l data/test/

total 16

‐rw‐rw‐‐ ‐‐ 1 ronan ronan 8554 Oct 30 13:44 a.frm

‐rw‐rw‐‐‐‐ 1 ronan ronan 65 Oct 30 13:44 db.op t

$ file data/test/a.frm

data/test/a.frm: MySQL table definition file Version 9

 

frmファイルを編集して、損害状況を演じる:

$ hexedit data/test/a.frm

00000000 FE 01 09 0C 03 00 00 10 01 00 00 30 00 00 10 00 05 00 00 00 00 00 00 00 00

00 00 02 08 00 08 00 00 05 00 00 00 00 08 00 00 00 00 00 00 00 00 10 00 00 00 5D

………..0…………………………………]

 

データベースを再起動して、ファイルメモリーをクリンアップする。そしてファイルがこわれてアクセスできなくなった。

$ ./stop ; ./start

…. sandbox server started

$ ./use ‐Dtest

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with ‐A

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.25‐enterprise‐commercial‐advanced‐log MySQL Enterprise Server ‐

Advanced Edition (Commercial)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql [localhost] {msandbox} (test) > select * from a;

ERROR 1033 (HY000): Incorrect information in file: ‘./test/a.frm’

mysql [localhost] {msandbox} (test) > \q

Bye

[ronan@hydra msb_5_5_25]$ tail data/msandbox.err

121030 13:52:27 InnoDB: Waiting for the background threads to start

121030 13:52:28 InnoDB: 1.1.8 started; log sequence number 1574983512

121030 13:52:28 [Note] Server hostname (bind‐address): ‘0.0.0.0’; port: 5525

121030 13:52:28 [Note] ‐ ‘0.0.0.0’ resolves to ‘0.0.0.0’;

121030 13:52:28 [Note] Server socket created on IP: ‘0.0.0.0’.

121030 13:52:28 [Note] Event Scheduler: Loaded 0 events

121030 13:52:28 [Note] /1/mysql/tgz/5.5.25/bin/mysqld: ready for connections.

Version: ‘5.5.25‐enterprise‐commercial‐advanced‐log’ socket:

‘/tmp/mysql_sandbox5525.sock’ port: 5525 MySQL Enterprise Server ‐ Advanced Edition

(Commercial)

121030 13:52:31 [ERROR] /1/mysql/tgz/5.5.25/bin/mysqld: Incorrect information in file:

‘./test/a.frm’

121030 13:52:32 [ERROR] /1/mysql/tgz/5.5.25/bin/mysqld: Incorrect information in file:

‘./test/a.frm’

 

いま、同じようなcreate文を使って、別のデータベースで同じな名のテーブルを作成しえt。今は新しい定義でこわれた古いテーブル定義を上書きする(データベースがアウトラインするとき)。そして再起動する。これで、初期テーブル定義と関連するデータをアクセスできる。

mysql [localhost] {msandbox} (test) > create database dummy;

Query OK, 1 row affected (0.15 sec)

mysql [localhost] {msandbox} (test) > create table dummy.a (b int);

Query OK, 0 rows affected (0.09 sec)

mysql [localhost] {msandbox} (test) > \q

Bye

$ l s ‐l data/dummy/

total 16

‐rw‐rw‐‐ ‐‐ 1 ronan ronan 8554 Oct 30 13:53 a.frm

‐rw‐rw‐‐‐‐ 1 ronan ronan 65 Oct 30 13:52 db.op t

$ ls ‐l data/test/

total 16

‐rw‐rw‐‐ ‐‐ 1 ronan ronan 8554 Oct 30 13:51 a.frm

‐rw‐rw‐‐‐‐ 1 ronan ronan 65 Oct 30 13:44 db.op t

$ ./stop

$ cp dat a/dummy/a.frm data/test/

$ ./start

… sandb ox server started

$ ./use ‐Dtest

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with ‐A

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.25‐enterp rise‐commercial‐advanced‐log MySQL Enterprise Server ‐

Advanced Edition (Commercial)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

2015/12/14 Document 1502290.1

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=166632313173971&parent=DOCUMENT&sourceId=2049861.1&id=1502290… 4/4

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql [localhost] {msandbox} (test) > select * from a;

+‐‐‐‐‐‐+

| b |

+‐‐‐‐‐‐+

| 1 |

| 2 |

+‐‐‐‐‐‐+

2 rows i n set (0.00 sec)

mysql [localhost] {msandbox} (test) > \q

 

これで新しいテーブル定義で初期テーブルデータをアクセスできるようになった。

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号