[groonga-dev,03579] Re: Mroonga_で_data_truncated_for_primary_key_column: <id> が発生する

Back to archive index

各務 洋 kagam****@outwa*****
2015年 10月 19日 (月) 11:48:48 JST


お世話になります、各務です。
ご返答ありがとうございます。

>>> これは、まだMroonga側にそのケースに対応するコードが入ってい
>>> ないからです。
>> 
>> という事は、Mroonga側の対応を待ってからの方が良さそうですね?
> 
> 開発者側としては一気に確認してもらうより、1つずつ確認しても
> らった方が助かります。理由はどの変更が効果があったかがはっき
> りするからです。

了解しました。では、

> 「更新中にクラッシュした場合に
> ユニークキーにしたカラムが重複したレコードが登録される可能性
> がある」という挙動はリリース版と変わっていないという点です。

Mroonga 側のこちらを留意して、

> 注意してほしい点は、この修正では、「削除しながらレコードを追
> 加するとプライマリーキーが同じレコードが複数見える可能性があ
> る」という問題が直る

この点を確認してみます。

> Mroonga側にも対応を入れてみました。
>   http://packages.groonga.org/tmp/mysql-community-mroonga-5.09-2.el6.x86_64.rpm

その後、↑を適用すると、留意していた点も解消しているという想定でよろし
いでしょうか?


> クラッシュリカバリーが動いたときはgroonga.logに"Auto repair
> is done"というログがでるようにしてありますが、手元で試した範
> 囲では一度も発動しませんでした。あまり効果がないかもしれませ
> ん。

おぉ、ありがとうございます!
合わせて確認してみます。


> 念のため、改めて書きますが、これはInnoDBのようにどんなときに
> クラッシュしてもレカバリーできるものでは「ありません」。新規
> レコード作成中とレコード削除中にクラッシュしたときにリカバリー
> できる「可能性が増える」だけです。
> 
> たとえば、Groongaレベルでの更新処理中にクラッシュして、デー
> タが入っているテーブルにロックが残ったときはリカバリーできま
> せん。
> 
> なにがあってもなくなってはいけないデータを扱うときは、バック
> アップをとったり(mysqldumpでもいいですし、レプリケーション
> で別マシンに随時コピーでもいいです)、元データを保存しておい
> たりして、Mroongaがクラッシュしてデータベースが壊れてしまっ
> たときに復旧できる運用にしてください。

これは是非ともドキュメントに記述が欲しい点だと思いました。
上記はストレージモードの事だと思うのですが、ラッパーモードではいかがで
しょうか?

但し、私の環境では今までの所、

A.unique index を外した table schema をコピーして、INSERT INTO SELECT 
  で流し込んだ後に、unique index を張りなおす。
  Duplicate のエラーがでたら除外する。
  解決できたら table を rename して差し替える。

B.ALTER TABLE テーブル名 ENGINE Mroonga を実行する。
  Duplicate が出たらA.と同じ

このいずれかの方法(といっても同じような事ですが)で実運用上で復旧可能
でした。
(あと、最悪 Mroonga テーブルが全損しても Innodb テーブルから再構築で
きる形にはしてあります。……時間は読めませんが。)


別件ですが、今回確認していてまったく復旧できない事がありました。
grndb recover の実行と disk full 状態が共に発生した際に、

grndb recover 
groonga で接続
mysql で use 

disk full を解消しても、いずれの方法でも全て応答が無くなる現象が発生し
ました。(完全に復旧不能だったのはこれが初めてです)
レアケースだと思いますが、ご報告まで。



----
各務
kagam****@outwa*****




groonga-dev メーリングリストの案内
Back to archive index