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

Back to archive index

各務 洋 kagam****@outwa*****
2015年 9月 28日 (月) 13:11:32 JST


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

> 手元でも試してみたいので、実際のテーブル定義を教えてもらうこ
> とはできないでしょうか!?

ありがとうございます!
テストを行ったのは下記になります。

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

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

↑が全て実行中なのを確認しながら、mysqld を 何回も killする
# kill -9 `ps ax|egrep -i "/usr/sbin/mysqld --basedir"|egrep -v "grep"|awk '{print $1}'`
(mysql_safe の sanity check に引っかからない間隔で)

CREATE TABLE `tbl_num` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `a_id` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=Mroonga AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

INSERT INTO tbl_num (a_id) VALUES (1);
↑を1000回

-- ここ失念、tbl_test_pat_0005 を Truncate Table か、Drop Tableで作り直している(はず)

-- 1,000,000 行作成
SET @num = 0;
INSERT INTO tbl_test_pat_0005 (a_id)
SELECT (@num := @num + 1) AS a_id FROM tbl_num AS tbl_a, tbl_num AS tbl_b

UPDATE tbl_test_pat_0005 SET t_text = uuid() WHERE t_text ='' ORDER BY id LIMIT 1;
-- ↑これを実行時に warning に気づく。

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

になります。
今回は mysqld_safe 側に仕込んだ grndb コマンドの動作確認に注意していて、
groonga.log の確認が遅くなってしまいました。

ちなみに start 時に grndb recover を通しているのですが、今回は終了ステー
タスは 0 以外のものは発生しなかった模様です。

今、気づいたのですが、Replication は DELETE 処理をしている間に切れてい
ますね……。


> grndb checkは「ロックが残留しているかどうか」を壊れているか
> どうかの判断に使っています。ロックが残留していると「中途半端
> な状態でクラッシュした」はずなのでデータベース内に不整合
> (極端な例だと"Hello"のうち"Hel"までしか書き込まれていないと
> か)がある可能性が高い、という判断です。

なるほど。
確かに今回は中途半端でのクラッシュを狙ってテストしておりました。
この、「ロックが残留」している状態というのは、他に確認する方法があるよ
うでしたら試してみたいと思いますが、何かございますか?

ここ数ヵ月でだいぶ減りましたが、現象としては値の破損より Index の破損
の方が多いので、この点が何か分かればなぁと思っています。



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




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