各務 洋
kagam****@outwa*****
2015年 5月 14日 (木) 18:30:39 JST
お世話になります、各務です。 同一レコードの登録、削除を連続で繰り返すと、値が抜けた状態で保存される のが見えましたのでお送りします。 ---------------------------------------------------------------------- 現象: 同一レコードの登録、削除を連続で行うと、期待通りに値が保存されない事がある。 発生頻度は毎回。 ---------------------------------------------------------------------- 環境: 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_0002` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `a_id` BIGINT(20) NOT NULL Default 0, `t_key` VARCHAR(255) NOT NULL, `t_date` TIMESTAMP NOT NULL DEFAULT current_timestamp, PRIMARY KEY (`id`), UNIQUE KEY `a_id` (`a_id`), UNIQUE KEY `uidx_tbl_test_t_key_t_date` (`t_key`,`t_date`) ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 下記を1万回繰り返すものを 「1.sql」 として準備 INSERT INTO tbl_test_pat_0002 (a_id, t_key, t_date) VALUES (1, 'test1', '0000-00-00'); DELETE FROM tbl_test_pat_0002 WHERE a_id = 1; -- 表示用を 「s1.sql」として準備 SELECT * FROM tbl_test_pat_0002; -- ここから OS の console で 表示用のSQLを連続で起動 while true; do mysql -tN db_test <./s1.sql|tee -a v1.txt; done -- 別 console で、INSERT/DELETE を起動。 mysql db_test < 1.sql while で回している画面をみると。 +------+---+-------+---------------------+ | 1517 | 1 | test1 | 0000-00-00 00:00:00 | +------+---+-------+---------------------+ +---+---+--+---------------------+ | 0 | 0 | | 0000-00-00 00:00:00 | +---+---+--+---------------------+ +------+---+-------+---------------------+ | 1534 | 1 | test1 | 0000-00-00 00:00:00 | +------+---+-------+---------------------+ +------+---+--+---------------------+ | 2113 | 0 | | 0000-00-00 00:00:00 | +------+---+--+---------------------+ 等、値が抜けているのが確認できる。 (主キーの値は「アテ」、実際の値はwhileの間隔次第) ---------------------------------------------------------------------- 期待する動作: 値が抜けないようにして欲しい。 ---------------------------------------------------------------------- 確認した事項: Slave 側でも同じ while を回すと、同様の出力が確認できた。 ENGINE = innodb で作成すると発生しない。(そして遅い) 実際に +---+---+--+---------------------+ | 0 | 0 | | 0000-00-00 00:00:00 | +---+---+--+---------------------+ で止まった状態のレコードは確認できなかったものの、このテストとは別件で、 数日前に本番環境でリリース準備をしていたところ、テーブルが壊れたとの報 告があり、確認したところ +---+---+--+---------------------+ | 0 | 0 | | 0000-00-00 00:00:00 | | 0 | 0 | | 0000-00-00 00:00:00 | +---+---+--+---------------------+ このような2レコードのみが格納された状態になっていました。 ※本番環境 mroonga 4.01 ---- 各務 kagam****@outwa*****