Postgresql
postgresql bdr 0.8.x - 添加另一個下游伺服器只能部分工作
我有以下 postgresql 9.4 bdr 設置:
- 在 10.1.1.1 上執行的帶有名為“bdrdemo”的數據庫的上游伺服器
- 在 10.2.2.2 上執行名為 bdrdemo 的下游伺服器(1)(與 10.1.1.1 複製)
- 在 10.3.3.3 上執行的帶有名為“newname”的數據庫的下游伺服器(2)(與 10.1.1.1 複製)
當我設置下游伺服器 2 時,我故意使用不同的數據庫名稱來測試數據庫名稱是否重要。看起來在 10.1.1.1 上執行的 bdrdemo 的所有數據都正確複製了,但是當我從上游或下游 2 進行新更改時,兩者之間沒有任何複製。
我在上游伺服器的日誌中看到一個錯誤,上面寫著:
3 月 30 日 19:44:38 測試箱 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
當我最初設置下游2時,它確實複製了上游的所有數據,但它只是不參與新數據/新更改的複制。所以我想我可以理解為什麼它在嘗試創建已經存在的對象時會失敗。但是我是否必須刪除訂閱者數據庫中的數據並重新啟動才能使複製工作?
此資訊適用於 BDR 0.8 及更早版本;在 BDR 0.9 中,配置方法已更改。
如果本地數據庫名稱與
_dsn
節點與其上游連接的參數中指定的數據庫名稱不同,則必須使用_local_dbname
連接選項指定它。請參閱我剛剛為此參數添加的 wiki條目,該條目以前不在文件中。
在您的情況下,在下游 2 上,添加:
bdr.bdrupstream_local_dbname = 'newname'