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

アーカイブの一覧に戻る

kentoku kento****@gmail*****
2012年 11月 15日 (木) 12:51:36 JST


斯波です。

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

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

どうぞ、よろしくお願いいたします。


2012年11月14日 12:04 磯部 和広 <k-iso****@rozet*****>:
> いつもお世話になっております。
>
> 真に申し訳ございませんが、現在運用中の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 mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev




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