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

概述

    逻辑复制(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. 进程

        173444_I8lT_2009022.png

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

转载于:https://my.oschina.net/tianbing/blog/1559996

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值