邏輯複製(Logical Replication)是PG複製功能中又添加的一個重要特性。邏輯複製相對物理複製,以前版本的流複製就是用的物理複製,是針對實例級別作的數據複製;而邏輯複製是針對表級別作的數據複製,是一種複製粒度更細,更靈活的複製機制。sql
下圖是邏輯複製的流程圖:數據庫
邏輯複製也是基於WAL進行的複製,slave端經過邏輯解碼對數據進行REDO。post
下面介紹上圖中的兩個對象PUBLICATION和SUBSCRIPTION.編碼
publication對象是邏輯複製過程當中,master節點建立的對象,用於對複製表及複製操做的管理。spa
語法 CREATE PUBLICATION 名稱 [ FOR TABLE [ ONLY ] 表名 [ * ] [, ...] | FOR ALL TABLES ] [ WITH ( publication_parameter [= 值] [, ... ] ) ] 參數說明: //FOR TABLE 表示要複製的表,能夠經過’,’定義多個表。 //FOR ALL TABLES 表示數據庫的全部表都要複製。 //WITH 表的DML操做行爲,忽略表示所有DML操做。 //ONLY 若是忽略ONLY,則繼承該複製表的全部表也會被複制。
一個PUBLICATION對象能夠註冊一個或多個表。也能夠選擇DML操做進行復制。一個表同時也能夠被多個PUBLICATION註冊。postgresql
subscription對象是邏輯複製過程彙總,slave節點建立的對象。用於鏈接master節點的publication對象。code
語法 CREATE SUBSCRIPTION subscription_name CONNECTION 'conninfo' PUBLICATION publication_name [, ...] [ WITH ( subscription_parameter [= 值] [, ... ] ) ] 參數說明: //CONNECTION 鏈接master節點的字符串信息 //PUBLICATION master複製PUBLICATION對象 //WITH 表示DML操做,忽略表示所有DML操做
master節點: 1, 配置postgresql.conf文件 listen_addresses = '*' wal_level = logical 2. 配置pg_hba.conf文件 host replication all 0.0.0.0/0 trust 3. 建立複製表對象 postgres=# create schema myschema; CREATE SCHEMA postgres=# CREATE TABLE myschema.test(n int, t text); CREATE TABLE 4. 建立publication對象 postgres=# CREATE PUBLICATION mypub FOR TABLE myschema.test; CREATE PUBLICATION slave節點: 5. 建立同名的模式和表(必須同名,不然複製失敗) postgres=# create schema myschema; CREATE SCHEMA postgres=# CREATE TABLE myschema.test(n int, t text); CREATE TABLE 6. 建立subscription對象 postgres=# CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.100.132 port=5432 user=postgres dbname=postgres' PUBLICATION mypub; NOTICE: created replication slot "mysub" on publisher CREATE SUBSCRIPTION 7. 在master節點插入數據 postgres=# insert into myschema.test values (10); INSERT 0 1 postgres=# insert into myschema.test values (20); INSERT 0 1 8. 在slave節點查詢 postgres=# select * from myschema.test; n | t -----+--- 10 | 20 | (2 行記錄)
對於邏輯複製,系統增長如下系統表用於對邏輯複製相關對象和參數的記錄:對象
pg_publication -- 記錄PUBLICATION對象信息 pg_publication_rel -- 記錄PUBLICATION對象和表之間的對應關係 pg_publication_tables -- 記錄PUBLICATION對象和表名之間的關係 pg_subscription -- 記錄SUBSCRIPTION對象信息 v.pg_subscription_rel -- 記錄SUBSCRIPTION對象和表之間的對應關係
PG10爲邏輯複製新增一bgworker進程,用於完成對邏輯複製的處理。繼承
i. 邏輯複製standby端也能夠進行寫操做,可是不能同步到primary端。(區別流複製)進程
ii. 當publication對象table已經有數據了,建立subscription後,默認會把數據複製到subscription端。
iii. 對publication對象table進行alter table和truncate table時,修改不會複製到subscription端(複製只作DML操做)。
iv. Publication對象的table的index、trigger不會複製到subscription端。
v. 分區表不能做爲publication的對象table,可是分區能夠。
vi. 邏輯複製能夠在不一樣編碼之間進行數據複製(已經進行內部轉換)。