[groonga-dev,01099] Re: mroongaにおける、テーブル内情報と統計情報の不正について

アーカイブの一覧に戻る

磯部 和広 k-iso****@rozet*****
2012年 11月 14日 (水) 12:04:39 JST


いつもお世話になっております。

真に申し訳ございませんが、現在運用中のDBのため止められず、
groongaとmroongaのアップデートは出来ない状況です。

また、問題のテーブルはMLへの投稿後に
自分に調査を依頼したエンジニアがdrop&createしたそうです。

※mysql_dumpを使ってデータをバックアップしても、同様にidカラムに
 重複キーが出現するのでインポート出来ない状況です。

最新版の2.08は別マシン上にありますので、そちらで再現テストを行いますが
テスト準備も含めて3日程度掛かるとの事です。

このDBは、早くても12月半ばにならないと止められないそうです。
それまでにこの状況が再現した際には、下記を実施してみます。

mysql> ALTER TABLE table_name DISABLE KEYS;
mysql> ALTER TABLE table_name ENABLE KEYS;

ちなみに、今回のような現象が発生したのは4度目ぐらいだそうで
都度、truncate又はdrop&createしてデータを再登録していたそうです。

※同じ構成のDBが複数あり、異なるDBの同じテーブルです。
 全てのDBは同一のディレクトリ配下にあります。

尚、挙動としては、下記が報告されました。
 ・インサートしたはずのデータが見えない(select出来ない)
 ・(他データのインサート等をすると)見えなかったデータが見えるようになる
 ・上記の、見えなかったデータが見えるようになったタイミングで、
  削除したはずのデータが見えるようになった


(2012/11/14 10:24), kentoku wrote:
> 斯波です。
>
> お手数ではございますが、こちらの現象を最新版のmroonga 2.08でも
> 再現するかどうかご確認いただくことはできますでしょうか?
> バージョンアップには、リリースノートの記載に従い、インデックスの再作成や
> データベースの再作成を行う必要があることがありますので、ご確認をお願いします。
> http://mroonga.github.com/ja/blog/2012/10/29/release.html
>
> また、異常値となっているのはidカラムのみでしょうか?
>
> どうぞ、よろしくお願いいたします。
>
>
> 2012年11月13日 21:45 磯部 和広 <k-iso****@rozet*****>:
>> いつもお世話になっております。
>>
>> 首題の件につき質問させて下さい。
>>
>> 動作環境は、下記です。
>>
>> [root @ DB09 data]# head -n 1 groonga.log
>> 2012-05-18 18:50:01.795320|n|e897e700|mroonga 2.02 started.
>> [root @ DB09 data]# cat /etc/redhat-release
>> CentOS release 6.2 (Final)
>> [root @ DB09 data]#
>>
>> 現在、プライマリーキーを張った「id」フィールドに、
>> SQLでselectを行うと
>>  何故か「0」と表示される行が3つある
>> という状況になってしまっています。
>>
>> mysql> desc RZ_COMPARISON;
>> +----------------------+------------+------+-----+---------+----------------+
>> | Field | Type | Null | Key | Default | Extra |
>> +----------------------+------------+------+-----+---------+----------------+
>> | id | int(11) | NO | PRI | NULL | auto_increment |
>> | category_id | int(11) | NO | | NULL | |
>> | original_data_id | int(11) | YES | | NULL | |
>> | whole_flag | tinyint(4) | YES | | NULL | |
>> | lang_type | tinyint(4) | YES | | NULL | |
>> | wa_original | mediumtext | NO | MUL | NULL | |
>> | std_original | mediumtext | NO | MUL | NULL | |
>> | wa_trans | mediumtext | NO | MUL | NULL | |
>> | original | mediumtext | NO | MUL | NULL | |
>> | trans | mediumtext | NO | MUL | NULL | |
>> | original_line_length | int(11) | YES | | NULL | |
>> | trans_line_length | int(11) | YES | | NULL | |
>> | reg_date | datetime | YES | | NULL | |
>> | reg_id | int(11) | YES | | NULL | |
>> | upd_date | datetime | YES | | NULL | |
>> | upd_id | int(11) | YES | | NULL | |
>> +----------------------+------------+------+-----+---------+----------------+
>> 16 rows in set (0.00 sec)
>>
>> mysql> select id from RZ_COMPARISON where original_line_length = 0;
>> +----+
>> | id |
>> +----+
>> | 0 |
>> | 0 |
>> | 0 |
>> +----+
>> 3 rows in set (0.00 sec)
>>
>> mysql>
>>
>> プライマリーキーなので、本来有り得ない状況なのですが・・・
>>
>> が、where id=0 を指定してselectしても1件もヒットしません。
>>
>> mysql> select id from RZ_COMPARISON where id = 0;
>> Empty set (0.00 sec)
>>
>> mysql>
>>
>>
>> どうも、nroongaエンジン固有の問題のようです・・・
>>
>>
>>
>> これだけだと、問題解決の為に何も手掛かりが得られないので
>> 下記の実験を行いました。
>>
>> mysql> select count(1) from RZ_COMPARISON;
>> +----------+
>> | count(1) |
>> +----------+
>> | 2656 |
>> +----------+
>> 1 row in set (0.00 sec)
>>
>> mysql> select min(id), max(id) from RZ_COMPARISON;
>> +---------+---------+
>> | min(id) | max(id) |
>> +---------+---------+
>> | 246619 | 250513 |
>> +---------+---------+
>> 1 row in set (0.00 sec)
>>
>> mysql> select count(1) from RZ_COMPARISON where id <= 250513;
>> +----------+
>> | count(1) |
>> +----------+
>> | 2656 |
>> +----------+
>> 1 row in set (0.01 sec)
>>
>> mysql> select count(1) from RZ_COMPARISON where id >= 246619;
>> +----------+
>> | count(1) |
>> +----------+
>> | 1587 |
>> +----------+
>> 1 row in set (0.00 sec)
>>
>> mysql>
>>
>> 御覧のように、全件の数値と、
>>  id <= max(id) のものは件数が一致しますが
>>  id >= min(id) のものは件数が一致しない
>> という状況です。
>>
>> 繰り返しますが、idはプライマリーキーです。
>> 当然インデックスが張ってあります。
>>
>> どうも、インデックスの統計情報がおかしくなっているようです。
>> ※インデックスを指定してのカウントは、統計情報を使用すると推測しています。
>>  インデックスを張ってある項目のminやmax値も、同様に
>>  インデックスの統計情報から取得しているのだと思います。
>>
>> 次に、データをファイルに出力してみて状況を見てみました。
>>
>> [root @ DB09 data]# echo 'select id from RZ_COMPARISON' | mysql rz_00003 >
>> /tmp/a
>> [root @ DB09 data]# wc -l /tmp/a
>> 2657 /tmp/a
>> [root @ DB09 data]# head -n 2 /tmp/a
>> id
>> 246619
>> [root @ DB09 data]# tail -n 2 /tmp/a
>> 250509
>> 250510
>> [root @ DB09 data]#
>>
>> あれれ?
>> 変です。
>>
>> idの最小値と、ファイルに出力されたidの最小値は一致するのですが
>> 最大値が一致しません。
>>
>> 念の為ソートしてみましたが、結果は一緒です。
>>
>> [root @ DB09 data]# echo 'select id from RZ_COMPARISON order by id' |
>> mysql rz_00003 > /tmp/b
>> [root @ DB09 data]# wc -l /tmp/b
>> 2657 /tmp/b
>> [root @ DB09 data]# head -n 2 /tmp/b
>> id
>> 246619
>> [root @ DB09 data]# tail -n 2 /tmp/b
>> 250509
>> 250510
>> [root @ DB09 data]#
>>
>> 更に確認しました。
>>
>> [root @ DB09 data]# sort -n /tmp/b | head
>> id
>> 883
>> 884
>> 885
>> 886
>> 887
>> 888
>> 889
>> 890
>> 891
>> [root @ DB09 data]#
>>
>> SQLで取得したIDの最小値より小さいIDが・・・
>>
>> /tmp/b は、order by idを指定してあったのに、正しくソートされていません。
>>
>> [root @ DB09 data]# grep -n '^883' /tmp/b
>> 4:883
>> [root @ DB09 data]#
>>
>> 4行目に出現しているようなので、先頭10件を表示してみます。
>>
>> [root @ DB09 data]# head -n 10 /tmp/b
>> id
>> 246619
>> 246621
>> 883
>> 884
>> 885
>> 886
>> 887
>> 888
>> 889
>> [root @ DB09 data]# head -n 10 /tmp/a
>> id
>> 246619
>> 246621
>> 883
>> 884
>> 885
>> 886
>> 887
>> 888
>> 889
>> [root @ DB09 data]#
>>
>> order by句もインデックスを使用する筈なので、
>> やはりインデックス絡みのようです。
>>
>>
>> というわけで、首題の件名となりました。
>>
>> どうも、
>>  select id from RZ_COMPARISON where original_line_length = 0;
>>  にて、ありえない筈のプリマリーキーに同一の「0」として見える値が
>>  3件見える
>> のと
>>  IDの最大値と、データ出力した際のIDの最大値の差が3
>> とが関係しているようです。
>>
>> それとは別に、min関係のインデックス情報がおかしいようです。
>>
>>
>> ちなみに、経緯は下記です。
>>
>> このテーブルのプライマリーキーのid欄には、AUTO_INCREMENT属性が付いていますが
>> それとは別建てで
>>  ・IDだけを連番管理するテーブルに新規IDを採番
>>  ・採番したIDを用いて、このテーブルにデータをインサート
>> する仕組みになっています。
>>
>> その際に
>>  採番用テーブルのID値の最大値と、実際のデータのIDの最大値が違う(3件ず
>> れている)
>> のに、別のエンジニアがたまたま気付きました。
>>
>> で、自分が相談されて調査した所・・・という流れです。
>>
>> 尚、データは随時、追加や削除を繰り返していますのでidは飛び飛びになります。
>>
>> 最後に、テーブルの定義を載せておきます。
>>
>> CREATE TABLE `RZ_COMPARISON` (
>> `id` int(11) NOT NULL AUTO_INCREMENT,
>> `category_id` int(11) NOT NULL,
>> `original_data_id` int(11) DEFAULT NULL,
>> `whole_flag` tinyint(4) DEFAULT NULL,
>> `lang_type` tinyint(4) DEFAULT NULL,
>> `wa_original` mediumtext NOT NULL,
>> `std_original` mediumtext NOT NULL,
>> `wa_trans` mediumtext NOT NULL,
>> `original` mediumtext NOT NULL,
>> `trans` mediumtext NOT NULL,
>> `original_line_length` int(11) DEFAULT NULL,
>> `trans_line_length` int(11) DEFAULT NULL,
>> `reg_date` datetime DEFAULT NULL,
>> `reg_id` int(11) DEFAULT NULL,
>> `upd_date` datetime DEFAULT NULL,
>> `upd_id` int(11) DEFAULT NULL,
>> PRIMARY KEY (`id`),
>> FULLTEXT KEY `index_so` (`std_original`) COMMENT 'parser "TokenDelimit"',
>> FULLTEXT KEY `index_swt` (`wa_trans`) COMMENT 'parser\n"TokenDelimit"',
>> FULLTEXT KEY `index_o` (`original`),
>> FULLTEXT KEY `index_t` (`trans`),
>> FULLTEXT KEY `index_wo` (`wa_original`) COMMENT 'parser\n"TokenDelimit"'
>> ) ENGINE=mroonga DEFAULT CHARSET=utf8;
>>
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る