MySQL

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を取り込む