[groonga-dev,03221] Re: mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生

アーカイブの一覧に戻る

Kouhei Sutou kou****@clear*****
2015年 5月 14日 (木) 00:19:40 JST


須藤です。

In <20150****@domai*****>
  "[groonga-dev,03219] Re: mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生" on Wed, 13 May 2015 20:36:05 +0900,
  各務 洋 <kagam****@outwa*****> wrote:

> ----------------------------------------------------------------------
> 現象:
> 
> 同一レコードの登録、削除、登録を行うとユニークキー重複エラーが発生する。
> レプリケーションが最初の登録の時点で切断される。
> 
> 発生頻度は毎回。
> 
> ----------------------------------------------------------------------
> 再現手順:
> 
> CREATE TABLE `tbl_test_pat_0001` (
> 	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
> 	`t_key` VARCHAR(255) NOT NULL,
> 	`t_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
> 	PRIMARY KEY (`id`),
> 	UNIQUE KEY `uidx_tbl_test_t_key_t_date` (`t_key`,`t_date`)
> ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
> 
> INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00');
> DELETE FROM tbl_test_pat_0001 WHERE id = 1;
> INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00');
> 
> で、
> ERROR 1062 (23000): Duplicate entry 'test1-0000-00-00 00:00:00' for key 'uidx_tbl_test_t_key_t_date'
> 
> が発生します。

ありがとうございます!
たしかに再現しました!

> ----------------------------------------------------------------------
> 確認した事項:
> 
> 最初の INSERT で、warning が発生。
> 
> | Error | 1265 | Data truncated for column 't_date' at row 1 |
> 
> その時点で SELECT すると
> 
> +----+-------+---------------------+
> | id | t_key | t_date              |
> +----+-------+---------------------+
> |  1 | test1 | 0000-01-01 00:00:00 |
> +----+-------+---------------------+
> 
> と、0000-00-00 が 0000-01-01 00:00:00 になっている。
> (※ mroongaストレージエンジンは月や日の値に指定された0を1へと自動的に補正します。なので)
> 
> この際、スレーブ側へのレコード登録は「0000-01-01 00:00:00」で成功するが、
> レプリケーションは切断される。
> 
> Error 'Data truncated for column 't_date' at row 1' on query. Default database: 'db_test'. 
> Query: 'INSERT INTO tbl_test_pat_0001 (t_key, t_date) VALUES ('test1', '0000-00-00')' 
> 
> その後、DELETEし、再 INSERT 時のエラーが
> | Error | 1062 | Duplicate entry 'test1-0000-00-00 00:00:00' for key 'uidx_tbl_test_t_key_t_date' |
> 
> となるので、truncate する前の値で index を作成し、削除し損ねているのではないのでしょうか?

INSERTするときは'0000-00-00'相当の値で、DELETEするとき
は'0000-01-01'相当の値でインデックスを削除しようとして失敗し
ているような感じでした。

INSERTするときもMroongaが認識した値でインデックスに登録する
ようにしておけばよさそう。。。なのかしら。


ところで、手元だと

> Error 'Data truncated for column 't_date' at row 1' on query. Default database: 'db_test'. 

というようにErrorではなくWarning扱いになっていたのですが、レ
プリケーションが切断されるのはエラー扱いになっているから、、、
だったりするのかしら。

> ----------------------------------------------------------------------
> その他の事項:
> 
> 実は、DATETIME型ではなく、TIMESTAMP型 でレプリケーションが切断されるの
> を探していました。index 等は関係なく。
> (あと、mroonga テーブルの破損……)

MySQLがクラッシュしたという状況ではないですよね?

> 福岡Groonga1 で再現できたらお送りしたいというのがすっかり遅くなって
> しまいましたが、ようやく最新の環境でテストできました。

ありがとうございます!

> TIMESTAMP型ではまだ見つかっておりません。

これも不正な値(Mroongaが扱えない値)関連なんですかねぇ。

> collisions(xxxxxxxx/xxxxxxx): lock failed 1000 times 
> が頻発するのも気になっていますが。

これ、どういうときに発生しているかわかりますか?
もし、複数接続で同時に書き込みしているなら、1接続で順に書き
込むようにすると解消するかもしれません。さらにロックが競合し
なくてそっちの方が速くなるかもしれません。

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
プログラミングが好きな学生のための勉強会:
  http://www.seplus.jp/sezemi/




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る