前置き
ことの起こり
ある日、PCが再起動し、その後にmysqlを起動しようとした
$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/uhuko.local.pid).
ぐええええ
原因
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
からは以下の手順で復活できる
- 同名のdatabaseを作成する
- 同じ定義のテーブルを作成する(
cat example_table.frm
などでDDLを手に入れる) -
ALTER TABLE example_table DISCARD TABLESPACE;
でTABLESPACEを消す -
.frm
.ibd
を上書き -
ALTER TABLE example_table IMPORT TABLESPACE;
でファイルのTABLESPACEを取り込む