各務 洋
kagam****@outwa*****
2015年 5月 13日 (水) 20:36:05 JST
お世話になります、各務と申します。 この題名のものを確認していたら、発生したので同じで送らせていただきます。 (原因は前回とは別だと思います) ---------------------------------------------------------------------- 現象: 同一レコードの登録、削除、登録を行うとユニークキー重複エラーが発生する。 レプリケーションが最初の登録の時点で切断される。 発生頻度は毎回。 ---------------------------------------------------------------------- 環境: CentOS 6.4 groonga-libs.x86_64 5.0.3-1.el6 mysql-community-mroonga.x86_64 5.02-1.el6 mysql-community-server.x86_64 5.6.24-3.el6 ストレージモード マスター/スレーブの2台構成です。 ---------------------------------------------------------------------- 再現手順: 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 を作成し、削除し損ねているのではないのでしょうか? ---------------------------------------------------------------------- その他の事項: 実は、DATETIME型ではなく、TIMESTAMP型 でレプリケーションが切断されるの を探していました。index 等は関係なく。 (あと、mroonga テーブルの破損……) 福岡Groonga1 で再現できたらお送りしたいというのがすっかり遅くなって しまいましたが、ようやく最新の環境でテストできました。 TIMESTAMP型ではまだ見つかっておりません。 collisions(xxxxxxxx/xxxxxxx): lock failed 1000 times が頻発するのも気になっていますが。 何か他にお気づきの点があれば、ご指摘いただけると助かります。 よろしくお願いいたします。 ---- 各務 kagam****@outwa*****