前置き
ことの起こり
ある日、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を取り込む