PostgreSQL 逻辑复制的“水”还是深

如果你没看过这篇文字的上一篇,估计马上看有点费劲,建议翻上一篇看完在看这篇。

接上期的问题,在删除postgresql的 逻辑复制时遇到了一些麻烦,删除subscription时遇到了

这个问题查询中发现大部分G 上的解释都是,原因是由于 subscription无法连接到publication 无法清理复制槽,所以造成的这样的问题。

但实际的问题,我下面验证了一下,复现这个 错误的情况。

1  我们还是主库建立publication 

2  在从库建立 subscription 并且是without copy data

 CREATE SUBSCRIPTION dvdrental_sub CONNECTION 'host=192.168.198.200 dbname=dvdrental user=publication password=xxxxx port=5432' PUBLICATION dvdrental with (copy_data = false);

3  我们查看日志,以及监控,查看复制是否建立

复制建立

复制槽工作中

从库订阅已经建立

模拟情况 1   删除subscription 失败

其主要的问题在于,命令没有错,但选错的当前的拥有subscription的数据库

模拟情况2  选择正确的数据库,继续删除subscription 报错

原因是当前的从库和主库之间无法连接,

在这样的情况下,

ALTER SUBSCRIPTION dvdrental_sub disable;

首先需要停止当前的订阅

ALTER SUBSCRIPTION dvdrental_sub SET (slot_name =NONE);

然后将订阅的复制槽设置成空

drop subscription dvdrental_sub;

最后就可以删除订阅了。

另外一个问题,复制订阅中,如果订阅的服务停止,或无法再次连接的情况下,需要关注 发布端的数据wal log 无法清理以及膨胀的问题。

所以在复制订阅中的订阅停止后,如果确认订阅无法再次恢复,或者不确认多长时间恢复,则需要删除复制槽

select * from pg_replication_slots;

select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name = 'dvdrental_sub';

以上就是在学习和处理逻辑复制中遇到的问题。当然如果你认为目前的问题就到此为止了,那就错了,其实复制订阅的水,还有很多没有踩。

例如如下的一个需求,在同一个pg cluter中的不同数据库进行复制订阅。

会怎么样。

我们来看一下

结果是,如果在同一个cluster 中的不同数据库之间建立复制订阅,用上面的手段是不会成功的,报错如下。

SELECT * FROM pg_create_logical_replication_slot('publication_dvd', 'pgoutput');

正确的创建方法是:

1  在主库创建publication 

2  在主库创建复制槽

 SELECT * FROM pg_create_logical_replication_slot('publication_dvd', 'pgoutput');

3   在同一个cluster 的 另一个订阅库,创建不带复制槽的订阅

 CREATE SUBSCRIPTION dvdrental_sub CONNECTION 'host=192.168.198.200 dbname=dvdrental user=publication password=XXXXX port=5432' PUBLICATION dvdrental with (create_slot = false,slot_name = publication_dvd);

然后就可以进行相关的同CLUSTER 异库之间的复制了。

到此复制订阅,告一段落,其实里面还有很多的东西没有说,通过学习复制订阅,发现学习一件事情,更多的是需要发散性的需求,如果仅仅是 单向思维,基本上没有什么事情是不好做的,用发散性思维去考虑问题,则需要解决的问题会很多,也是更快速提高和掌握知识的一种方式。(同时需要详细的理解原理)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值