web-dev-qa-db-ja.com

Pgpool-II:PITR回復後にシーケンスが1つ進んだ

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内の有効なすべてのノードに対して実行する必要があります。

3
irr

質問ごとの回答:


スクリプト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内の有効なすべてのノードに対して実行する必要があります。

2
Richard