逻辑复制(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. 逻辑复制能够在不一样编码之间进行数据复制(已经进行内部转换)。