当サイトは毎回ローカルで編集後、本番環境へアップロードする仕組みになっています。なので、毎回このサイトをその都度引っ越ししているみたいなものです。
毎回本番環境へアップロードするときにphpmyadminでローカル時と本番環境でいじくったりしているのですが、今回ローカル環境でデータベースにエラーが出てしまいました。
具体的には、下記三つが問題になってきます。
- 照合順序 = 使用中
- #1932 – Table doesn’t exist in engine
- #1813 – Please DISCARD the tablespace before IMPORT
照合順序 = 使用中
最初に、なんだトイレ使用中くらいなら待てばいいだろうくらいな勢いで、MySQLを再起動させてみたがまだずっと「使用中」となっている。

こちらの環境では最初popularpostsのテーブルが二つ使用中となっていたのだが、後になって上記のwp_410_linksも使用中となっていた。
そこでまずは既存の修理方法として、以下を試した。

修復したいテーブルの左側のところにチェックを入れ、画面下にあるプルダウンから「テーブルを修復」を選択。ちなみにコンソールでは
REPAIR TABLE テーブル名;
人によっては上記のphpMyAdmin or コンソールで修復ができるみたいだが、私の環境ではだめだった。
次に、上記テーブルをチェックし、「データまたはテーブルの削除」→「空にする」。まだ、使用中と書かれているがとりあえず、バックアップしてあったデータベースから該当するテーブルだけをインポートしてみようとした。
#1932 – Table doesn’t exist in engine
テーブルを空にし、バックアップからインポートして再生させようとしたが、また怒られてしまった。それもテーブルを空にしようとするとダメだといわれる。

直訳すると、「テーブルは存在しません」と。
いや、でも、テーブルあるし。
とりあえず、また修復を試みたが、だめだったので、テーブルを削除した。
#1813 – Please DISCARD the tablespace before IMPORT
さて、該当する壊れて削除したテーブルだけをインポートしようとしたら、今度は、以下のエラーが出た。

要するにテーブルが存在していた箇所を削除したが、まだ幽霊みたいに残っているのでそれを削除してくださいと。
もちろん、phpmyadminには表示されないので、phpmyadminに表示されないだけでファイルとして物理的に残っているのではと思い、データベースが格納してある箇所を調べた。
すると、

消えているはずのデータベースの残りかすがあるではないか!
MySQLを停止後、これを速攻で削除。
削除するのは該当するテーブル名と同じ .frmと.ibdである。
バックアップからインポート
その後、MySQLを再起動し、該当するテーブル、当サイトの場合は、410_links、popularpostsdata、popularpostssummaryのテーブルをインポートし、無事問題なくphpmyadminで照合順序が表示されるようになった。
照合順序は本来は、テーブルや環境によって違うが大体は、latin1_swedish_ci、utf8mb4_unicode_ciやutf8_general_ciなどになっているはずです。
対処法まとめ
- まずはテーブルの修復をphpmyadminから試みる。
- ダメだったなら該当するMySQLを停止させ、テーブルのファイルを削除(.frm, .ibd)
- そして、MySQL再起動後、該当するテーブルをインポートする。
書くと三行、直すには20分、記事を書くと30分くらいかな。
参考サイト

間違ってphpMyAdminからテーブルを削除してしまい、バックアップもない場合は、.frmと.ibdファイルから該当するテーブルを復活できるみたいです。当サイトでは試していませんので、ダメ元で試してみるといいでしょう。(下記サイトは英語のみ)
http://www.hexblot.com/blog/recovering-innodb-tables-ibd-and-frm-files改正
- 2016/08/17 – 初
- 2016/08/18 – 途中画像が抜けていたので修正。その過程でまた照合順序=使用中となった。原因不明。
- 2017/09/25 – 補助的な説明文など細かな修正 & 参考サイトを追加。
コメント