我有以下 postgresql 9.4 bdr 设置:
- 带有名为“bdrdemo”的数据库的上游服务器在 10.1.1.1 上运行
- 下游服务器 (1),数据库名为 bdrdemo,在 10.2.2.2 上运行(用 10.1.1.1 复制)
- 下游服务器 (2),数据库名为“newname”,在 10.3.3.3 上运行(与 10.1.1.1 一起复制)
当我设置下游服务器 2 时,我故意使用不同的数据库名称来测试数据库名称是否重要。看起来在 10.1.1.1 上运行的 bdrdemo 的所有数据都被正确复制了,但是当我从上游或下游 2 进行新更改时,两者之间没有任何复制。
我在上游服务器的日志中看到一条错误消息:
3 月 30 日 19:44:38 testbox postgres[2745]: [339-1] d= p=2745 a=FATAL: 3D000: 数据库“newname”不存在
到目前为止我检查过的内容:
我检查了 bdr.bdr_nodes 表,它现在显示 3 个条目,而不是我创建新的下游服务器之前的两个条目。
select * from bdr.bdr_nodes
node_sysid | node_timeline | node_dboid | node_status ---------------------+---------------+------------+------------- 6127254639323810674 | 1 | 16385 | r 6127254604756301413 | 1 | 16384 | r 6132048976759969713 | 1 | 16385 | r (3 rows) bdrdemo=#
上游服务器上的 postgresql.conf 文件具有以下设置:
#------------------------------------------- # BDR connection configuration for upstream #------------------------------------------- bdr.connections = 'bdrdownstream,bdrdownstream2' bdr.bdrdownstream_dsn = 'dbname=bdrdemo host=10.2.2.2 user=postgres port=5432' bdr.bdrdownstream2_dsn='dbname=newname host=10.3.3.3 user=postgres port=5432'
编辑 1
下游服务器 1 的配置(此服务器/节点正在工作)
# BDR connection configuration for upstream node.
#-------------------------------------------
bdr.connections = 'bdrupstream'
bdr.bdrupstream_dsn = 'dbname=bdrdemo host=10.1.1.1 user=postgres port=5432'
bdr.bdrupstream_init_replica = on
bdr.bdrupstream_replica_local_dsn = 'dbname=bdrdemo user=postgres port=5432'
下游服务器 2 的配置(此服务器/节点不工作)
# BDR connection configuration for upstream node.
#-------------------------------------------------
bdr.connections = 'bdrupstream'
bdr.bdrupstream_dsn = 'dbname=bdrdemo host=10.1.1.1 user=postgres port=5432'
bdr.bdrupstream_init_replica = on
bdr.bdrupstream_replica_local_dsn = 'dbname=newname user=postgres port=5432'
编辑 2
将本地数据库名称添加到下游 2 的配置后,我重新启动了下游 2 上的数据库。复制无法正常工作。所以我重新启动了上游服务器。还是不行。然后我检查了下游 2 上的日志,我看到了这个:
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "btree_gist" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "bdr" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore NOTICE: 42710: extension "plpgsql" already exists, skipping
d=newname p=16791 a=pg_restore LOCATION: CreateExtension, extension.c:1208
d=newname p=16791 a=pg_restore ERROR: 42P07: relation "newtable" already exists
d=newname p=16791 a=pg_restore LOCATION: heap_create_with_catalog, heap.c:1056
d=newname p=16791 a=pg_restore STATEMENT: CREATE TABLE newtable (
id integer NOT NULL,
fname character varying(60),
lname character varying(60)
);
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 191; 1259 17130 TABLE newtable postgres
pg_restore: [archiver (db)] could not execute query: ERROR: relation "newtable" already exists
Command was: CREATE TABLE newtable (
id integer NOT NULL,
fname character varying(60),
lname character varying(60)
);
pg_restore to dbname=newname user=postgres port=5432 fallback_application_name='bdr (6132048976759969713,1,16384,): bdrupstream: init_replica restore' options='-c bdr.do_not_replicate=on -c bdr.permit_unsafe_ddl_commands=on -c bdr.skip_ddl_replication=on -c bdr.skip_ddl_locking=on' failed, aborting
d= p=16780 a=FATAL: XX000: bdr: /usr/bin/bdr_initial_load exited with exit code 2
当我最初设置 downstream2 时,它确实从上游复制了所有数据,但它只是没有参与新数据/新更改的复制。所以我想我可以理解为什么它在尝试创建已经存在的对象时失败了。但是我是否必须删除订阅者数据库中的数据并重新启动才能使复制工作?
此信息适用于 BDR 0.8 及更早版本;在 BDR 0.9 中,配置方法发生了变化。
如果本地数据库名称与
_dsn
节点与其上游连接的参数中指定的数据库名称不同,则必须使用_local_dbname
连接选项指定它。请参阅我刚刚为此参数添加的 wiki条目,该条目以前不在文档中。
在您的情况下,在下游 2 上添加: