[pgsql-jp: 36709] Re: pgpool使用時のSERIAL型の取り扱いについて
Tatsuo Ishii
ishii @ sraoss.co.jp
2006年 2月 9日 (木) 22:48:46 JST
石井です.
> 伊藤と申します。
>
> pgpool 2.6にてSERIAL型を含むテーブルの同期を取ることができるようになった
> と認識しておりますが、下記SQLを発行した場合同期がとれず困っております。
> select nextval('hoge_seq')
> 環境としてはDBサーバAをマスタとし(PostgreSql+pgpool)でDBサーバ
> B(PostgreSqlのみ)をセカンダリとしています。
>
> いろいろ試した結果以下の2つの方法ではPHPプログラムからでも、psql上からで
> も同期がとれました。SQL発行はDBサーバAのport5432に見えるPostgreSqlです。
> 成功例1
> begin
> select nextval('hoge_seq')
> commit
>
> 成功例2
> /*INSERT LOCK*/ select nextval('hoge_seq')
>
> 例2の記述=insert_lockディレクティブがtrueと認識していましたが間違ってい
> るのでしょうか?
> 可能であれば、明示的にトランザクションを掛けたり/*INSERT LOCK*/を記述し
> たくなく、いい解決があればと思っています。
> また、成功例1についてはトランザクション内ですがロックを掛けておりません。
> これでもうまくいってしまうのもよくわかりませんでした。
>
> pgpoolの設定ミスかも知れませんが、ご存知の方がいらっしゃいましたら、ご教
> 授ください。
同期が取れない原因は,load_balance_modeが有効になっていて,
select nextval('hoge_seq')
がmasterかsecondaryのどちらか一方にしか発行されないからです.
load balance modeは,明示的なトランザクションブロックになっている(成功
例1)か,select文が正確に"SELECT"(大文字小文字の違いは無視)で始まってい
ない(成功例2)では無効になるので,いまくいくわけです.
ちなみに,insert_lockは,INSERT文でないと効かないので,ここではうまく
働いていません(insert_lockは,sequenceではなく,SERIAL型と一緒に使うこ
とを想定しています).
ところで,「成功例」ということですが,select nextval('hoge_seq')を発行
するセッションが同時に複数あるとうまくいかないと思います.複数同時セッ
ションでもうまくいくようにするためには,たかだか一つのセッションしか同
時にはselect nextval('hoge_seq')を実行できないように制御しなければなり
ません.一番いいのは,テーブルロックを使って,
BEGIN;
LOCK TABLE t1; <-- どんなテーブルでもいい
select nextval('hoge_seq')
:
:
END;
とすることです.
そうではなくて,同時セッションがないのであれば,上記成功例で問題ありま
せん.その場合,SQL文に手を入れずに目的を達成したいのであれば,
load_balance_modeを無効にするしかないでしょう.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
>
> ちなみにpgpoolの設定は下記のようになります。
> (以下はpool_statusで表示された中から関係なさそうなのを省いた物です。)
> port | 5432
> socket_dir | /tmp
> backend_host_name | 192.168.0.201
> backend_port | 5431
> secondary_backend_host_name | 192.168.0.202
> secondary_backend_port | 5431
> connection_life_time | 0
> replication_mode | 1
> replication_strict | 1
> replication_timeout | 5000
> load_balance_mode | 1
> replication_stop_on_mismatch | 0
> print_timestamp | 1
> master_slave_mode | 0
> connection_cache | 1
> insert_lock | 1
> current_backend_host_name | 192.168.0.201
> current_backend_port | 5431
> replication_enabled | 1
> master_slave_enabled | 0
>
> --------------------------------------
> GANBARE! NIPPON!
> Yahoo! JAPAN JOC OFFICIAL INTERNET PORTAL SITE PARTNER
> http://pr.mail.yahoo.co.jp/ganbare-nippon/
>
pgsql-jp メーリングリストの案内