存在しないテーブルなのに、テーブルが作れなくなった。
そんな現象に遭遇した時のトラブルシューティングを紹介します。
DROP TABLE ...
の後にCREATE TABLE ....
とした所、消したはずのテーブルが作れないshow tables;
を見る限り存在しないので、MySQLとしては存在しないと言える- mroongaの管理データの中にのみテーブルが残存している様子
状況確認
今回作れなくなったテーブル
wikipediaデータベースにある、search_fulltextテーブルとして話を進めます。
発生したエラー
今回の対処法は、こういったエラーが発生したときに使えます。
ERROR 1146 (42S02): Table 'wikipedia.search_fulltext' doesn't exist
ERROR 1005 (HY000): already used name was assigned: <search_fulltext>
show tables;
この一覧には search_fulltext は存在しません。
実際のファイル
lsコマンド
でファイル一覧を見ても、存在しません。
$ sudo ls -alh /var/lib/mysql/wikipedia/
/var/log/mysqld.log
以下の記述がありました。
MySQL的には存在しないのでごもっともなエラーメッセージです。
2013-05-27 12:57:09 16955 [Warning] InnoDB: Cannot open table wikipedia/search_fulltext from the internal dat a dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/inno db-troubleshooting.html for how you can resolve the problem.
groongaコマンドを発行
table_list
コマンドを発行し、先ほど作れなかったテーブルが
mroongaでは存在することになっているか確認します。
実行はMySQLまたはコマンドライン、どちらでも構いません。
mysql> select mroonga_command('table_list');
$ sudo groonga /var/lib/mysql/wikipedia.mrn > table_list
復旧方法
mroongaを利用するテーブルを一旦ゼロにし、
mroongaの管理データを物理削除する手法を利用します。
それでは、手順を追って説明しましょう。
ステップ1
ストレージエンジンをmroonga以外の形式、例えばMyISAM形式に変換しましょう。
対象は、該当データベースwikipedia
に属する全てのテーブルです。
use wikipedia; alter table foo_fulltext engine=myisam; alter table bar_fulltext engine=myisam; alter table search_fulltext engine=myisam;
ステップ2
.mrn
ファイルを手動で全て削除します。
$ sudo rm -f /var/lib/mysql/wikipedia.mrn*
ステップ3
flush tables;
またはMySQLの再起動を行います。
ステップ4
先ほどmyisam形式にしたテーブルを、元通りにしましょう。
.mrn
ファイルは、mroongaを利用したテーブル作成時に自動で再作成されます。
もちろん、テーブルコメントやインデックスコメントに記載した
parserやnormalizer、engineも反映されます。
use wikipedia; alter table foo_fulltext engine=mroonga; alter table bar_fulltext engine=mroonga; alter table search_fulltext engine=mroonga;
これで、mroongaの管理データを再構築する事が出来ました。
なお、その他のテーブルをどうしても触れない状況の場合には、
table_remove
という groongaコマンドが使えるかもしれません。
しかしそれは未検証です。結果を是非、教えてください。
PlanetMySQL Voting: Vote UP / Vote DOWN