Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 它';是否可以使用逻辑解码来复制单个表?_Postgresql_Database Replication_Postgresql 9.4 - Fatal编程技术网

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。干杯