【问题标题】:It's possible to use logical decoding to replicate a single table?可以使用逻辑解码来复制单个表吗?
【发布时间】: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_footable_bar 的更新。


这是一个非常好的挑战,我不是 c 开发人员,我知道代码需要一些优化,但现在它的效果比预期的要好。

【问题讨论】:

  • 你是对的,这是可能的,但要做到正确并不容易。来自 BDR 项目的 UDR 已经支持使用逻辑解码仅复制一个表。您也可以使用更成熟但开销更高的 Londiste。
  • @CraigRinger 感谢您的建议,我已阅读 UDR 文档,似乎可以这样做,但我在尝试设置和使用 udr-plugin 时遇到了问题,所以我会离开它现在并且将在不久的将来进行一些测试。非常感谢您的建议。
  • FWIW,我们 2ndQuadrant 正在努力简化 UDR 并至少将输出插件纳入 9.6。目前,Londiste 是一个更容易的选择。随时在 pgsql-general 邮件列表或 SO 上询问 UDR。
  • 还有人写一个json输出插件iirc
  • @CraigRinger 再次感谢。我一直在关注test_decodingdecoder_jsondecoder_raw。所有这些对于让我了解整个过程都非常有用。我不是 C 开发人员,但很容易更新代码并获得满足我当前需求的工作插件。我将尝试 Londiste,并将在接下来的几周内继续测试 UDR。干杯

标签: postgresql database-replication postgresql-9.4


【解决方案1】:

wal2json 的当前版本有以下选项:

* `filter-tables` - tables to exclude
* `add-tables`- tables to include

用法:

pg_recvlogical -slot test_slot -o add-tables=myschema.mytable,myschema.mytable2

参考:https://github.com/eulerto/wal2json#parameters

【讨论】:

    【解决方案2】:

    根据documentation,您可以通过实现流复制interface methods来实现自己的同步复制解决方案:

    • CREATE_REPLICATION_SLOT slot_name 逻辑选项
    • DROP_REPLICATION_SLOT slot_name
    • START_REPLICATION SLOT slot_name LOGICAL 选项

    除了上面的接口,还需要实现Logical Decoding Output插件。在这个插件界面中需要调整Change Callback操作,它监听所有的DML操作:

    为每一行调用所需的 change_cb 回调 事务中的修改,可能是 INSERT、UPDATE 或 删除。即使原始命令一次修改了几行 每行都会单独调用回调。

    这是您要检查特定表以进行复制的功能。还要注意 Change Callback 不会处理 UNLOGGEDTEMP 表这一事实,但我想这不是严重的限制。

    【讨论】:

    • 我已经阅读了很多次文档,但在您回答之前并没有弄清楚,我会尝试这样做,并会用结果更新这个问题。谢谢德米特里
    • @Darwin 当然。不久前,当我们为我们的 postgres 集群选择复制策略时,我们遇到了同样的问题。您绝对可以使用 Slony 复制 - 它在复制配置(每个表)方面非常精细,但设置比流式复制更复杂,它不允许将模式拆分到不同的副本节点 - 这是我们的情况 - 但是对于您的情况可能是一个解决方案。
    • 我基于来自 pg 源的 test_decoding 构建了一个自定义 output plugin。我将尝试制作一个干净的版本,并在不久的将来用它更新问题。谢谢你的建议。
    • 我在主帖中更新了一些关于我的解决方案的注释,欢迎提供反馈!。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2013-02-11
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多