Mroongaで、更新クエリがupdatingのまま終わらない

大五郎 ネイルハンマー 小 8oz (8オンス)

Mroongaで更新クエリが全然終わらないという現象が起きました。ちょっとやらかしてしまったときに、メモリ不足でMySQLが落ちたりしたことが原因なのかもしれません。はっきりとした原因はわかりません。データベースをダンプして作り直したところ、問題なく更新できるようになりました。。

show processlistでupdatingのまま

UPDATEクエリを投げたら様子がおかしいので、プロセス一覧を見たらupdatingのまま終わらない。FLUSHも効きません。

mysql> show processlist;
+—-+———+——+————————-+——————————–+
| Id | Command | Time | State | Info |
+—-+———+——+————————-+——————————–+
| 14 | Killed | 532 | updating | update |
| 17 | Query | 272 | Waiting for table flush | FLUSH TABLES |
| 18 | Query | 0 | init | show processlist |
+—-+———+——+————————-+——————————–+
3 rows in set (0.00 sec)

MySQLを再起動しようとしたところ、停止に失敗しました。

# /etc/init.d/mysqld stop
Timeout error occurred trying to stop MySQL Daemon.
mysqld を停止中: [失敗]

ちょっと手の打ちようがないので、いったん殺すことに。

# ps ax | grep mysql
# kill -9 pid

ただ、この症状が起きる前にも以下のエラーがちょこちょこ起きていたので、少し前から何かしらの問題を抱えていた可能性もあります。たくさんの更新クエリを流している最中にクエリを投げた時発生していたようです。ちょっと調べたのですが、対応方法はよくわからなかったのでリトライするようにして放置していました。

o.h.engine.jdbc.spi.SqlExceptionHelper : mroonga: repair: can’t recover from crash while updating

インデックス再構築をやってみる

まずはインデックス再構築を試してみましたがダメでした。インデックスの無効・有効クエリ自体は無事に終わるのですが、更新クエリが終わらない症状は改善しません。

ALTER TABLE ${YOUR_TABLE} DISABLE KEYS;
ALTER TABLE ${YOUR_TABLE} ENABLE KEYS;
http://mroonga.org/ja/docs/news/4.x.html

データベース作り直し

次に、本番データをダンプして開発環境で試してみたところ、更新クエリが無事に実行できました。なので、本番のデータベースをダンプ後に削除・新規作成し、ダンプしたデータをインポートしたところ、解決しました。メモリ不足でプロセスが強制終了したときに何かしらデータが破損したのかもしれません。

# mysqldump -uuser -ppassword -r dump –single-transaction dbname
# mysql -uuser -ppassword dbname < dump