PostgreSQL Logical Replication
限制及特性
1、只支持普通表生效,不支持序列、视图、物化视图、外部表、分区表和大对象
2、只支持普通表的DML(INSERT、UPDATE、DELETE)操作,不支持truncate、DDL操作
3、需要同步的表必须设置REPLICA IDENTITY 不能为noting(默认值是default),同时表中必须包含主键,否则delete和update报错
4、一个publisher可以包含一张或多张表,一张表可以有一个或多个publishers
5、一个发布者可以有多个订阅者订阅,一个订阅者也可以同时订阅多个发布者,在同一个数据库下订阅者不能对同一个发布者的表重复订阅(避免数据冲突)
6、逻辑复制不同于流复制,不是严格的主从关系,订阅者端的普通表依然可以进行增删改操作
7、同步表的表结构需要在发布者和订阅者两边保持一致(列的顺序允许不一样,但是列对应的数据类型必须一致)
8、如果订阅者端的数据被误删,想要从发布者重新copy同步表的数据,只能以重建同步表所在的订阅者的方式来实现
环境搭建
配置数据库参数
1、修改postgresql.conf数据库参数文件(修改这些参数需要重启数据库)a、发布者端设置设置wal_level级别为logical:wal_level = logical设置max_wal_senders,此参数值要不小于max_replication_slots的参数值,默认值是10设置max_replication_slots,此参数值不少于subscriptions的个数,默认值是10b、订阅者端设置设置wal_level级别为logical:wal_level = logical设置max_logical_replication_workers,此参数值不少于订阅者的个数,默认是4设置max_worker_processes,此参数值不少于max_logical_replication_workers值+1 2、在pg_hba.conf添加白名单(根据真实情况自行限制网段)host all repuser 0.0.0.0/0 md53、创建专门用于逻辑复制的超户(建议使用uuid作为密码)create user repuser superuser login password 'repuser1234';
创建发布者
publisher是逻辑复制的起点--查看pub_db数据库的发布者
pub_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes
------+-------+------------+---------+---------+---------
(0 rows)--在pub_db数据库上创建名为mypub的发布者
pub_db=# CREATE PUBLICATION mypub;
CREATE PUBLICATION
pub_db=#
pub_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes
-------+----------+------------+---------+---------+---------mypub | postgres | f | t | t | t
(1 row)--查看mypub发布的详细信息
pub_db=# \dRp+Publication mypubOwner | All tables | Inserts | Updates | Deletes
----------+------------+---------+---------+---------postgres | f | t | t | t
(1 row)
创建订阅者
subscriber是逻辑复制的下游--查看sub_db数据库下的订阅者
sub_db=# \dRsList of subscriptionsName | Owner | Enabled | Publication
------+-------+---------+-------------
(0 rows)--在sub_db数据库上创建名为mysub的订阅者
sub_db=# CREATE SUBSCRIPTION mysub CONNECTION 'dbname=pub_db host=l-test1 user=repuser password=repuser1234 port=6432' PUBLICATION mypub;
NOTICE: created replication slot "mysub" on publisher
CREATE SUBSCRIPTION
sub_db=#
sub_db=#
sub_db=# \dRsList of subscriptionsName | Owner | Enabled | Publication
-------+----------+---------+-------------mysub | postgres | t | {mypub}
(1 row)--查看订阅者mysub的详细信息
sub_db=# \dRs+List of subscriptionsName | Owner | Enabled | Publication | Synchronous commit | Conninfo
-------+----------+---------+-------------+--------------------+-------------------------------------------------------------------------------------mysub | postgres | t | {mypub} | off | dbname=pub_db host=l-test1 user=repuser password=repuser1234 port=6432
(1 row)
添加需要同步的表
发布者端--创建表
pub_db=# create table logical_tb1(id int primary key,col1 varchar(8),col2 numeric(10,2),col3 jsonb,col4 hstore,col5 timestamptz default now(),col6 int[],col7 ltree);
CREATE TABLE
pub_db=# insert into logical_tb1(id,col1) select generate_series(1,2000),'tester';
INSERT 0 2000--添加到发布者mypub
pub_db=# alter publication mypub add table logical_tb1;
ALTER PUBLICATION--查看发布者的详细信息
pub_db=# \dRp+ mypubPublication mypubOwner | All tables | Inserts | Updates | Deletes
----------+------------+---------+---------+---------postgres | f | t | t | t
Tables:"public.logical_tb1"订阅者端--创建相同的表
sub_db=# create table logical_tb1(id int primary key,col1 varchar(8),col2 numeric(10,2),col3 jsonb,col4 hstore,col5 timestamptz default now(),col6 int[],col7 ltree);
CREATE TABLE--刷新一下订阅者
sub_db=# ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;
ALTER SUBSCRIPTION--查询数据是否已经同步过来
sub_db=# select count(*) from logical_tb1;count
-------2000
(1 row)
约束条件表
对于没有任何约束条件的普通表实现逻辑同步很简单,直接将表添加到发布者即可,但是有约束条件的表如何实现逻辑同步呢?
条件约束
先给出结论:对于条件符合约束的数据在订阅端不影响同步,不符合条件约束的数据在订阅端会同步报错--在sub_db上的同步表添加一个check 约束
sub_db=# alter table logical_tb1 add constraint col1_check check(col1 = 'test');
ALTER TABLE
sub_db=# \d logical_tb1Table "public.logical_tb1"Column | Type | Collation | Nullable | Default
--------+--------------------------+-----------+----------+---------id | integer | | not null | col1 | character varying(8) | | | col2 | numeric(10,2) | | | col3 | json | | | col4 | hstore | | | col5 | timestamp with time zone | | | now()col6 | integer[] | | | col7 | ltree | | |
Indexes:"logical_tb1_pkey" PRIMARY KEY, btree (id)
Check constraints:"col1_check" CHECK (col1::text = 'test'::text)--在pub_db上的同步表插入两条测试数据
pub_db=# insert into logical_tb1 values(1,'test','999.99','{"ja":"1"}','ha=>1',now(),'{9}');
INSERT 0 1
pub_db=# insert into logical_tb1 values(2,'test2','999.99','{"ja":"1"}','ha=>1',now(),'{9}');
INSERT 0 1--检查sub_db上同步表的数据同步情况
sub_db=# select * from logical_tb1 ;id | col1 | col2 | col3 | col4 | col5 | col6 | col7
----+------+--------+------------+-----------+-------------------------------+------+------1 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 15:12:58.921844+08 | {9} |
(1 row)--检查日志发现了报错:
ERROR: new row for relation "logical_tb1" violates check constraint "col1_check"
DETAIL: Failing row contains (2, test2, 999.99, {"ja":"1"}, "ha"=>"1", 2018-04-11 15:29:12.395614+08, {9}, null).--删除sub_db上同步表的约束后,数据继续同步
sub_db=# alter table logical_tb1 drop CONSTRAINT col1_check;
ALTER TABLE
sub_db=# select * from logical_tb1 ;id | col1 | col2 | col3 | col4 | col5 | col6 | col7
----+-------+--------+------------+-----------+-------------------------------+------+------1 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 15:12:58.921844+08 | {9} | 2 | test2 | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 15:29:12.395614+08 | {9} |
(2 rows)
外键约束
先给出结论:如果发布端没有外键约束条件,而订阅端有外键约束条件,同步数据不受订阅端外键约束条件影响--订阅者端创建非同步表
sub_db=# create table logical_tb2(id int primary key,for_id int);
CREATE TABLE--订阅者端同步表添加列col8并添加外键约束,引用logical_tb2的主键
sub_db=# alter table logical_tb1 add column col8 int references logical_tb2(id);
ALTER TABLE--订阅端插入初始化数据
sub_db=# insert into logical_tb2 values(1,1),(2,2),(3,3);
INSERT 0 3sub_db=# select * from logical_tb2;id | for_id
----+--------1 | 12 | 23 | 3
(3 rows)--发布者端插入违反外键约束的数据(发布者端没有外加约束)
pub_db=# insert into logical_tb1 values(5,'test','999.99','{"ja":"1"}','ha=>1',now(),'{9}','beijing.haidian',4);
INSERT 0 1--观察订阅者端的数据,依然能同步进来,不受外键约束的影响
sub_db=# select * from logical_tb1;id | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8
----+------+--------+------------+-----------+-------------------------------+------+-----------------+------1 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 15:12:58.921844+08 | {9} | | 2 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 15:40:28.794865+08 | {9} | | 3 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 18:39:15.537949+08 | {9} | beijing.haidian | 14 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 18:40:28.885829+08 | {9} | beijing.haidian | 45 | test | 999.99 | {"ja":"1"} | "ha"=>"1" | 2018-04-11 18:51:50.167068+08 | {9} | beijing.haidian | 4
(5 rows)
PostgreSQL Logical Replication相关推荐
- postgresql update使用别名_PostgreSQL逻辑复制之pglogical
朱贵平(lottu) 中国PG分会认证专家 宜搜科技资深DBA,擅长Oracle.PostgreSQL,目前从事Oracle.PostgreSQL 相关的运维管理及迁移等工作. 一.pglogic ...
- 参数详解 复制进程_如何优化PostgreSQL逻辑复制
How to Optimize PostgreSQL Logical Replication 逻辑复制( Logical Replication )或 Pglogical 是表级别的复制.两者都是基于 ...
- python通用数据库连接_python 连接数据库pg
extended the postgresql metric python module on ganglia 本文主要拿PostgreSQL ganglia python module 来讲一下如何 ...
- PostgreSQL client's startup packet different between logical and normal stream replication
我们知道PostgreSQL 9.4新增了逻辑流复制的功能, 在客户端连接数据库服务器时, 通过发送给数据库的startup packet来判断是否要数据库启动wal sender, 并且如何来识别是 ...
- Postgresql逻辑复制报错could not start WAL streaming: ERROR: replication slot “x“is active for PID xxx
先看日志错误: #发布端报错如下: 2022-04-01 10:18:23.812 CST,"postgres","hank",4666,"10.4. ...
- PostgreSQL 11 100亿 tpcb 性能测试 on ECS
标签 PostgreSQL , tpcb , pgbench , 100亿 背景 PostgreSQL 11 发布在即,以下是tpcc与tpch测试的结果: <PostgreSQL 11 tpc ...
- PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库
标签 PostgreSQL , 恢复部分数据库 , 跳过坏块 , 修复无法启动的数据库 , 时间点恢复 , 逻辑备份 , 连续备份 背景 一个较大的数据库,如何只恢复一部分数据(例如只恢复某个DB). ...
- navicat premium 链接postgresql 无法加载表_POSTGRESQL 数据库结构体系 ||| 东来西去 三个角度看...
POSTGRESQL 的数据库体系结构是了解POSTGRESQL 数据库的整体概念的一个开始,而数据库的结构体系这个词有点大,所以这里从三个角度出发来看POSTGRESQL 结构 1 从数据库的使用 ...
- postgresql参数化查询_一个能融会贯通PostgreSQL监控的人,大概率是高手
有一些同学觉得监控无非是针对CPU.内存 .磁盘进行一些简单的监控,其实不仅仅如此,监控涵盖了众多知识的融合,能融会贯通PostgreSQL监控的人,大概率是PostgreSQL高手. POSTGRE ...
最新文章
- Express中间件--connect-mongodb-session
- springMVC中Dispatcher中的/和/*的区别
- CNN反向传播卷积核翻转
- 卸载loadrunner
- 小程序支付一定要后台服务器,2.字节跳动小程序支付配置
- 黑科技 | 电脑必备黑科技软件
- Python_计算加速度
- win10电脑wifi服务器未响应,win10系统点电脑无线图标没反应的解决方法
- Linux操作系统———李纳斯
- 二进制与十进制转换器
- vue渲染大量数据优化_vue大数据表格卡顿问题的完美解决方案
- apache的HttpClient的默认重试机制
- C++函数声明和函数定义
- rails 查询 where条件用法
- python混淆ios代码_XSDK——iOS代码混淆原理
- 《信号与系统学习笔记》—拉普拉斯变换(一)
- php判断是为字符串类型,PHP:检查变量是否为字符串类型并且不是空字符串?
- 微软Windows多媒体技术介绍
- 跟着我从零开始入门FPGA(一周入门XXOO系列)-阻塞和非阻塞
- c++ set unordered_set区别
热门文章
- layui让当前页面刷新_layui点击按钮页面会自动刷新的解决方案
- nginx两台文件服务器集群,keepalived结合nginx状态检测脚本实现对web服务器集群的高可用...
- office怎么像wps一样多栏_时常受到欺负怎么办?——要像对付野狗一样对付坏人!...
- java中properties类_Java中的Properties类详解
- 安装erlang没有bin文件夹_Windows10有关jdk13.0.1的详细安装过程
- mysql 一行转多多行_JS 小工具 MYSQL WHERE IN条件 去掉换行符(列转行)
- html api中文文档,Svelte API 中文文档 | Svelte 中文网
- saltstack python3安装_如何在linux下升级python以及saltstack安装
- 行人属性数据集pa100k_Attribute-Recognition行人属性识别资料
- windows 配置 Gitlab、Gitee(码云) 的git开发环境