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

时间:2015-09-04 23:10:03

标签: postgresql database-replication postgresql-9.4

我正在研究logical decoding并且我已经能够使用streaming replication protocol创建一个插槽并将数据库中的所有事务复制到另一个,并且它工作得很好。

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

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

我目前的提示是创建自定义logical decoding output plugin,我错了吗?

更新

我在postgresql源代码中基于output plugin构建了一个contrib/test decoding,这是一个很好的解决方法。但是它对实际用例没用,所以我决定将其他一些项目作为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上收到更新。

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

2 个答案:

答案 0 :(得分:2)

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

  
      
  • CREATE_REPLICATION_SLOT slot_name LOGICAL options
  •   
  • DROP_REPLICATION_SLOT slot_name
  •   
  • START_REPLICATION SLOT slot_name LOGICAL options
  •   

除了上面的界面,您还需要实现Logical Decoding Output插件。在此插件界面中,您需要调整Change Callback操作,该操作将侦听所有DML操作:

  

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

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

答案 1 :(得分:0)

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