PostgreSQL10 新特性(2): 逻辑复制

概述

    逻辑复制(Logical Replication)是PG复制功能中又添加的一个重要特性。逻辑复制相对物理复制,以前版本的流复制就是用的物理复制,是针对实例级别作的数据复制;而逻辑复制是针对表级别作的数据复制,是一种复制粒度更细,更灵活的复制机制。sql

特性介绍

    下图是逻辑复制的流程图:数据库

   

    逻辑复制也是基于WAL进行的复制,slave端经过逻辑解码对数据进行REDO。post

    下面介绍上图中的两个对象PUBLICATION和SUBSCRIPTION.编码

    1. PUBLICATION对象

        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

     2. SUBSCRIPTION对象

        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操做

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

相关文章
相关标签/搜索