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

2019-09-19 15:20:00 浏览数 (1)

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

接上期的问题,在删除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 人点赞