LoginSignup
13
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-13

前置き

ことの起こり

ある日、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

つらくない?

解決策の解決策

まず以下を実行する

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13