読者です 読者をやめる 読者になる 読者になる

Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

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

mysql-mroonga MySQL

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

  • 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

復旧方法(ストレージモード)

ストレージモードの場合には復旧が容易です。
table_remove "対象テーブル名"という groongaコマンドを発行するのみです。

-- 作業するデータベースを選択
use wikipedia;

-- 破損したテーブルを指定
select mroonga_command('table_remove search_fulltext');

これで、再度テーブルを作成すれば今まで通り使えます。

以下記事も参考になります。 http://kazupyong.hatenablog.com/entry/2013/06/03/171044

復旧方法(ラッパーモード)

ラッパーモードの場合には mroongaを利用するテーブルを一旦ゼロにし、mroongaの管理データを物理削除する手法を利用します。
それでは、手順を追って説明しましょう。

ステップ1

ストレージエンジンをmroonga以外の形式、例えばMyISAM形式に変換しましょう。
対象は、該当データベースwikipediaに属する全てのmroongaテーブルです。

use wikipedia;
alter table foo_fulltext engine=myisam;
alter table bar_fulltext engine=myisam;

ステップ2

.mrnファイルを手動で全て削除します。

$ sudo rm -f /var/lib/mysql/wikipedia.mrn*

ステップ3

flush tables;またはMySQLの再起動を行います。

ステップ4

先ほどmyisam形式にしたテーブルを、元通りにしましょう。
.mrnファイルは、mroongaを利用したテーブル作成時に自動で再作成されます。
もちろん、myisam変換後もテーブルコメントやインデックスコメントは残っているので、
記載したparserやnormalizer、engine(ラッパーモード指定)もmroongaに戻した際に反映されます。

use wikipedia;
alter table foo_fulltext engine=mroonga;
alter table bar_fulltext engine=mroonga;

これで、mroongaの管理データ及びフルテキストインデックスの完全再構築が出来ました。

ステップ5

CREATE TABLE search_fulltextで、作れなかったテーブルが作れれば、作業は成功です。

最後に

この記事に2回も自分自身がお世話になってます。助かった。。
ラッパーモードで、その他のテーブルをどうしても触れない状況の場合の代替策は見つかっていません。
少なくとも、table_remove "対象テーブル名"という groongaコマンドを発行しても、状況は改善しなかったことを補足します。