Postgresql 它';是否可以使用逻辑解码来复制单个表?
我正在做一项关于的研究,我已经能够创建一个插槽,并使用它将数据库中的所有事务复制到另一个数据库中,而且效果非常好 但我只需要复制一个表,而不是数据库中的所有表 所以,我的问题是:Postgresql 它';是否可以使用逻辑解码来复制单个表?,postgresql,database-replication,postgresql-9.4,Postgresql,Database Replication,Postgresql 9.4,我正在做一项关于的研究,我已经能够创建一个插槽,并使用它将数据库中的所有事务复制到另一个数据库中,而且效果非常好 但我只需要复制一个表,而不是数据库中的所有表 所以,我的问题是:逻辑解码是否允许为单个表过滤流 我当前的提示是创建一个自定义,我错了吗 更新 我基于postgresql的contrib/test解码构建了一个输出插件,这是一个很好的解决方法。然而,它对实际用例没有用处,所以我决定将其他一些项目作为fork和update的参考 对我来说最好的是,所以我决定分叉它并添加表过滤器作为选项,
逻辑解码是否允许为单个表过滤流
我当前的提示是创建一个自定义,我错了吗
更新
我基于postgresql的contrib/test解码
构建了一个输出插件
,这是一个很好的解决方法。然而,它对实际用例没有用处,所以我决定将其他一些项目作为fork和update的参考
对我来说最好的是,所以我决定分叉它并添加表过滤器作为选项,而不是硬编码表名
是叉子和叉子
如何使用
首先使用wal2json
插件创建插槽:
pg_recvlogical-d postgres--插槽测试\u插槽--创建插槽-p wal2json
然后开始接收流
pg_Recvlological-d postgres——时隙测试时隙——开始-o限制到=表_foo,表_bar-f-
现在我们已经准备好只接收table_foo
和table_bar
上的更新
这是一个非常好的挑战,我不是一名c开发人员,我知道代码需要一些优化,但目前它的工作效果比预期的要好。根据您可以通过实施流式复制来实施您自己的同步复制解决方案:
- 创建\u复制\u插槽\u名称逻辑选项
- 删除\u复制\u插槽\u名称
- 启动\u复制插槽插槽\u名称逻辑选项
除了上面的接口,您还需要实现插件。在此插件界面中,您需要调整操作,该操作将侦听所有DML操作:
为每一行调用所需的change\u cb回调
事务内部的修改,可以是插入、更新或
删除。即使原始命令一次修改了几行
将为每一行单独调用回调
这是您要检查特定表以进行复制的函数。还要注意的是,ChangeCallback不会处理和表,但我想这不是一个严格的限制 当前版本的wal2json
具有以下选项:
* `filter-tables` - tables to exclude
* `add-tables`- tables to include
用法:
pg_recvlogical -slot test_slot -o add-tables=myschema.mytable,myschema.mytable2
参考资料:我已经阅读了很多次文档,在您回答之前没有弄清楚,我将尝试这样做,并将根据结果更新此问题。谢谢Dmitry@Darwin当然不久前,当我们为postgres集群选择复制策略时,我们遇到了同样的问题。您完全可以使用Slony复制—它在复制配置(每个表)方面非常精细,但对于安装来说要比流式复制复杂得多,它不允许将架构拆分到不同的副本节点—这是我们的情况—但对于您的情况,它可能是一个解决方案,.我基于pg源的测试解码
构建了一个定制的输出插件
。我将尝试对此做出一个清晰的版本,并在不久的将来用它更新这个问题。谢谢你的建议。我用一些关于我的解决方案的注释更新了主要帖子,欢迎反馈!。谢谢你的帮助。你是对的,这是可能的,但要做到正确并不容易。来自BDR项目的UDR已经支持使用逻辑解码仅复制一个表。您也可以使用Londiste,它更成熟,但开销更高。@CraigRinger感谢您的建议,我已经阅读了UDR文档,似乎可以做到这一点,但我在尝试设置和使用UDR插件时遇到了问题,所以我现在就不使用它,并在不久的将来进行一些测试。我真的很感谢你的建议。FWIW我们第二象限正在努力简化UDR,并将至少输出插件引入9.6。目前,Londiste是一个更容易的选择。您可以在pgsql通用邮件列表或此处询问UDR。还有人正在编写json输出插件iirc@CraigRinger再次感谢。我一直在看,而且。所有这些都对我了解整个过程非常有用。我不是一个C开发人员,但它很容易更新代码,并获得一个适合我当前需要的工作插件。我将尝试Londiste,并将在接下来的几周继续测试UDR。干杯