簡體   English   中英

PostgreSQL 邏輯復制 - 忽略預先存在的數據

[英]PostgreSQL logical replication - ignore pre-existing data

想象一下放棄訂閱並從頭開始重新創建它。 是否可以在第一次同步時忽略現有數據?

使用(copy_data=false)創建訂閱不是一種選擇,因為我確實想復制數據,我只是不想復制已經存在的數據。


示例:master 上有一個users表和一個相應的publication。 該表有 100 萬行,每分鍾添加一個新行。 然后我們取消訂閱一天。

如果我們使用(copy_data=true)重新創建訂閱,由於與現有數據沖突,復制將不會開始。 如果我們指定(copy_data=false) ,將丟失 1440 個新行。 我們如何正確同步發布者和訂閱者?

您不能這樣做,因為PostgreSQL無法告知何時添加數據。

您必須手動調整表格(或INSERT ... ON CONFLICT DO NOTHING )。

不幸的是 PostgreSQL 還不支持很好的沖突跳過選項,但我相信它會在功能中得到增強。

基於@Laurenz Albe 的回答,建議使用該語句:

 INSERT ... ON CONFLICT DO NOTHING.

我相信最好使用以下命令,它還會在您再次開始訂閱之前處理您的數據的任何可能更新:

INSERT ... ON CONFLICT UPDATE SET...

最后我不得不說這兩個都是骯臟的解決方案,因為在執行上述語句和創建訂閱期間,新行可能已經到達,這將導致它們丟失,直到您再次執行自定義同步。

我已經看到一些其他建議的解決方案使用 Postgresql 日志文件中的 LSN 編號...

對我來說,從目標表中刪除所有數據並重新創建復制可能是優雅和安全的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM