各務 洋
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*****