[groonga-dev,03518] Re: Mroonga で data truncated for primary key column: <id> が発生する

Back to archive index

各務 洋 kagam****@outwa*****
2015年 9月 28日 (月) 20:30:00 JST


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

表題の現象とは違うのですが、とり急ぎ、Mroonga を壊しやすい方法が分かっ
てきましたので、お送りします。
Mroonga さんが嫌がりそうなタイミングで Kill を入れつづけます。

-- ここから ---------------------------------------------------------------------

CREATE DATABASE db_test2;
USE db_test2;
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」 として準備
DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001; INSERT INTO tbl_test_pat_0005 (a_id, t_text) VALUES (10001,'t10001'); DELETE FROM tbl_test_pat_0005 WHERE a_id = 10001;

コンソール1から
$ while true; do mysql -tN db_test2 <./mix05.sql|tee -a v1.txt; done

別接続のコンソール2から
$ while true; do mysql -tN db_test2 <./mix05.sql|tee -a v2.txt; done

同3から
$ while true; do mysql -tN db_test2 <./mix05.sql|tee -a v3.txt; done

同4から
$ while true; do mysql -tN db_test2 <./mix05.sql|tee -a v4.txt; done


確認用コンソール
while true; do mysql -D  db_test2 -e "SELECT id FROM tbl_test_pat_0005;";done; 

crash 用コンソール(grndb check で、exit 0 以外が返ってきたら、mysqld を kill する)
# while true; do date +'%Y%m%d %H:%M:%S'.$(printf '%03d' $(expr `date +%N` / 1000000)); grndb check /var/lib/mysql/db_test2.mrn||kill -9 `ps ax|egrep -i "/usr/sbin/mysqld --basedir"|egrep -v "grep"|awk '{print $1}'`; sleep 1s; done;

-- ここまで ---------------------------------------------------------------------

crash 用コンソール に Index の Lock が出てくると、 kill を発生させますが、
最初は問題なく、続けるごとに kill の間隔が短くなっていき、DELETE/INSERT
が阻害されるようになります。


現象:
・確認用コンソールで表示している id が kill 毎に 1から再採番になる。
・コンソール2〜4 を止めて、1のみにしても Dupilicate Index が出続けるようになる。
・unique 制約のある a_id に 0 が入ったり、10001 が無くても duplicate insert と言われる。
・確認用コンソールで表示している id が 0 のみになる。

この状態で、grndb check の結果はまちまちですが、「Table is locked」
「Index column is locked」
が出る事もあれば、出ない事もあり、多くは出ませんでした。
いずれにせよ、grndb recover での修復は難しいようでした。

(lock_clear するとご教示いただいた通りロック残留が無くなって、
grndb check で検知できなくなるだけのようです)

検知できたら ALTER ENGINE かなぁと考えていますが、何か他の案もいただけ
ると幸いです。


P.S

要望:
・Mronnga が壊れにくくなって欲しい。
・壊れても自動復旧して欲しい。

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




groonga-dev メーリングリストの案内
Back to archive index