[pgsql-jp: 36923] Re: pgpoolで\dエラー

Tatsuo Ishii ishii @ sraoss.co.jp
2006年 3月 24日 (金) 00:33:15 JST


石井です.

> 村田です。
> 
> ご指摘のとおり、
> OIDカウンタが,2つのデータベースが同じでないのが原因のようです。
> 
> この場合、
> (1) 強制的にOIDを変更できるのでしょうか?

PostgreSQLにはそういう標準機能はありません.Cで関数書けばできないこと
もないですが,危なすぎて公開できません:-)

> (2) こうならないためにはcreate tableはどのように実行すればよいでしょうか?

まずOIDカウンタを一致させてください.rsyncなどで物理的にデータベースク
ラスタをコピーすることをおすすめします(当然DBを停止してから実行).

> (3) \dではエラーになりますが、実際のレプリケーション動作上は
>     問題ないのでしょうか?

OIDに依存したSQLでない限り,問題ありません.
--
Tatsuo Ishii
SRA OSS, Inc. Japan

> よろしくお願いいたします。
> 
> OIDの確認 ----------
> 
> ■実行したSQL
> SELECT c.oid,
>   n.nspname,
>   c.relname
> FROM pg_catalog.pg_class c
>      LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
> WHERE pg_catalog.pg_table_is_visible(c.oid)
>      AND c.relname='test_tbl'
>      AND n.nspname='public'
> ORDER BY c.oid;
> 
> ■マスタ結果
>    oid   | nspname | relname
> ---------+---------+----------
>  1866202 | public  | test_tbl
> 
> ■セカンダリ結果
>    oid   | nspname | relname
> ---------+---------+----------
>  1866200 | public  | test_tbl
> 
> 
> On Wed, 22 Mar 2006 18:52:38 +0900 (JST)
> Tatsuo Ishii <ishii @ sraoss.co.jp> wrote:
> 
> > 石井です.
> > 
> > > 村田と申します。
> > > 
> > > Linuxサーバ2台でpgpoolを使用していますが、
> > > \dしようとするとエラーになる現象が出ています。
> > > pgpoolを使用する場合のdrop, createの手順に
> > > 問題があるのでは?と考えています。
> > > ご存知の方はご教授いただけないでしょうか。
> > > 
> > > ■現象
> > > pgpool経由でdropしたあとcreateしたテーブルに、
> > > \dしようとするとエラーが表示される。
> > > 
> > > taaweb=> \d test_tbl
> > > ERROR:  kind mismatch between backends
> > > HINT:  check data consistency between master and secondary
> > > server closed the connection unexpectedly
> > >         This probably means the server terminated abnormally
> > >         before or while processing the request.
> > > The connection to the server was lost. Attempting reset: Succeeded.
> > > 
> > > なおSELECTなどの発行は正常に実行されます。
> > 
> > OIDカウンタが,2つのデータベースが同じでない状態になっている可能性があ
> > ります(pgpoolは,レプリケーしょんスタート時に,OIDカウンタも含めて2つ
> > のデータベースクラスタが完全に一致していないと\dのような一部の問い合わ
> > せがエラーになります).
> > 
> > psql -E を使えば分かりますが,\d では,以下のような問い合わせが実行さ
> > れます.ご覧のように,\dはOIDをつかいまくりなので,OIDが一致していない
> > と,pgpoolから同じ問い合わせをマスターとセカンダリに発行しても結果が一
> > 致せず,エラーになってしまいます.
> > 
> > 試しにpsqlに-Eを付けた上でマスター側で直接\dを実行し,そこで実行された
> > 問い合わせをセカンダリで実行して同じ結果になるかどうか試してみてはどう
> > でしょう?
> > 
> > test=# \d t1
> > ********* QUERY **********
> > SELECT c.oid,
> >   n.nspname,
> >   c.relname
> > FROM pg_catalog.pg_class c
> >      LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
> > WHERE c.relname ~ '^t1$'
> >       AND pg_catalog.pg_table_is_visible(c.oid)
> > ORDER BY 2, 3;
> > **************************
> > 
> > ********* QUERY **********
> > SELECT relhasindex, relkind, relchecks, reltriggers, relhasrules, 
> > relhasoids , reltablespace 
> > FROM pg_catalog.pg_class WHERE oid = '16388'
> > **************************
> > 
> > ********* QUERY **********
> > SELECT a.attname,
> >   pg_catalog.format_type(a.atttypid, a.atttypmod),
> >   (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
> >    FROM pg_catalog.pg_attrdef d
> >    WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
> >   a.attnotnull, a.attnum
> > FROM pg_catalog.pg_attribute a
> > WHERE a.attrelid = '16388' AND a.attnum > 0 AND NOT a.attisdropped
> > ORDER BY a.attnum
> > **************************
> > 
> > ********* QUERY **********
> > SELECT c.relname FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '16388' ORDER BY inhseqno ASC
> > **************************
> > 
> >       Table "public.t1"
> >  Column |  Type   | Modifiers 
> > --------+---------+-----------
> >  i      | integer | 
> > --
> > Tatsuo Ishii
> > SRA OSS, Inc. Japan
> 
>  + sonicjam Inc.
>  | 
>  | Ken Murata
>  | 
>  | E-mail: ken @ sonicjam.co.jp
>  | URL: http://www.sonicjam.co.jp/
>  | TEL/FAX: 03-5774-7461/03-5774-7462
>  + 



pgsql-jp メーリングリストの案内