可以使用逻辑解码来复制单个表吗?

Dar*_*win 8 postgresql database-replication postgresql-9.4

我正在研究逻辑解码,我已经能够创建一个插槽,并使用流复制协议将数据库中的所有事务复制到另一个,并且它工作得非常好.

但我需要复制一个表而不是数据库中的所有表.

所以,我的问题是:是否logical decoding允许过滤单个表的流?

我目前的提示是创建一个自定义逻辑解码输出插件,我错了吗?

更新

我已经构建了一个output plugin基于contrib/test decodingpostgresql的源代码,这是一个很好的解决方法.但是它对实际用例没用,所以我决定将其他一些项目作为fork和update的引用.

对我来说最好的是wal2json,所以我决定将它分叉并添加表过滤器作为选项而不是硬编码表名.

是fork,这是变更集.

如何使用

首先使用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唯一的.


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

Ond*_*žka 5

当前版本wal2json有以下选项:

* `filter-tables` - tables to exclude
* `add-tables`- tables to include
Run Code Online (Sandbox Code Playgroud)

用法:

pg_recvlogical -slot test_slot -o add-tables=myschema.mytable,myschema.mytable2
Run Code Online (Sandbox Code Playgroud)

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


Dmi*_*kov 2

根据文档,您可以通过实现流复制接口方法来实现您自己的同步复制解决方案:

  • CREATE_REPLICATION_SLOT slot_name 逻辑选项
  • DROP_REPLICATION_SLOT 插槽名称
  • START_REPLICATION SLOT slot_name LOGICAL 选项

除了上面的接口之外,您还需要实现逻辑解码输出插件。在这个插件接口中你需要调整Change Callback操作,它监听所有的DML操作:

为事务内的每个单独行修改调用所需的change_cb回调,可能是INSERT、UPDATE或DELETE。即使原始命令一次修改多行,也会为每行单独调用回调。

这是您要检查特定表的复制情况的函数。另请注意,更改回调不会处理UNLOGGEDTEMP表,但我想这并不是严格的限制。