2015-09-04 44 views
5

我正在做一項關於logical decoding的研究,我已經能夠創建一個插槽並使用streaming replication protocol將數據庫中的所有事務複製到另一個插槽,並且它工作得非常好。可以使用邏輯解碼來複制單個表?

但我需要只複製一個表而不是數據庫上的所有表。

所以,我的問題是:logical decoding是否允許過濾單個表的流?

我當前的提示是創建一個自定義logical decoding output plugin,我錯了嗎?

我已經建立了一個更新基於output plugincontrib/test decoding和PostgreSQL源,這是一個很好的解決方法。但是它對於實際用例並沒有用,所以我決定將其他項目作爲fork和update的參考。

對我來說最好的是wal2json,所以我決定分叉它並添加表格過濾器作爲選項,而不是硬編碼表格名稱。

Here是fork和this is the changeset

如何使用

首先創建的插槽與wal2json插件:

pg_recvlogical -d Postgres的--slot test_slot --create插槽-P wal2json

然後啓動接收流

pg_recvlogical -d postgres --slot t est_slot --start -o限制到= table_foo,table_bar -f -

現在我們已經準備好接受的table_foo只有table_bar更新。


這是一個很好的挑戰,我不是一個C開發人員,我知道這些代碼需要一些優化,但現在它的工作原理好於預期。

+1

你是對的,這是可能的,但這並不容易。來自BDR項目的UDR已經支持使用邏輯解碼僅複製一個表格。你也可以使用Londiste,它比較成熟,但是開銷較高。 –

+0

@CraigRinger感謝您的建議,我已閱讀UDR文檔,似乎可以做到這一點,但我遇到了試圖設置和使用'udr-plugin'的問題,所以我現在就離開它,並且會在不久的將來做一些測試。我非常感謝你的建議。 – Darwin

+1

FWIW我們在2ndQuadrant正致力於簡化UDR並將輸出插件至少獲取到9.6。 Londiste目前是一個更容易的選擇。隨意在pgsql-general郵件列表上或在SO上詢問UDR。 –

回答

1

按照documentation你可以實現流複製interface methods實現自己的同步複製解決方案:

  • CREATE_REPLICATION_SLOT SLOT_NAME邏輯選項
  • DROP_REPLICATION_SLOT SLOT_NAME
  • START_REPLICATION SLOT SLOT_NAME邏輯選項

除了上面的界面你還需要實現Logical Decoding Output插件。在這個插件接口,你需要調整Change Callback操作,監聽到所有的DML操作:

所要求change_cb回調呼籲事務中的每個單獨的行 修改,可以說,它是一個INSERT,UPDATE或 刪除。即使原始命令一次修改了幾行,對於每一行都將分別調用回調函數 。

這是您想要檢查特定表進行復制的功能。另外請注意,Change Callback不會處理UNLOGGEDTEMP表,但我想這不是嚴重的限制。

+0

我已經閱讀過很多次文檔,在回答之前沒有清楚,我會嘗試執行此操作,並將結果更新此問題。謝謝德米特里 – Darwin

+1

@達爾文肯定。我們前段時間遇到了同樣的問題,當時我們正在爲postgres集羣選擇複製策略。你肯定可以使用Slony複製 - 它在複製配置(每個表)方面非常精細,但是對於設置比流式複製更復雜,它不允許將模式分割爲不同的複製節點 - 這是我們的情況 - 但是對於你的情況可能是一個解決方案。 –

+0

我已經建立了一個基於pg sources的'test_decoding'的自定義輸出插件。我會盡力做出一個乾淨的版本,並在不久的將來更新這個問題。謝謝你的建議。 – Darwin