Edited at

mysqlの frm ibd からテーブルを復活させたい!


前置き


ことの起こり

ある日、PCが再起動し、その後にmysqlを起動しようとした

$ mysql.server start

Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/uhuko.local.pid).

ぐええええ:innocent:


原因

cat /usr/local/var/mysql/uhuko.local.err

[ERROR] [MY-012526] [InnoDB] InnoDB: Upgrade after a crash is not supported. This redo log was created with MySQL 5.7.17. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html

[ERROR] [MY-012930] [InnoDB] InnoDB: Plugin initialization aborted with error Generic error.
[ERROR] [MY-011013] [Server] Failed to initialize DD Storage Engine.
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting


落ち着いた対処

$ brew uninstall mysql --force

$ rm -rf /usr/local/var/mysql
$ brew install mysql


データベースが消えてしまった!

奇跡的に.frm .ibdは残っているのでここから復活させよう

同名のdatabaseを作成しそのフォルダに.frm .ibdをコピーさせると復活する?

そんなことはなかった


.frm .ibdからの復元

https://teratail.com/questions/7925

ここを参考にDDLを.frmファイルから取り出し、次に


テーブルを作成したら、以下のコマンドをMySQL で実行して、作ったテーブルの

テーブルスペースNoを調べてください。

mysql> select SPACE,NAME from information_schema.innodb_sys_tablespaces;

テーブルスペースNoが一致したら mysqld を停止して、元の復元したいテーブルの.ibd と.frm を

新しくできた.ibd と.frm に上書きしてください。


$ od -Ax -j 16418 -N4 -t x1 example_table.ibd

0 0 0 0 5f

5f


テーブルスペースNoが一致したら


5f = 95

つらくない?


解決策の解決策

https://stackoverflow.com/questions/26868956/restore-table-structure-from-frm-and-ibd-files

まず以下を実行する

ALTER TABLE example_table DISCARD TABLESPACE;

.frm .ibdを上書きし

ALTER TABLE example_table IMPORT TABLESPACE;

復活!


まとめ

.frm .ibdからは以下の手順で復活できる


  1. 同名のdatabaseを作成する


  2. 同じ定義のテーブルを作成する(cat example_table.frm などでDDLを手に入れる)


  3. ALTER TABLE example_table DISCARD TABLESPACE; でTABLESPACEを消す


  4. .frm .ibdを上書き


  5. ALTER TABLE example_table IMPORT TABLESPACE;でファイルのTABLESPACEを取り込む