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