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/