【发布时间】:2015-12-01 04:26:44
【问题描述】:
我正在对logical decoding 进行研究,我已经能够使用streaming replication protocol 创建一个槽并将数据库中的所有事务复制到另一个数据库中,并且效果非常好。
但我只需要复制一个表,而不是数据库上的所有表。
所以,我的问题是:logical decoding 是否允许过滤单个表的流?
我目前的提示是创建一个自定义logical decoding output plugin,我错了吗?
更新
我基于来自 postgresql 源的 contrib/test decoding 构建了一个 output plugin,这是一个很好的解决方法。但是它对实际用例没有用,所以我决定将其他一些项目作为 fork 和 update 的参考。
对我来说最好的是wal2json,所以我决定分叉它并添加表格过滤器作为选项,而不是硬编码表格名称。
Here 是分叉,this is the changeset。
如何使用
首先使用wal2json 插件创建插槽:
pg_recvlogical -d postgres --slot test_slot --create-slot -P wal2json
然后开始接收流
pg_recvlogical -d postgres --slot test_slot --start -o limit-to=table_foo,table_bar -f -
现在我们准备好接收table_foo 和table_bar 的更新。
这是一个非常好的挑战,我不是 c 开发人员,我知道代码需要一些优化,但现在它的效果比预期的要好。
【问题讨论】:
-
你是对的,这是可能的,但要做到正确并不容易。来自 BDR 项目的 UDR 已经支持使用逻辑解码仅复制一个表。您也可以使用更成熟但开销更高的 Londiste。
-
@CraigRinger 感谢您的建议,我已阅读 UDR 文档,似乎可以这样做,但我在尝试设置和使用
udr-plugin时遇到了问题,所以我会离开它现在并且将在不久的将来进行一些测试。非常感谢您的建议。 -
FWIW,我们 2ndQuadrant 正在努力简化 UDR 并至少将输出插件纳入 9.6。目前,Londiste 是一个更容易的选择。随时在 pgsql-general 邮件列表或 SO 上询问 UDR。
-
还有人写一个json输出插件iirc
-
@CraigRinger 再次感谢。我一直在关注test_decoding、decoder_json 和decoder_raw。所有这些对于让我了解整个过程都非常有用。我不是 C 开发人员,但很容易更新代码并获得满足我当前需求的工作插件。我将尝试 Londiste,并将在接下来的几周内继续测试 UDR。干杯
标签: postgresql database-replication postgresql-9.4