Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

mroongaで「ERROR 1005 (HY000): already used name was assigned」エラーが起きた際の復旧手順

$
0
0

存在しないテーブルなのに、テーブルが作れなくなった。
そんな現象に遭遇した時のトラブルシューティングを紹介します。

  • 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

Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>