postgresql update使用别名_PostgreSQL逻辑复制之pglogical
宜搜科技資深DBA,擅長(zhǎng)Oracle、PostgreSQL,目前從事Oracle、PostgreSQL
相關(guān)的運(yùn)維管理及遷移等工作。
一、pglogical介紹
pglogical 是 PostgreSQL 的拓展模塊, 為 PostgreSQL 數(shù)據(jù)庫(kù)提供了邏輯流復(fù)制發(fā)布和訂閱的功能。pglogical 重用了 BDR 項(xiàng)目中的一部分相關(guān)技術(shù)。pglogical 是一個(gè)完全作為PostgreSQL 擴(kuò)展實(shí)現(xiàn)的邏輯復(fù)制系統(tǒng)。完全集成,它不需要觸發(fā)器或外部程序。這種物理復(fù)制的替代方法是使用發(fā)布/訂閱模型復(fù)制數(shù)據(jù)以進(jìn)行選擇性復(fù)制的一種高效方法。支持 PG10、9.6、9.5、9.4 ,提供比 Slony、Bucardo 或 Londiste 更快的復(fù)制速度,以及跨版本升級(jí)。
我們使用的下列術(shù)語來描述節(jié)點(diǎn)和數(shù)據(jù)流之間的關(guān)系,重用了一些早期的 Slony 技術(shù)中的術(shù)語:
節(jié)點(diǎn) - PostgreSQL 數(shù)據(jù)庫(kù)實(shí)例
發(fā)布者和訂閱者 - 節(jié)點(diǎn)的角色名稱
復(fù)制集 - 關(guān)系表的集合
pglogical 是新技術(shù)組件,使用了最新的 PostgreSQL 數(shù)據(jù)庫(kù)中的一些核心功能,所以存在一些數(shù)據(jù)庫(kù)版本限制:
數(shù)據(jù)源發(fā)布和訂閱節(jié)點(diǎn)需要運(yùn)行 PostgreSQL 9.4 +
復(fù)制源過濾和沖突檢測(cè)需要 PostgreSQL 9.5 +
支持的使用場(chǎng)景:
主版本數(shù)據(jù)庫(kù)之間的升級(jí)(存在上述的版本限制)
完整的數(shù)據(jù)庫(kù)復(fù)制
利用復(fù)制集,選擇性的篩選的關(guān)系表
可從多個(gè)上游服務(wù)器,做數(shù)據(jù)的聚集和合并
更多介紹;大家請(qǐng)閱讀
英文版
中文版
二、安裝操作
本節(jié)介紹了pglogical 擴(kuò)展模塊復(fù)制的基本用法。
下載地址,安裝步驟
首先 PostgreSQL服務(wù)器必須正確配置才能夠支持邏輯解碼︰
wal_level = 'logical'# one per database needed on (provider/subscriber)provider nodemax_worker_processes = 10 # one per node needed on provider nodemax_replication_slots = 10 # one per node needed on provider nodemax_wal_senders = 10 shared_preload_libraries = 'pglogical'如果你想要處理解決與上一次/第一次更新之間的沖突 wins(參閱沖突章節(jié)), 你的數(shù)據(jù)庫(kù)版本需要為PostgreSQL 9.5+ (在9.4中無效) 您可以向 PostgreSQL.conf 添加此額外的選項(xiàng):
# needed for last/first update wins conflict resolution property available in Postgretrack_commit_timestamp = onpg_hba.conf 需要配置成允許從本地主機(jī)復(fù)制,用戶擁有有復(fù)制權(quán)限,連接權(quán)限;并重啟數(shù)據(jù)庫(kù)服務(wù)
host replication postgres 網(wǎng)段ip/24 trust在所有節(jié)點(diǎn)上所對(duì)應(yīng)數(shù)據(jù)庫(kù)安裝pglogical拓展模塊:
CREATE EXTENSION pglogical;三、pglogical復(fù)制配置
現(xiàn)有實(shí)驗(yàn)環(huán)境
| psql (PostgreSQL) 9.6.0 | 192.168.1.221 | provider |
| psql (PostgreSQL) 10.5 | 192.168.1.235 | subscriber |
3.1、時(shí)間同步
服務(wù)器時(shí)間同步(主備庫(kù)都需操作)
echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null" >> /var/spool/cron/root3.2、提供者節(jié)點(diǎn)配置
1、創(chuàng)建節(jié)點(diǎn)
在一個(gè)數(shù)據(jù)庫(kù)里創(chuàng)建提供者節(jié)點(diǎn)
# 創(chuàng)建節(jié)點(diǎn)SELECT pglogical.create_node( node_name := 'provider1', dsn := 'host=192.168.1.221 port=5432 dbname=lottu');2、創(chuàng)建復(fù)制集
將public架構(gòu)中的所有表添加到default復(fù)制集中
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);復(fù)制集default的表都必需要primary key
3.3、訂閱者節(jié)點(diǎn)配置
1、創(chuàng)建節(jié)點(diǎn)
在另一個(gè)數(shù)據(jù)庫(kù)創(chuàng)建訂閱者節(jié)點(diǎn)
SELECT pglogical.create_node(node_name := 'subscriber1',dsn := 'host=192.168.1.235 port=5432 dbname=lottu');2、創(chuàng)建復(fù)制集
訂閱提供者節(jié)點(diǎn),該訂閱將在后臺(tái)啟動(dòng)同步和復(fù)制過程
SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu');3.4、驗(yàn)證復(fù)制
前面我們已經(jīng)完成安裝/配置 pglogical 操作。
1、創(chuàng)建測(cè)試表
create table tbl_lottu01(id int primary key, name text, reg_time timestamp);由于需要驗(yàn)證insert/update/delete/truncate操作是否同步;所以創(chuàng)建的表要有主鍵。當(dāng)然只對(duì)發(fā)布者必須要主鍵約束。
2、添加測(cè)試數(shù)據(jù)
lottu=# insert into tbl_lottu01 select generate_series(1,10000),'lottu',now();INSERT 0 100003、將表添加對(duì)應(yīng)的復(fù)制集
對(duì)新建的表;并沒有為其分配對(duì)應(yīng)的復(fù)制集;需要手動(dòng)添加。當(dāng)然可以利用觸發(fā)器自動(dòng)添加;后續(xù)補(bǔ)充。
lottu=# select * from pglogical.replication_set_table ; set_id | set_reloid | set_att_list | set_row_filter --------+------------+--------------+----------------(0 rows)方法1:
前面講解創(chuàng)建復(fù)制集中;3.2.2中“將public架構(gòu)中的所有表添加到default復(fù)制集中”
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);方法二:
將表添加到對(duì)應(yīng)的復(fù)制集中;詳細(xì)介紹可以查看前面文檔。
pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text [],row_filter text)兩種方法都可以;我們采用第二種方法。
lottu=# select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu01',synchronize_data := true); replication_set_add_table --------------------------- t(1 row)我們查看復(fù)制集
lottu=# select * from pglogical.replication_set_table ; set_id | set_reloid | set_att_list | set_row_filter -----------+-------------+--------------+---------------- 290045701 | tbl_lottu01 | | (1 row)同時(shí),數(shù)據(jù)也同步到 subscriber 節(jié)點(diǎn)。因?yàn)樵诘诙N方法有 同步 的操作。若使用第一種方法;還需要在subscriber 節(jié)點(diǎn)同步表的操作。
#重新同步一個(gè)表pglogical.alter_subscription_resynchronize_table(subscription_name name, relation regclass) #將所有的表都同步pglogical.alter_subscription_synchronize(subscription_name name, truncate bool)4、查看subscriber節(jié)點(diǎn)
查看表 tbl_lottu01 信息
lottu=# select * from pglogical.show_subscription_table('subscription1','tbl_lottu01'); nspname | relname | status ---------+-------------+-------------- public | tbl_lottu01 | synchronized(1 row)lottu=# select count(1) from tbl_lottu01; count ------- 10000(1 row)在復(fù)制集default中:update/delete/truncate 操作也是同步復(fù)制。不作演示
| default | √ | √ | √ | √ |
| default_insert_only | √ | × | × | × |
四、復(fù)制特性擴(kuò)展
4.1、延遲復(fù)制
pglogical.create_subscription(subscription_name name, provider_dsn text, replication_sets text[], synchronize_structure boolean, synchronize_data boolean, forward_origins text[], apply_delay interval)參數(shù):
subscription_name - 訂閱的名稱,必須是唯一的
provider_dsn - 提供者的連接字符串
replication_sets - 要訂閱的復(fù)制集數(shù)組,這些必須已存在,默認(rèn)為“{default,default_insert_only,ddl_sql}”
synchronize_structure - 指定是否將提供者與訂閱者之間的結(jié)構(gòu)同步,默認(rèn)為false
synchronize_data - 指定是否將數(shù)據(jù)從提供者同步到訂閱者,默認(rèn)為true
forward_origins - 要轉(zhuǎn)發(fā)的原始名稱數(shù)組,當(dāng)前只支持的值是空數(shù)組,意味著不轉(zhuǎn)發(fā)任何不是源自提供者節(jié)點(diǎn)的更改,或“{all}”這意味著復(fù)制所有更改,無論它們的來源是什么,默認(rèn)是全部}”
apply_delay - 延遲復(fù)制多少,默認(rèn)為0秒
示例:數(shù)據(jù)表結(jié)構(gòu)同步;且延遲復(fù)制1分鐘
SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu',synchronize_structure := true,apply_delay := '00:01:00'::interval);4.2、對(duì)源端進(jìn)行 行/列 過濾
過濾機(jī)制需要 PostgreSQL 9.5 +
pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text [],row_filter text)參數(shù):
set_name - 現(xiàn)有復(fù)制集的名稱
relation - 要添加到集合中的表的名稱或OID
synchronize_data - 如果為true,則表數(shù)據(jù)將在訂閱給定復(fù)制集的所有訂戶上同步,默認(rèn)為false
columns - 要復(fù)制的列的列表。通常,當(dāng)應(yīng)復(fù)制所有列時(shí),這將設(shè)置為NULL,這是默認(rèn)值
row_filter - 行過濾表達(dá)式,默認(rèn)為NULL(無過濾),有關(guān)詳細(xì)信息,請(qǐng)參閱(行過濾)。警告:在使用有效行篩選器同步數(shù)據(jù)時(shí)要小心。使用synchronize_data=true有效row_filter就像對(duì)表的一次性操作。使用修改后再次執(zhí)行它將row_filter不會(huì)將數(shù)據(jù)同步到訂戶。訂閱者可能需要pglogical.alter_subscription_resynchronize_table()來修復(fù)它。
**
示例:對(duì)表tbl_lottu02中字段{id, name, job} 字段列過濾;且對(duì)條件 ‘id > 10’ 進(jìn)行行過濾 **# provider 節(jié)點(diǎn) 創(chuàng)建表并插入測(cè)試數(shù)據(jù)create table tbl_lottu02 (id int primary key, name text, job text, reg_time timestamp );insert into tbl_lottu02 select generate_series(1,20) id,'lottu'||generate_series(1,20),'pg', now();# subscriber節(jié)點(diǎn)創(chuàng)建表;可以只創(chuàng)建復(fù)制的列的數(shù)據(jù)表create table tbl_lottu02 (id int primary key, name text, job text, reg_time timestamp );# orcreate table tbl_lottu02 (id int primary key, name text, job text);#provider 節(jié)點(diǎn) 將表加入復(fù)制集中;并同步記錄lottu=# select pglogical.replication_set_add_table(set_name := 'default', relation := 'tbl_lottu02', synchronize_data := true, columns := '{id, name, job}',row_filter := 'id < 10'); replication_set_add_table --------------------------- t(1 row)# subscriber節(jié)點(diǎn)查看表tbl_lottu02記錄lottu=# select * from tbl_lottu02; id | name | job ----+--------+----- 1 | lottu1 | pg 2 | lottu2 | pg 3 | lottu3 | pg 4 | lottu4 | pg 5 | lottu5 | pg 6 | lottu6 | pg 7 | lottu7 | pg 8 | lottu8 | pg 9 | lottu9 | pg(9 rows)4.3、為新表自動(dòng)分配復(fù)制集
事件觸發(fā)器工具可用于描述為新創(chuàng)建的表定義復(fù)制集的規(guī)則。
CREATE OR REPLACE FUNCTION pglogical_assign_repset()RETURNS event_trigger AS $$DECLARE obj record;BEGIN FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP IF obj.object_type = 'table' THEN IF obj.schema_name = 'config' THEN PERFORM pglogical.replication_set_add_table('configuration', obj.objid); ELSIF NOT obj.in_extension THEN PERFORM pglogical.replication_set_add_table('default', obj.objid); END IF; END IF; END LOOP;END;$$ LANGUAGE plpgsql;CREATE EVENT TRIGGER pglogical_assign_repset_trg ON ddl_command_end WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS') EXECUTE PROCEDURE pglogical_assign_repset();4.4、沖突檢測(cè)
沖突檢測(cè)需要 PostgreSQL 9.5 +
如果節(jié)點(diǎn)訂閱多個(gè)提供程序,或當(dāng)本地寫入在訂閱服務(wù)器上發(fā)生,可能會(huì)發(fā)生沖突,尤其是對(duì)傳入的變化。這些都自動(dòng)檢測(cè),并可以就此采取行動(dòng)取決于配置。
解決沖突的辦法是通過配置 pglogical.conflict_resolution 參數(shù)。
pglogical.conflict_resolution 支持的配置參數(shù)選項(xiàng)為︰
error - 復(fù)制將停止上錯(cuò)誤如果檢測(cè)到?jīng)_突和手動(dòng)操作需要解決
apply_remote - 總是應(yīng)用與本地?cái)?shù)據(jù)有沖突的更改,這是默認(rèn)值
keep_local - 保留數(shù)據(jù)的本地版本,并忽略來自遠(yuǎn)程節(jié)點(diǎn)相互沖突的更改
last_update_wins - 時(shí)間戳為提交最新的版本(newest commit timestamp)的數(shù)據(jù)將會(huì)被保存(這可以是本地或遠(yuǎn)程版本)
first_update_wins - 時(shí)間戳為最舊的版本(oldest timestamp)的數(shù)據(jù)將會(huì)被保存(這可以是本地或遠(yuǎn)程版本)
當(dāng)參數(shù)track_commit_timestamp被禁用時(shí),唯一允許的配置值是 apply_remote。PostgreSQL 9.4 不支持 track_commit_timestamp 配置參數(shù)只能配置參數(shù)apply_remote(該參數(shù)是默認(rèn)值)。
# 在 訂閱者 節(jié)點(diǎn)配置;我們保留最新的數(shù)據(jù)track_commit_timestamp = onpglogical.conflict_resolution = 'last_update_wins'# 在 訂閱者 節(jié)點(diǎn)創(chuàng)建測(cè)試表tbl_lottu03lottu=# create table tbl_lottu03(id int primary key, name text);CREATE TABLElottu=# insert into tbl_lottu03 values (1001,'subscriber');INSERT 0 1# 在 發(fā)布者 節(jié)點(diǎn) 創(chuàng)建測(cè)試表create table tbl_lottu03(id int primary key, name text);select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu03',synchronize_data := true);insert into tbl_lottu03 values (1001,'provider');# 在 訂閱者 節(jié)點(diǎn) 查看數(shù)據(jù)lottu=# select * from tbl_lottu03; id | name ------+---------- 1001 | provider后記:?在訂閱者的表需要主鍵約束;不然檢測(cè)不到?jīng)_突;是否需要主鍵約束當(dāng)然這個(gè)也是根據(jù)需求而定。
五、場(chǎng)景介紹
5.1、可從多個(gè)上游服務(wù)器,做數(shù)據(jù)的聚集和合并
發(fā)布者跟訂閱者的關(guān)系;一個(gè)發(fā)布者可以被多個(gè)訂閱者訂閱。多個(gè)發(fā)布者可以被同一個(gè)訂閱者訂閱。
| psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu | provider1 |
| psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu02 | provider2 |
| psql (PostgreSQL) 10.5 | 192.168.1.235 | lottu | subscriber |
為了加以區(qū)分;我們定制SQL提示符;例如
lottu=# \set PROMPT1 '%`echo provider1=`'provider1=5.1.1、創(chuàng)建測(cè)試表
# 每個(gè)節(jié)點(diǎn)創(chuàng)建測(cè)試表; 訂閱者創(chuàng)建的表可以無主鍵;若訂閱者有主鍵,可利用序列自增來解決沖突。(例如:本例是兩個(gè)發(fā)布者,則發(fā)布者1可取奇數(shù);發(fā)布者二可取偶數(shù))。若無主鍵;數(shù)據(jù)不受影響。provider1=create table tbl_lottu05(id int primary key,name text);CREATE TABLEprovider1=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 1;CREATE SEQUENCEprovider2=create table tbl_lottu05(id int primary key,name text);CREATE TABLEprovider2=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 2;CREATE SEQUENCEsubscriber=create table tbl_lottu05(id int primary key,name text);CREATE TABLE5.1.2、搭建模擬場(chǎng)景
更多介紹查看第三節(jié);或者查考《PostgreSQL 邏輯復(fù)制文檔 (pglogical 文檔 )》
# provider 節(jié)點(diǎn)1provider1=SELECT pglogical.create_node(node_name := 'provider1', dsn := 'host=192.168.1.221 port=5432 dbname=lottu'); create_node ------------- 2976894835 provider1=select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu05',synchronize_data := true); replication_set_add_table --------------------------- t# provider 節(jié)點(diǎn)2provider2=SELECT pglogical.create_node(node_name := 'provider2', dsn := 'host=192.168.1.221 port=5432 dbname=lottu02'); create_node ------------- 1828187473provider2=select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu05',synchronize_data := true); replication_set_add_table --------------------------- t# subscriber 節(jié)點(diǎn)subscriber=SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=192.168.1.235 port=5432 dbname=lottu'); create_node ------------- 2941155235 subscriber=SELECT pglogical.create_subscription(subscription_name := 'subscription1', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu'); create_subscription --------------------- 1763399739 subscriber=SELECT pglogical.create_subscription(subscription_name := 'subscription2', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu02'); create_subscription --------------------- 18711501015.1.3、插入數(shù)據(jù)驗(yàn)證
provider1=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2);INSERT 0 5provider2=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2);INSERT 0 5subscriber=select * from tbl_lottu05; id | name ----+-------- 1 | lottu1 3 | lottu3 5 | lottu5 7 | lottu7 9 | lottu9 2 | lottu1 4 | lottu3 6 | lottu5 8 | lottu7 10 | lottu9(10 rows)5.2、數(shù)據(jù)庫(kù)版本升級(jí)
pglogical 對(duì) PostgreSQL 版本升級(jí)是一個(gè)很實(shí)用的工具。能實(shí)現(xiàn)以幾乎為零的停機(jī)時(shí)間遷移和升級(jí)PostgreSQL。局限性在于pglogical支持的 PostgreSQL 版本。
本例簡(jiǎn)單模擬下pglogical 對(duì) PostgreSQL 版本升級(jí);忽略插件、存儲(chǔ)空間、表空間、以及業(yè)務(wù)SQL和自定義函數(shù)創(chuàng)建。
| psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu | provider |
| psql (PostgreSQL) 10.5 | 192.168.1.235 | lottu | subscriber |
5.2.1、新建升級(jí)數(shù)據(jù)庫(kù)
以一個(gè)全新的數(shù)據(jù)庫(kù)進(jìn)行操作
PG10-235=drop database if exists lottu;NOTICE: database "lottu" does not exist, skippingDROP DATABASEPG10-235=create database lottu owner lottu;CREATE DATABASE5.2.2、pglogical插件安裝
本環(huán)境已經(jīng)安裝pglogical;只要到對(duì)應(yīng)數(shù)據(jù)庫(kù)創(chuàng)建pglogical插件即可
PG10-235=CREATE EXTENSION pglogical;CREATE EXTENSIONPG10-235=\dx List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------- pglogical | 2.2.0 | pglogical | PostgreSQL Logical Replication plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language(2 rows)5.2.3、配置pglogical
發(fā)布者節(jié)點(diǎn)
這個(gè)要根據(jù)真實(shí)環(huán)境來設(shè)置;考慮到真實(shí)環(huán)境數(shù)據(jù)庫(kù)中表不一定都有主鍵約束,可將表放到復(fù)制集 "default_insert_only"。
PG96-221=SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=192.168.1.221 port=5432 dbname=lottu'); create_node ------------- 3171898924(1 row)PG96-221=SELECT pglogical.replication_set_add_all_tables('default_insert_only', ARRAY['public']); replication_set_add_all_tables -------------------------------- t(1 row)該函數(shù)可實(shí)現(xiàn)主鍵和非主鍵分別放到'default'和'default_insert_only'復(fù)制集
CREATE OR REPLACE FUNCTION "public"."pglogical_relhaspkey_repset"() RETURNS "pg_catalog"."void" AS $BODY$ DECLARE obj record;BEGIN FOR obj IN (SELECT n.nspname, c.relname, c.relhaspkey FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1, 2) LOOP IF obj.relhaspkey THEN PERFORM pglogical.replication_set_add_table(set_name := 'default', relation := obj.relname :: regclass); ELSE PERFORM pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := obj.relname :: regclass); END IF; END LOOP;END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100訂閱者節(jié)點(diǎn)
5.2.4、遷移DDL
pglogical 可以同步表/序列結(jié)構(gòu);在創(chuàng)建訂閱者 'pglogical.create_subscription' ; 里面參數(shù)synchronize_structure - 指定是否將提供者與訂閱者之間的結(jié)構(gòu)同步,默認(rèn)為false。可以同步表/序列/索引。
PG10-235=SELECT pglogical.create_subscription(subscription_name := 'subscription', provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu', synchronize_structure := true, synchronize_data := false); create_subscription --------------------- 2875150205(1 row)5.2.5、業(yè)務(wù)代碼改寫優(yōu)化
上一步我們沒同步數(shù)據(jù)。所以參數(shù)synchronize_data我們選擇false。雖然把表/序列/索引結(jié)構(gòu)同步過來;但是業(yè)務(wù)代碼(函數(shù)/插件)沒同步過來;還要考慮這些業(yè)務(wù)代碼是否需要改寫優(yōu)化。因?yàn)樾碌陌姹就行绿匦浴?/p>
5.2.6、全量復(fù)制
pglogical有將所有未同步表都在單個(gè)操作中同步
語法:
參數(shù):
subscription_name - 現(xiàn)有訂閱的名稱
truncate - 如果為true,表將在復(fù)制前被截?cái)?#xff0c;默認(rèn)為false
5.2.7、對(duì)比數(shù)據(jù)一致
經(jīng)過上一步,兩個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)達(dá)到一致。
查看表同步狀態(tài)
比對(duì)兩個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù)
5.2.8、業(yè)務(wù)切換
比對(duì)數(shù)據(jù)一致;可以將業(yè)務(wù)切換到升級(jí)后的數(shù)據(jù)庫(kù)。
5.2.9、刪除pglogical配置
這步是可選的;保證升級(jí)后的數(shù)據(jù)庫(kù)正常支持業(yè)務(wù)。不存在數(shù)據(jù)丟失的情況下。可以刪除pglogical配置。
刪除步驟:
刪除訂閱信息
刪除兩個(gè)數(shù)據(jù)庫(kù)pglogical節(jié)點(diǎn)
分類:?PostgreSQL,?postgresql高可用
歡迎投稿
????????中國(guó)開源軟件推進(jìn)聯(lián)盟PostgreSQL分會(huì),歡迎大家積極投稿,向PGer分享自己的實(shí)踐經(jīng)驗(yàn)、心得體會(huì),共建PG中國(guó)生態(tài)。
投稿郵箱:
partner@postgresqlchina.com
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的postgresql update使用别名_PostgreSQL逻辑复制之pglogical的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql能查到数据 dataset对象里面
- 下一篇: linux cmake编译源码,linu