一岭接、pglogical介紹
pglogical 是 PostgreSQL 的拓展模塊, 為 PostgreSQL 數(shù)據(jù)庫提供了邏輯流復(fù)制發(fā)布和訂閱的功能牡辽。 pglogical 重用了 BDR 項目中的一部分相關(guān)技術(shù)顶吮。pglogical 是一個完全作為PostgreSQL 擴展實現(xiàn)的邏輯復(fù)制系統(tǒng)砸泛。完全集成轩猩,它不需要觸發(fā)器或外部程序别垮。這種物理復(fù)制的替代方法是使用發(fā)布/訂閱模型復(fù)制數(shù)據(jù)以進行選擇性復(fù)制的一種高效方法陪踩。支持 PG10咐低、9.6揽思、9.5、9.4 见擦,提供比 Slony钉汗、Bucardo 或 Londiste 更快的復(fù)制速度,以及跨版本升級鲤屡。
我們使用的下列術(shù)語來描述節(jié)點和數(shù)據(jù)流之間的關(guān)系损痰,重用了一些早期的 Slony 技術(shù)中的術(shù)語:
- 節(jié)點 - PostgreSQL 數(shù)據(jù)庫實例
- 發(fā)布者和訂閱者 - 節(jié)點的角色名稱
- 復(fù)制集 - 關(guān)系表的集合
pglogical 是新技術(shù)組件,使用了最新的 PostgreSQL 數(shù)據(jù)庫中的一些核心功能酒来,所以存在一些數(shù)據(jù)庫版本限制:
- 數(shù)據(jù)源發(fā)布和訂閱節(jié)點需要運行 PostgreSQL 9.4 +
- 復(fù)制源過濾和沖突檢測需要 PostgreSQL 9.5 +
支持的使用場景:
- 主版本數(shù)據(jù)庫之間的升級(存在上述的版本限制)
- 完整的數(shù)據(jù)庫復(fù)制
- 利用復(fù)制集卢未,選擇性的篩選的關(guān)系表
- 可從多個上游服務(wù)器,做數(shù)據(jù)的聚集和合并
二堰汉、安裝操作
本節(jié)介紹了pglogical 擴展模塊復(fù)制的基本用法辽社。
下載地址,安裝步驟
tar -zxvf pglogical-REL2_2_0.tar.gz
cd pglogical-REL2_2_0
. /home/postgres/.bash_profile
pg_config
USE_PGXS=1 make clean
USE_PGXS=1 make
USE_PGXS=1 make install
首先 PostgreSQL服務(wù)器必須正確配置才能夠支持邏輯解碼︰
wal_level = 'logical'
# one per database needed on (provider/subscriber)provider node
max_worker_processes = 10
# one per node needed on provider node
max_replication_slots = 10
# one per node needed on provider node
max_wal_senders = 10
shared_preload_libraries = 'pglogical'
如果你想要處理解決與上一次/第一次更新之間的沖突 wins(參閱沖突章節(jié)), 你的數(shù)據(jù)庫版本需要為PostgreSQL 9.5+ (在9.4中無效) 您可以向 PostgreSQL.conf 添加此額外的選項:
# needed for last/first update wins conflict resolution property available in Postgre
track_commit_timestamp = on
pg_hba.conf 需要配置成允許從本地主機復(fù)制翘鸭,用戶擁有有復(fù)制權(quán)限,連接權(quán)限滴铅;并重啟數(shù)據(jù)庫服務(wù)
host replication postgres 網(wǎng)段ip/24 trust
在所有節(jié)點上所對應(yīng)數(shù)據(jù)庫安裝pglogical拓展模塊:
CREATE EXTENSION pglogical;
三、pglogical復(fù)制配置
現(xiàn)有實驗環(huán)境
數(shù)據(jù)庫版本 | IP | 角色 |
---|---|---|
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | provider |
psql (PostgreSQL) 10.5 | 192.168.1.235 | subscriber |
3.1就乓、時間同步
服務(wù)器時間同步(主備庫都需操作)
echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null" >> /var/spool/cron/root
3.2汉匙、提供者節(jié)點配置
1、創(chuàng)建節(jié)點
在一個數(shù)據(jù)庫里創(chuàng)建提供者節(jié)點
# 創(chuàng)建節(jié)點
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é)點配置
1、創(chuàng)建節(jié)點
在另一個數(shù)據(jù)庫創(chuàng)建訂閱者節(jié)點
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=192.168.1.235 port=5432 dbname=lottu'
);
2邦投、創(chuàng)建訂閱
訂閱提供者節(jié)點伤锚,該訂閱將在后臺啟動同步和復(fù)制過程
SELECT pglogical.create_subscription(
subscription_name := 'subscription1',
provider_dsn := 'host=192.168.1.221 port=5432 dbname=lottu'
);
3.4、驗證復(fù)制
前面我們已經(jīng)完成安裝/配置 pglogical 操作志衣。
1见芹、創(chuàng)建測試表
create table tbl_lottu01(id int primary key, name text, reg_time timestamp);
由于需要驗證insert/update/delete/truncate操作是否同步;所以創(chuàng)建的表要有主鍵蠢涝。當(dāng)然只對發(fā)布者必須要主鍵約束玄呛。
2、添加測試數(shù)據(jù)
lottu=# insert into tbl_lottu01 select generate_series(1,10000),'lottu',now();
INSERT 0 10000
3和二、將表添加對應(yīng)的復(fù)制集
對新建的表徘铝;并沒有為其分配對應(yīng)的復(fù)制集;需要手動添加。當(dāng)然可以利用觸發(fā)器自動添加惕它;后續(xù)補充怕午。
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']);
- 方法二:
將表添加到對應(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ù)據(jù)也同步到 subscriber 節(jié)點缤沦。因為在第二種方法有 同步 的操作虎韵。若使用第一種方法;還需要在subscriber 節(jié)點同步表的操作缸废。
#重新同步一個表
pglogical.alter_subscription_resynchronize_table(subscription_name name, relation regclass)
#將所有的表都同步
pglogical.alter_subscription_synchronize(subscription_name name, truncate bool)
4包蓝、查看subscriber 節(jié)點
查看表 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ù)制。不作演示
復(fù)制集 | INSERT | UPDATE | DELETE | TRUNCATE |
---|---|---|---|---|
default | √ | √ | √ | √ |
default_insert_only | √ | × | × | × |
四企量、復(fù)制特性擴展
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é)點的更改孝凌,或“{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、對源端進行 行/列 過濾
過濾機制需要 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è)置為NULL,這是默認(rèn)值
- row_filter - 行過濾表達(dá)式卷拘,默認(rèn)為NULL(無過濾)喊废,有關(guān)詳細(xì)信息,請參閱(行過濾)栗弟。警告:在使用有效行篩選器同步數(shù)據(jù)時要小心污筷。使用synchronize_data=true有效row_filter就像對表的一次性操作。使用修改后再次執(zhí)行它將row_filter不會將數(shù)據(jù)同步到訂戶乍赫。訂閱者可能需要pglogical.alter_subscription_resynchronize_table()來修復(fù)它瓣蛀。
**示例:對表tbl_lottu02中字段{id, name, job} 字段列過濾;且對條件 ‘id > 10’ 進行行過濾 **
# provider 節(jié)點 創(chuàng)建表并插入測試數(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é)點創(chuàng)建表耿焊; 可以只創(chuàng)建復(fù)制的列的數(shù)據(jù)表
create table tbl_lottu02 (id int primary key, name text, job text, reg_time timestamp );
# or
create table tbl_lottu02 (id int primary key, name text, job text);
#provider 節(jié)點 將表加入復(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é)點查看表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、為新表自動分配復(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器腋、沖突檢測
沖突檢測需要 PostgreSQL 9.5 +
如果節(jié)點訂閱多個提供程序,或當(dāng)本地寫入在訂閱服務(wù)器上發(fā)生钩杰,可能會發(fā)生沖突纫塌,尤其是對傳入的變化。這些都自動檢測讲弄,并可以就此采取行動取決于配置措左。
解決沖突的辦法是通過配置 pglogical.conflict_resolution 參數(shù)。
pglogical.conflict_resolution 支持的配置參數(shù)選項為︰
- error - 復(fù)制將停止上錯誤如果檢測到?jīng)_突和手動操作需要解決
- apply_remote - 總是應(yīng)用與本地數(shù)據(jù)有沖突的更改避除,這是默認(rèn)值
- keep_local - 保留數(shù)據(jù)的本地版本怎披,并忽略來自遠(yuǎn)程節(jié)點相互沖突的更改
- last_update_wins - 時間戳為提交最新的版本(newest commit timestamp)的數(shù)據(jù)將會被保存(這可以是本地或遠(yuǎn)程版本)
- first_update_wins - 時間戳為最舊的版本(oldest timestamp)的數(shù)據(jù)將會被保存(這可以是本地或遠(yuǎn)程版本)
當(dāng)參數(shù)track_commit_timestamp被禁用時,唯一允許的配置值是 apply_remote瓶摆。 PostgreSQL 9.4 不支持 track_commit_timestamp 配置參數(shù)只能配置參數(shù)apply_remote(該參數(shù)是默認(rèn)值)凉逛。
# 在 訂閱者 節(jié)點配置;我們保留最新的數(shù)據(jù)
track_commit_timestamp = on
pglogical.conflict_resolution = 'last_update_wins'
# 在 訂閱者 節(jié)點創(chuàng)建測試表tbl_lottu03
lottu=# create table tbl_lottu03(id int primary key, name text);
CREATE TABLE
lottu=# insert into tbl_lottu03 values (1001,'subscriber');
INSERT 0 1
# 在 發(fā)布者 節(jié)點 創(chuàng)建測試表
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é)點 查看數(shù)據(jù)
lottu=# select * from tbl_lottu03;
id | name
------+----------
1001 | provider
后記: 在訂閱者的表需要主鍵約束;不然檢測不到?jīng)_突群井;是否需要主鍵約束當(dāng)然這個也是根據(jù)需求而定状飞。
五、場景介紹
5.1书斜、可從多個上游服務(wù)器,做數(shù)據(jù)的聚集和合并
發(fā)布者跟訂閱者的關(guān)系诬辈;一個發(fā)布者可以被多個訂閱者訂閱。多個發(fā)布者可以被同一個訂閱者訂閱荐吉。
數(shù)據(jù)庫版本 | IP | 數(shù)據(jù)庫 | 角色 |
---|---|---|---|
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)建測試表
# 每個節(jié)點創(chuàng)建測試表; 訂閱者創(chuàng)建的表可以無主鍵酬荞;若訂閱者有主鍵搓劫,可利用序列自增來解決沖突。(例如:本例是兩個發(fā)布者混巧,則發(fā)布者1可取奇數(shù);發(fā)布者二可取偶數(shù))枪向。若無主鍵;數(shù)據(jù)不受影響。
provider1=create table tbl_lottu05(id int primary key,name text);
CREATE TABLE
provider1=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 1;
CREATE SEQUENCE
provider2=create table tbl_lottu05(id int primary key,name text);
CREATE TABLE
provider2=CREATE SEQUENCE seq_lottu05_id INCREMENT BY 2 START WITH 2;
CREATE SEQUENCE
subscriber=create table tbl_lottu05(id int primary key,name text);
CREATE TABLE
5.1.2咧党、搭建模擬場景
更多介紹查看第三節(jié)秘蛔;或者查考《PostgreSQL 邏輯復(fù)制文檔 (pglogical 文檔 )》
# provider 節(jié)點1
provider1=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é)點2
provider2=SELECT pglogical.create_node(node_name := 'provider2', dsn := 'host=192.168.1.221 port=5432 dbname=lottu02');
create_node
-------------
1828187473
provider2=select pglogical.replication_set_add_table( set_name := 'default', relation := 'tbl_lottu05',synchronize_data := true);
replication_set_add_table
---------------------------
t
# subscriber 節(jié)點
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
---------------------
1871150101
5.1.3、插入數(shù)據(jù)驗證
provider1=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2);
INSERT 0 5
provider2=insert into tbl_lottu05 select nextval('seq_lottu05_id'),'lottu' || generate_series(1,10,2);
INSERT 0 5
subscriber=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ù)庫版本升級
pglogical 對 PostgreSQL 版本升級是一個很實用的工具深员。能實現(xiàn)以幾乎為零的停機時間遷移和升級PostgreSQL。局限性在于pglogical支持的 PostgreSQL 版本。
本例簡單模擬下pglogical 對 PostgreSQL 版本升級;忽略插件乾闰、存儲空間、表空間叠赐、以及業(yè)務(wù)SQL和自定義函數(shù)創(chuàng)建。
數(shù)據(jù)庫版本 | IP | 數(shù)據(jù)庫 | 角色 |
---|---|---|---|
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu | provider |
psql (PostgreSQL) 10.5 | 192.168.1.235 | lottu | subscriber |
5.2.1屡江、新建升級數(shù)據(jù)庫
以一個全新的數(shù)據(jù)庫進行操作
PG10-235=drop database if exists lottu;
NOTICE: database "lottu" does not exist, skipping
DROP DATABASE
PG10-235=create database lottu owner lottu;
CREATE DATABASE
5.2.2芭概、pglogical 插件安裝
本環(huán)境已經(jīng)安裝pglogical;只要到對應(yīng)數(shù)據(jù)庫創(chuàng)建pglogical插件即可
PG10-235=CREATE EXTENSION pglogical;
CREATE EXTENSION
PG10-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é)點
這個要根據(jù)真實環(huán)境來設(shè)置罢洲;考慮到真實環(huán)境數(shù)據(jù)庫中表不一定都有主鍵約束,可將表放到復(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ù)可實現(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é)點
PG10-235=SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=192.168.1.235 port=5432 dbname=lottu');
create_node
-------------
2941155235
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)化偏友。因為新的版本往往有新特性。
5.2.6对供、全量復(fù)制
pglogical有將所有未同步表都在單個操作中同步
語法:
pglogical.alter_subscription_synchronize(subscription_name name, truncate bool)
參數(shù):
- subscription_name - 現(xiàn)有訂閱的名稱
- truncate - 如果為true位他,表將在復(fù)制前被截斷氛濒,默認(rèn)為false
PG10-235=SELECT pglogical.alter_subscription_synchronize(subscription_name := 'subscription', truncate := false);
alter_subscription_synchronize
--------------------------------
t
(1 row)
5.2.7、比對數(shù)據(jù)一致
經(jīng)過上一步鹅髓,兩個數(shù)據(jù)庫數(shù)據(jù)達(dá)到一致舞竿。
- 查看表同步狀態(tài)
PG10-235=select * from pglogical.show_subscription_table(subscription_name := 'subscription', relation := 'tbl_lottu01'::regclass);
nspname | relname | status
---------+-------------+--------------
public | tbl_lottu01 | synchronized
(1 row)
- 比對兩個數(shù)據(jù)庫表的數(shù)據(jù)
PG96-221=select count(1) from tbl_lottu01;
count
-------
10000
(1 row)
PG10-235=select count(1) from tbl_lottu01;
count
-------
10000
(1 row)
5.2.8、業(yè)務(wù)切換
比對數(shù)據(jù)一致窿冯;可以將業(yè)務(wù)切換到升級后的數(shù)據(jù)庫骗奖。
5.2.9、刪除pglogical配置
這步是可選的醒串;保證升級后的數(shù)據(jù)庫正常支持業(yè)務(wù)执桌。不存在數(shù)據(jù)丟失的情況下∥叨模可以刪除pglogical配置仰挣。
刪除步驟:
- 刪除訂閱信息
- 刪除兩個數(shù)據(jù)庫pglogical節(jié)點
PG10-235=select pglogical.drop_subscription(subscription_name := 'subscription',ifexists := true);
drop_subscription
-------------------
1
(1 row)
PG10-235=select pglogical.drop_node(node_name := 'subscriber', ifexists := true);
drop_node
-----------
t
(1 row)
PG96-221=select pglogical.drop_node(node_name := 'provider', ifexists := true);
drop_node
-----------
t
(1 row)