yoku ts.
yoku0****@gmail*****
2015年 5月 19日 (火) 00:42:07 JST
こんばんは、yoku0825です。 Error 'Data truncated for column 't_date' at row 1' 'でSQLスレッド止まる件が全然再現しなくて困って(?)ます(´・ω・`) ↑のやつ、sql_mode= STRICT_ALL_TABLESにしてもワーニングで収まっちゃうんですね。 Handlerレイヤーのワーニングだからかしら。むーん。 こっちなら何となく想像がつきます。 > 確認した事項: > > replication は Slave側が 最初の Error 'Duplicate entry '10001' for key 'a_id'' > on query. Default database: 'db_test'. > Query: 'INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001')' マスター側は並列で突っ込んでくるので、 Mroongaさんのマルチスレッドアンセーフな部分ですり抜けて(?)NSERTが成功しそうですが、 スレーブ側ではバイナリーログ上にシリアライズされて1クエリーずつ実行されるので 本来マスターでも期待される通りユニークキー制約に引っかかっています。 これ、Data truncated for .. のやつとは別件ですよね。。(´・ω・`) (最近あんまり時間が取れてなくて。。) 2015年5月18日 18:05 各務 洋 <kagam****@outwa*****>: > お世話になります、各務です。 > ようやく Unique 制約のフィールドに重複して値が入るのが再現できました。 > > > ---------------------------------------------------------------------- > 現象: > > mroonga で複数の接続から同一レコードの登録、削除を繰り返すと、ユニーク > 制約が効かず、重複したキーのレコードが複数登録される。 > > 発生頻度は毎回。 > > > ---------------------------------------------------------------------- > 環境: > > CentOS 6.5 > 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 DATABASE db_test; > USE db_test; > CREATE TABLE `tbl_test_pat_0005` ( > `id` BIGINT(20) NOT NULL AUTO_INCREMENT, > `t1_date` TIMESTAMP NOT NULL DEFAULT current_timestamp, > `t2_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00', > `a_id` BIGINT(20) NOT NULL Default 0, > `t_text` LONGTEXT, > PRIMARY KEY (`id`), > UNIQUE KEY `a_id` (`a_id`), > FULLTEXT INDEX `t_text` (`t_text` ) COMMENT 'normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' > ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; > ; > > -- 下記を1000回繰り返すものを 「mix05.sql」 として準備 > INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001'); DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ; DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001 ; > > > コンソール1から > while true; do mysql -tN db_test <./mix05.sql|tee -a v1.txt; done > > 別接続のコンソール2から > while true; do mysql -tN db_test <./mix05.sql|tee -a v2.txt; done > > 同3から > while true; do mysql -tN db_test <./mix05.sql|tee -a v3.txt; done > > 同4から > while true; do mysql -tN db_test <./mix05.sql|tee -a v4.txt; done > > しばらく待ってみてから Ctrl + C で止める。 > > SELECT * FROM tbl_test_pat_0005; > +------+---------------------+---------------------+-------+--------+ > | id | t1_date | t2_date | a_id | t_text | > +------+---------------------+---------------------+-------+--------+ > | 6497 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6527 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6535 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6554 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6556 | 2015-05-18 12:58:51 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6674 | 2015-05-18 12:58:52 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6707 | 2015-05-18 12:58:53 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 6837 | 2015-05-18 12:58:56 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 0 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 0 | | > | 2791 | 2015-05-18 12:58:12 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 4057 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 4135 | 2015-05-18 12:58:26 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 4315 | 2015-05-18 12:58:28 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 4436 | 2015-05-18 12:58:30 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 4559 | 2015-05-18 12:58:31 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 5052 | 2015-05-18 12:58:35 | 0000-00-00 00:00:00 | 10001 | t10001 | > | 5078 | 2015-05-18 12:58:36 | 0000-00-00 00:00:00 | 10001 | t10001 | > +------+---------------------+---------------------+-------+--------+ > > と、Unique が期待される a_id に値が重複して登録されている。 > id 0 のレコードが出来ている。 > > > ---------------------------------------------------------------------- > 期待する動作: > > Unique 制約を保って欲しい > replication が切れないようにして欲しい。(← 自分用メモ:slave_exec_mode を戻してみる) > id 0 のレコードが残らないようにして欲しい。 > > > ---------------------------------------------------------------------- > 確認した事項: > > replication は Slave側が 最初の Error 'Duplicate entry '10001' for key 'a_id'' > on query. Default database: 'db_test'. > Query: 'INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001')' > > で切断され、重複した値は入っていませんでした。 > > もっとシンプルなテストだと、重複が発生しないのもありました。 > > 上記でいかがでしょうか?よろしくお願いします。 > > > > ---- > 各務 > kagam****@outwa***** > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.osdn.me/mailman/listinfo/groonga-dev