[pgsql-jp: 35617] Re: ANALYZE で oid が変化してしまう
Tatsuo Ishii
t-ishii @ sra.co.jp
2005年 6月 29日 (水) 15:18:37 JST
石井です.
> 加澤です。ほんのちょっと情報追加です。
>
> 05/06/28 に Kazawa Tsunehisa<digitune @ gmail.com> さんは書きました:
> > pgpool 2.5.2 を経由して LargeObject を利用するために、インプレスの
> > 「まるごとPostgreSQL!」(ISBN4-8443-2053-X) で石井さんも紹介されて
> > いる「pg_database テーブルをロックして同期」作戦で oid の同期を取り、
> > これまでのところはうまく動いていました。(こちらの ML でも以前ご報告
> > させていただきました。)
> >
> > ところが、別のマシンに同じ環境を構築して動作させてみたところ、なぜか
> > 元のマシンでは起きなかった ANALYZE コマンドにより oid が消費されて
> > しまう、という現象が起こりました。
> >
> > 現象が起こるマシンと起こらないマシン双方とも OS は Red Hat Enterprise
> > Linux 4 (WS) で、 PostgreSQL も OS 付属の 7.4.7 です (ちょっと古い)。
> >
> > ANALYZE コマンドが内部で newoid してしまう条件のようなものが何か
> > あるのでしょうか?
>
> その後、テーブル単位の ANALYZE などを行ってさらに調べてみたところ、oid
> が消費されていると思われる環境でも、「ANALYZE pg_largeobject」した時
> のみ、oid が消費されるらしいことが分かりました。他のいかなるテーブルを
> ANALYZE した時も oid は消費されていないようです。
>
> oid 消費の有無の確認方法は、アプリケーションから新しい LargeObject を
> 作成してみて、その LargeObject に割り当てられる oid が連番となるかどうか
> で行っています。oid 消費が見られない環境ではこれが綺麗に連番になるのに
> 対し、oid を消費してしまう操作 (ANALYZE pg_largeobject) を行うと番号が
> スキップしてしまうことが確認出来ます。
>
> analyze 処理周りのソースを読んで newoid される条件を探そうとしていますが、
> 難航中です…。
psqlで接続した後,別端末からpsコマンドでpostgresプロセスのpidを調べ,
gdbでpostgresにアタッチしてnewoidにブレークポイントを貼って,ANALYZEを
実行し,止ったところでgdbのbtコマンドでバックトレースを取れば,どうい
う条件でnewoidが呼ばれるか簡単にわかると思います.
これだけでよくわからないようでしたら,ダイレクトメール下さい.
ちなみに,こちらでやってみた限りでは,newoidは呼ばれませんでした.
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内