[groonga-dev,03892] Re: PGRNファイルが開けない?

Back to archive index

高見 直輝 takam****@orega*****
2016年 2月 1日 (月) 19:21:24 JST


高見です。

> >> Sourcesのあとの「37356」がインデックスのID(PostgreSQLの中で
> >> はOIDと呼ばれているもの)なんですが、PGroongaはVACUUMのとき
> >> に「37356」が有効かどうかをチェックして無効ならその
> >> SourcesXXXと関連する(Groongaの)テーブル・カラムを削除して
> >> います。
> >> 
> >> 有効かどうかのチェック方法は、たぶん、SQLでいうと
> >> 
> >>   SELECT * FROM pg_class WHERE oid = 37356;
> >> 
> >> に相当します。問題のデータベースで↑の結果がどうなるか教えて
> >> もらえませんか?
> >> 
> >> 
> >> レコードが存在しないなら想定外なんですが、たぶん、存在するん
> >> ですよ。とすると、なんで無効扱いになっているかなんですけど、
> >> なんでだろう。デバッガーで追えればすぐにわかりそうですが。。。
> > 
> > 残念ながら、レコードが存在しませんでした。
> 
> え、あ、そうなんですか。
> 
> > 1.0.0にデバッグログ出力を追加したモジュールなどを作成してもらえれば、差
> > し替えて調査することは可能です。
> > よろしければ御検討下さい。
> 
> これはPGroongaレベルでどうこうの話ではなく、PostgreSQLレベル
> でどうこうの話なんです。(PostgreSQLがインデックスをどうやっ
> て管理しているか。)
> 
> インデックスは存在しているがpg_classには該当インデックスの
> OIDが存在しない、という状況がどういうときに発生するかがわか
> ればいいんですが、どのようなSQLを実行しているかがわからない
> とこちらで再現できないので調べられないんです。
> 
> なにか操作するたびにpg_classをチェックして、どんな操作をすれ
> ば「インデックスは存在しているがpg_classには該当インデックス
> のOIDが存在しない」という状況になるか絞り込んでもらうことは
> できますか?

autovacuum = offにした状態で確認したところ、ANALYZEがトリガであることが
判明しました。
※InsertとSelectでは発生しないことを確認。
以下の処理を行い、再現することを確認しました。
1.pgrn*ファイルの削除
2.REINDEX実行
3.ANALYZE実行
この後、数分以内にobj_removeが実行され始めます。

> たぶん、REINDEXしたときはpg_classに存在していると思うんです
> よ。PGroongaにそのOIDのインデックスを作ってくれ、という指示
> が飛んでいるので。なので、それ以降のそうさのどこかでpg_class
> から消えるんだと思うんです。

オブジェクトが残っている状態でpg_classからデータが消えるという状況がよく
分かっていないのですが、上記手順における、REINDEXの実行後とANALYZEの実行
後(obj_removeの完了後)でpg_classの内容を比較しました。
その結果、PGroongaのインデックスのレコード数並びに内容に変化はありません
でした。
pg_classの内容取得に使用したSQLは以下の通り。
select oid, * from pg_class;
確認内容に不備がある場合はご指摘下さい。

なお、ANALYZEの実行後、REINDEX実行時に作成されたpgrn*ファイルが、pgrn、
pgrn.0000000、pgrn.001、pgrn.confの4つを除いて削除されました。

現時点で判明したのは以上です。

----------------------------- 
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180




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