[groonga-dev,03249] Re: mroongaで複数接続による同一レコードの登録、削除を繰り返すと、ユニーク制約が効かなくなる

Zurück zum Archiv-Index

各務 洋 kagam****@outwa*****
2015年 5月 19日 (火) 20:34:49 JST


お世話になります、各務です。

> Error 'Data truncated for column 't_date' at row 1'
> 'でSQLスレッド止まる件が全然再現しなくて困って(?)ます(´?ω?`)
> ↑のやつ、sql_mode= STRICT_ALL_TABLESにしてもワーニングで収まっちゃうんですね。
> Handlerレイヤーのワーニングだからかしら。むーん。

ありゃ、「groonga-dev,03232」でお送りした方は最初の報告とは別環境で、
新規に作成した小さい検証環境なのですが、replication が切れるのはどちら
でも再現してますねぇ。(今も発生しました)

あと小さい検証環境側は、
slave_exec_mode = STRICT
のままでした。
(設定忘れていました)

ほとんどデフォルトから変更していませんが、念のため my.cnf の記述も添付します。

----------------------------------------------------------------------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

transaction_isolation = READ-COMMITTED
mroonga_lock_timeout = 30000
innodb_lock_wait_timeout = 50
expire_logs_days = 5
max_allowed_packet = 32M 

##############################
# Master 
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
##############################

##############################
# Slave
# server-id = 2
##############################

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
quick
max_allowed_packet = 32M
----------------------------------------------------------------------


>> 確認した事項:
>>
>> 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 .. のやつとは別件ですよね。。(´?ω?`)
> (最近あんまり時間が取れてなくて。。)

tbl_test_pat_0005 の方は別件なのかなぁ。エラーで切れる(切れないでよ!)
というところは一緒ですが。それ以外だと、

tbl_test_pat_0001:
スレーブ側にデーターが入る。
(ちょっと型範囲からはおかしいけど、マスターと同じで期待通り)

tbl_test_pat_0005:
スレーブ側にデーターは入らない。
(主キー重複だから。マスターと違うが期待通り)

あれ?……う〜ん。

そうだ、tbl_test_pat_0005 は innodb でもテストしたのですが、mroonga の
テストが先だったので、その時点で replication は切れていたのです。
replication 戻して、innodb でどうなるか試してみますね。


>> >> LOCK TABLES tbl_test_pat_0002 WRITE;
>> >
>> > (^-^; さ、最後の武器に取っておいてよいですか?
>>
>> はい!
> 
> get_lock関数という手もありますよ! :)
> https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_get-lock

ありがとうございます! Postgres での advisory lock っぽく使えるかなぁ。



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




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index