ここではデータベースが派手に壊れた場合の話。ハードディスクが壊れたり、自分の場合はVMWAREで保存状態にしたまま、VirtualBoxで開いて操作したあとに、保存していたVMWAREで起動してしまったためハードディスクが派手に壊れてしまって普通のrepairでは直らなかった。
MySQLのデータにはMyISAM方式とINNODB方式があってここではMYISAMの場合、こっちのほうが修復が効きやすいらしい。
当然だがバックアップはとっておく。
どのように壊れたのかの記録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ sudo service mysql start Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details. $ systemctl status mysql.service œ mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: activating (start-post) (Result: exit-code) since Thu 2019-06-13 18:33:15 JST; 9s ago Process: 29320 ExecStart=/usr/sbin/mysqld (code=exited, status=1/FAILURE) Process: 29310 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 29320 (code=exited, status=1/FAILURE); : 29321 (mysql-systemd-s) Tasks: 4 Memory: 232.0K CPU: 404ms CGroup: /system.slice/mysql.service mqcontrol tq29321 /bin/bash /usr/share/mysql/mysql-systemd-start post mq29371 sleep 1 Jun 13 18:33:15 inpsrv systemd[1]: Starting MySQL Community Server... Jun 13 18:33:18 inpsrv systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE $ journalctl -xe - Unit mysql.service has begun starting up. Jun 13 18:31:39 inpsrv kernel: audit: type=1400 audit(1560418299.204:473): apparmor="DENIED" operation Jun 13 18:31:39 inpsrv audit[29003]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" Jun 13 18:31:39 inpsrv audit[29003]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" Jun 13 18:31:39 inpsrv kernel: audit: type=1400 audit(1560418299.212:474): apparmor="DENIED" operation Jun 13 18:31:41 inpsrv systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE ~ ~ $ cat /var/log/mysql/error.log 2019-06-13T09:43:51.297306Z 0 [ERROR] InnoDB: Could not find a valid tablespace file for `interscript/page_restrictions`. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue. |
ユーザデータベースや特権データが壊れていると起動もできないので、以下で起動できるか確かめる。
1 |
# mysqld --skip-grant-tables |
このオプションはログインをスキップするので、特権データが壊れていても動くと思われる。
起動もしない場合
起動もしない場合は直接ファイルを触って直す。今回はMYISAM形式のファイルなので、myisamchkをつかう。MYISAMかどうかは、ファイルの拡張子がMYDやMYIならこの形式で、ibdの場合はINNODB。
以下の順番で試す。
1 2 3 |
# myisamchk -r -q broken.MYI # myisamchk -r broken.MYI # myisamchk --save-recover broken |
これで直ればいいのだが、直らない場合はMYIを作り直す。MYDが実際のデータが入っているのでこのファイルがサイズが0だったり存在しない場合は復旧は無理だと思われる。
上記のmysqld –skip-grant-tablesでも起動できない場合は、すべてを初期化してから、MYDを復活するしかないが、ここではmysqldは動くものとする。
ここからmysqlでMYIを空にしてから、保存してあるMYDをもとに戻してから、復旧をすることになる。
テーブルを空にする
1 2 3 4 |
# mysql brokendb > SET autocommit=1; > TRUNCATE TABLE broken; > quit |
これで空の正常のMYIができてサイズ0のMYDができるので、保存してあるMYDを上書きコピーしてから上記のmyisanchkで復旧する。