博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 的逻辑复制 与 部分疑问
阅读量:2169 次
发布时间:2019-05-01

本文共 1611 字,大约阅读时间需要 5 分钟。

PostgreSQL 本身是支持流式复制的,而大部分数据库都支持逻辑复制的方式,流式复制稳定高效,但缺点是不灵活,而逻辑复制的优点就在于此。

逻辑的复制的优点

1 可以进行数据的过滤

2 可以进行数据的融合

3 部分数据的复制

逻辑复制使用发布/订阅模型,因此我们在上游(或发布者)创建发布,在下游(或订阅者)创建订阅。

通过一个例子我们来进行实际的逻辑复制的理解

1 先在原库上创建一张表

2 创建发布publication, 在创建复制的过程是在当前的数据库中建立复制通道发布的本质是一组表

create publication repl_test for all tables;

3 然后我们在目的库建立相同的表,或者近似的表(近似表的意思是和源表有的字段都必须有)

create table repl_table1 (id serial constraint primarykey primary key,name varchar(20),create_time timestamp);

4 创建相关的replication 对源与目的

create subscription repl_test connection 'user=repl password=password host=10.50.132.195 port=5432 dbname=repl_test' publication repl_test;

这里有几个注意的点

1 两个物理的数据库需要能进行联通,并且有一个账号可以进行数据的访问,一般来说权限需要使用 superuser

2 在复制的时候针对的是源的数据库,并且要写清楚对于源数据库的中已经建立的publication.

3 相关的表之间的连接就建立好了。

我们可以在主库插入数据,再在从库进行数据的校验

到此我估计大家的问题已经一大堆了

我先替大家提几个问题

1  如果我在从库的表插入记录可以吗?如果插入的记录和主库有冲突怎么办?

2   怎么监控数据的复制

3   如果我在主库建立表,不在从库建立表,会怎样

4   如果我在从库修改数据,会出现什么情况

1  如果我们在从库插入记录并且数据和主库有冲突会如何

实验步骤:

1 在源数据库插入数据

2 查看目的数据库的表是否已经有了数据

3 我们在从库上插入数据

4 然后再在主库上继续插入数据

主库

从库

我看可以看到 主库的数据插入到从库并没有被影响,主要是因为并未产生主键的冲突

然后我们继续查看在从库插入数据,占用主库下一次要插入占用的主键,再在主库继续插入数据。

主库

从库

我看可以看到主库的表和从库的表已经不一致了。

问题是我们怎么办?

我尝试删除从库的与主库冲突的数据,看看会怎样?

我们可以看到,从库的数据继续接受主库的数据

这点是比较好的,因为部分数据库在遇到这样的问题时复制就停止了,就算是修复的数据后,也不能继续进行,可能还需要整体的复制修复等等

2  怎么监控复制的问题

监控的问题主要分为两个部分

1 publication

2 subscription

3 在主库建表后,进行数据的插入,但是在从库上并未建立相关的表,造成的结果就是复制停止了。

通过查看主库和从库的 pg_stat_replication  和  pg_stat_subscription

发现已经没有相关的数据

4 直接在从库的错误日志中可以看到明显的错误提示

此时复制已经中断

总结:数据复制中,如果选择复制所有表,在添加新表后,需要在从库也建立相关的表结构。如果不做则表复制就直接错误并不在进行工作。

如何恢复,直接在从库上建立表的结构后,数据就开始复制 ,并且复制自动开始,复制恢复。

4 在从库进行数据的修改

这里就不在截图,直接将结果展现

如果你对从库的表的数据进行UPDATE 非主键的情况下,其实对于复制的影响并不是很大,但不建议这样做。

转载地址:http://chazb.baihongyu.com/

你可能感兴趣的文章
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南3:并发三大问题与volatile关键字,CAS操作
查看>>
Java并发指南4:Java中的锁 Lock和synchronized
查看>>
Java并发指南5:JMM中的final关键字解析
查看>>
Java并发指南6:Java内存模型JMM总结
查看>>
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
查看>>
Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
查看>>
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>