Pgpool-II3.0.1とpgpool3.0.4、PostgreSQL 8.4をテストしましたが、どちらの場合も同じ結果が得られます。プライマリノードとターゲットノードでのオンラインリカバリ後、すべての「シリアル」値が「+1」になりました。 pgpoolで有効になっている他のノードには、古いシリアル値があります。これが私のコマンドです:
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c 'create schema sch'
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c 'create table sch.mytable (id serial, name text);'
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c '\d sch.mytable'
Table "sch.mytable"
Column | Type | Modifiers
--------+---------+----------------------------------------------------------
id | integer | not null default nextval('sch.mytable_id_seq'::regclass)
name | text |
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c "insert into sch.mytable (name) values ('usera')"
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c 'select * from sch.mytable'
id | name
----+-------
1 | usera
postgres@server01:~> psql -h primary_node -p 5432 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 2
# Online recovery via PITR (http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-en.html#online-recovery)
# Recover the first standby node: standby_1
postgres@server01:~> /opt/pgpool-II-3.0.4/pcp_recovery_node -d 1600 localhost 9999 user pass 1 &
# DONE recovery
postgres@server01:~> psql -h primary_node -p 5433 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 4
postgres@server01:~> psql -h standby_1 -p 5433 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 4
# Recover the second node: standby_2
postgres@server01:~> /opt/pgpool-II-3.0.4/pcp_recovery_node -d 1600 localhost 9999 user pass 2 &
# DONE recovery
postgres@server01:~> psql -h primary_node -p 5433 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 6
postgres@server01:~> psql -h standby_1 -p 5433 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 5
postgres@server01:~> psql -h standby_2 -p 5433 -d serial_test -c "select nextval('sch.mytable_id_seq')"
nextval = 6
私は何が間違っているのですか?
私は成功せずにこのオプションを設定しようとしました:
black_function_list = 'lastval,currval,nextval,setval'
insert_lock = true
とった!スクリプトpgpool_recvery_pitr:
psql -t -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND
datallowconn' template1|
while read i
do
if [ "$i" != "" ];then
psql -c "SELECT setval(oid, nextval(oid)) FROM pg_class WHERE relkind =
'S'" $i
fi
done
回復後、データベース内のすべてのシーケンスが1つ進みます。
それに関する公式ドキュメント に情報はありません:
彼らはpgpoolの他の有効なノードを忘れていました。このステートメントは、すべてのノードのすべてのシーケンスポイントを等しく保つために、pgpool内の有効なすべてのノードに対して実行する必要があります。
質問ごとの回答:
スクリプトpgpool_recvery_pitr:
psql -t -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND
datallowconn' template1|
while read i
do
if [ "$i" != "" ];then
psql -c "SELECT setval(oid, nextval(oid)) FROM pg_class WHERE relkind =
'S'" $i
fi
done
回復後、データベース内のすべてのシーケンスが1に進みます。
それに関する公式ドキュメントには情報がありません: http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-en.html#online-recovery 。
彼らはpgpoolの他の有効なノードを忘れていました。このステートメントは、すべてのノードのすべてのシーケンスポイントを等しく保つために、pgpool内の有効なすべてのノードに対して実行する必要があります。