XAMPPを使ったローカル環境でWebサービスを一つ作っているのだが、データベースのテーブルが壊れるというとんでもないバグが起きた。
経緯をまとめると下記の通り。
① XAMPPのMysqlが起動しなかったので、dataをバックアップする方法(下記参照)で修復を試みる
② Mysqlが修復し、phpMyAdminに入るが、各テーブルデータに入ろうとすると「#1932 – Table ‘テーブル名’t exist in engine」とエラーが出て入れない
③ テーブルが無いと判断されているので、開発中のフロントページでも接続エラーが出る
④ dataからバックアップしていたファイルを一部移植し、解消できた
今回はかなり焦ったので、メモとして記録を残しておく。
Table of Contents
Mysqlが起動できない
まず今回の発端はXAMPPのMysqlへの接続ができなかったことから始まっている。
これは恐らく、XAMPPのappachやmysqlをstopにせずそのままスリープにすると、Windowsアップデートの際に予期せぬ強制終了が行われるため、ここでなにかしらの不具合が起きると考えられる。
なので、Mysql起動時に下記のようなエラーが出たら注意が必要だ。
22:06:17 [mysql] Error: MySQL shutdown unexpectedly.
22:06:17 [mysql] This may be due to a blocked port, missing dependencies,
22:06:17 [mysql] improper privileges, a crash, or a shutdown by another method.
22:06:17 [mysql] Press the Logs button to view error logs and check
22:06:17 [mysql] the Windows Event Viewer for more clues
22:06:17 [mysql] If you need more help, copy and post this
22:06:17 [mysql] entire log window on the forums
この不具合の解決方法はについては以前の記事でも紹介しているので、そちらも参考にしてもらいたい。
Mysqlは回復したがテーブルデータにはアクセスできなくなる
上記の通りに \xampp\mysql\data をバックアップしてファイル修復を行った結果、Mysqlは復旧し、phpMyAdminにもアクセスできるようになった。
いつもならこれで解決だが、今回はテーブルデータにアクセスしようとすると、下記のようなエラーが出てしまった。
「#1932 – Table ‘テーブル名’t exist in engine」
つまりテーブルが存在しないということを示しているのだが、テーブルは実質存在しているため、謎のエラーとなっている。
フロント部分にアクセスしてみたが、やはりデータベースへのアクセスで躓いているようで、動的要素が表示されなくなってしまった。
ちなみに、これまで作った他のテーブルへのアクセスにも同じようなエラーが出た。
正直、この時点でかなり焦っており、XAMPPの再インストールも検討していた。
解決方法①:dataからバックアップしたファイルを使う
上記の解決方法としては、最初にバックアップしていたファイルを一部使って解決できた。
具体的には \xampp\mysql\data からバックアップしていた下記のファイル一式を現状のdataディレクトリに配置したら直ったのだ。
- ib_buffer_pool
- ib_logfile0
- ib_logfile1
- ibdata1
上記により、テーブルへのアクセスはもちろん、フロント側も復旧することができた。
正直これでなんで直ったかはまだ調査中だが、一旦これで一安心できるだろう。
ひとまず、dataの中は定期的にバックアップしておくこと、そして今度からXAMPPはしっかりオフにしてからパソコンは閉じた方がよさそうだ。
解決方法②:管理者権限を無理やり変更する
自分は先ほど書いた①の方法で解決できたのだが、また作業中に同じエラーが発生した。
今回はちゃんとXAMPPを終了するようにしていたので、正直謎すぎる…
今回はテーブルには入れてDB操作もできるのだが、エラーが付きまとう感じだ(一応作業自体は可能)
いろいろ調べた結果、「/xampp/phpMyAdmin/config.inc.php」の中の下記の箇所をpmaユーザーからrootユーザー(管理者)に変更したら直った。
$cfg['Servers'][$i]['controluser'] = 'pma';//rootに変更
恐らく何かの拍子に管理者ユーザーが切り替わった可能性が高いので、まずはこっちから試してみてもいいかもしれない。