簡體   English   中英

Postgres中的離線有限多主人

[英]offline limited multi-master in Postgres

站點A將生成一組記錄。 每晚他們將備份他們的數據庫並將其ftp到站點B.站點B根本不會修改這些記錄,但會添加更多記錄,其他表格將創建FK到站點A的記錄。

因此,基本上,我需要設置一個系統來從站點A的轉儲中進行所有增量更改(主要是插入和更新,但有些刪除可能)並在站點B應用它們。

此時,我們正在使用Postgres 8.3,但如果有價值可以升級。

我相信我可以用Bucardo相對直接地做到這一點,但在設置一個linux盒子來測試它之前,我很想聽聽替代品(或Bucardo的確認)。

大多數復制解決方案都可以解決問題。 Postgres Wiki有一個關於該主題章節 但你的情況很簡單。 我只想使用dblink
這是從我的工作實現推廣的:

  1. 主數據庫中創建一個返回更新行的視圖。
    我們稱之為myview

  2. 從屬數據庫中為每個表創建一個函數,該函數通過dblink獲取行:

CREATE OR REPLACE FUNCTION f_lnk_mytbl()
  RETURNS TABLE(col_a integer, col_b text, col_c text) AS
$func$
   SELECT *
   FROM   public.dblink('SELECT col_a, col_b, col_c FROM myview')
                      AS b(col_a integer, col_b text, col_c text);
$func$  LANGUAGE sql SECURITY DEFINER;

REVOKE ALL ON FUNCTION f_lnk_mytbl() FROM public;
GRANT EXECUTE ON FUNCTION f_lnk_mytbl() TO my_user;
  1. 從屬數據庫中的另一個函數中使用上述函數來建立和關閉服務器連接。

CREATE OR REPLACE FUNCTION f_mysync()
  RETURNS void AS
$func$
BEGIN
   PERFORM dblink_connect(
          'hostaddr=123.45.67.89 port=5432 dbname=mydb user=postgres password=secret');

   -- Fetch data into local temporary table for fast processing.
   CREATE TEMP TABLE tmp_i ON COMMIT DROP AS
   SELECT * FROM f_lnk_mytbl();

   -- *Or* read local files into temp tables with COPY so you don't need dblink.
   -- UPDATE what's already there (instead of DELETE, to keep integrity).
   UPDATE mytbl m
   SET   (  col_a,   col_b,   col_c) =
         (i.col_a, i.col_b, i.col_c)
   FROM   tmp_i i
   WHERE  m.id = i.id
   AND   (m.col_a, m.col_b, m.col_c) IS DISTINCT FROM
         (i.col_a, i.col_b, i.col_c);

   -- INSERT new rows
   INSERT INTO mytbl
   SELECT * FROM tmp_i i
   WHERE  NOT EXISTS (SELECT 1 FROM mytbl m WHERE m.id = i.id);

   -- DELETE anything? More tables?

   PERFORM dblink_disconnect();
END
$func$  LANGUAGE plpgsql SECURITY DEFINER;

REVOKE ALL ON FUNCTION f_mysync() FROM public;
GRANT EXECUTE ON FUNCTION f_mysync() TO my_user;
  1. 現在,這個電話就是您所需要的。 以超級用戶或my_user身份進行my_user 安排一個cronjob或其他東西。

SELECT f_sync_mytbl();

在PostgreSQL 9.1或更高版本中,還有新的CREATE FOREIGN TABLE 可能會更優雅。

暫無
暫無

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

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