概述
逻辑复制(Logical Replication)是PG复制功能中又添加的一个重要特性。逻辑复制相对物理复制,之前版本的流复制就是用的物理复制,是针对实例级别做的数据复制;而逻辑复制是针对表级别做的数据复制,是一种复制粒度更细,更灵活的复制机制。
特性介绍
下图是逻辑复制的流程图:
逻辑复制也是基于WAL进行的复制,slave端通过逻辑解码对数据进行REDO。
下面介绍上图中的两个对象PUBLICATION和SUBSCRIPTION.
1. PUBLICATION对象
publication对象是逻辑复制过程中,master节点创建的对象,用于对复制表及复制操作的管理。
语法
CREATE PUBLICATION 名称
[ FOR TABLE [ ONLY ] 表名 [ * ] [, ...]
| FOR ALL TABLES ]
[ WITH ( publication_parameter [= 值] [, ... ] ) ]
参数说明:
//FOR TABLE 表示要复制的表,可以通过’,’定义多个表。
//FOR ALL TABLES 表示数据库的所有表都要复制。
//WITH 表的DML操作行为,忽略表示全部DML操作。
//ONLY 如果忽略ONLY,则继承该复制表的所有表也会被复制。
一个PUBLICATION对象可以注册一个或多个表。也可以选择DML操作进行复制。一个表同时也可以被多个PUBLICATION注册。
2. SUBSCRIPTION对象
subscription对象是逻辑复制过程汇总,slave节点创建的对象。用于连接master节点的publication对象。
语法
CREATE SUBSCRIPTION subscription_name
CONNECTION 'conninfo'
PUBLICATION publication_name [, ...]
[ WITH ( subscription_parameter [= 值] [, ... ] ) ]
参数说明:
//CONNECTION 连接master节点的字符串信息
//PUBLICATION master复制PUBLICATION对象
//WITH 表示DML操作,忽略表示全部DML操作
3. 逻辑复制示例
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 行记录)
4. 系统表
对于逻辑复制,系统增加以下系统表用于对逻辑复制相关对象和参数的记录:
pg_publication -- 记录PUBLICATION对象信息
pg_publication_rel -- 记录PUBLICATION对象和表之间的对应关系
pg_publication_tables -- 记录PUBLICATION对象和表名之间的关系
pg_subscription -- 记录SUBSCRIPTION对象信息
v.pg_subscription_rel -- 记录SUBSCRIPTION对象和表之间的对应关系
5. 进程
PG10为逻辑复制新增一bgworker进程,用于完成对逻辑复制的处理。
6. 其他说明
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. 逻辑复制可以在不同编码之间进行数据复制(已经进行内部转换)。