使用 PostgreSQL 管理 OCI 資料庫中災害復原設定的 pglogical Replication 序列

簡介

本教學課程概述自訂解決方案,以在主要和災害復原 (DR) 系統之間的邏輯雙向複製設定中同步 PostgreSQL 順序值。

問題陳述:

在目前的設定中,我們已設定雙向複寫。部分複製的表格依賴序列;不過,我們觀察到這些序列的 last_value 並不會在主要和 DR 環境之間複製。

這是預期的行為,並不被視為語彙中的錯誤 。依據設計,不會複製順序值,因為順序會被視為非交易,且原本為節點特定,以避免衝突。

為了解決此差距,我們已導入自訂解決方案來同步主要與災難復原系統之間的順序值。具體而言,我們正在制定以下程序:

此方法可確保序列值在兩個系統中保持一致,從而避免主要在 DR 環境中造成潛在的資料完整性或衝突問題。

目標

作業 1:設定 pglogical 雙向複製

確定主要系統和 DR 系統之間已經設定 pglogical 雙向複製。

若尚未設定,請依照官方文件設定 pglogical在來源資料庫中設定 pglogical Extension Replication

任務 2:啟用必要延伸

在主要和 DR 系統中,透過從 OCI 主控台建立組態來啟用下列擴充。

在 DBSystems 上套用組態檔之後,請連線至每個 DBSystem 上的 postgres 資料庫,然後執行下列查詢。

CREATE EXTENSION IF NOT EXISTS pg_cron;
CREATE EXTENSION IF NOT EXISTS dblink;

任務 3:建立程序

postgres 資料庫中的主要和 DR 系統上建立程序。

程序定義:

CREATE OR REPLACE PROCEDURE sync_sequences_from_remote()
LANGUAGE plpgsql
AS $$
DECLARE
  -- Update the connection string with correct credentials and hostname
  conn_str TEXT := 'host=<hostname> user=<username> password=<password> dbname=postgres';

  row RECORD;
  remote_seq_query TEXT :=
    $_$SELECT schemaname, sequencename, last_value
       FROM pg_sequences
       WHERE schemaname !~ 'pg_catalog|cron|information_schema|pg_toast|pg_temp'
         AND last_value IS NOT NULL$_$;
  full_seq_name TEXT;
  setval_sql TEXT;
BEGIN
  FOR row IN
    SELECT * FROM dblink(conn_str, remote_seq_query)
      AS t(schemaname TEXT, sequencename TEXT, last_value BIGINT)
  LOOP
    full_seq_name := quote_ident(row.schemaname) || '.' || quote_ident(row.sequencename);
    setval_sql := FORMAT('SELECT setval(%L, %s, true);', full_seq_name, row.last_value);
    RAISE NOTICE 'Setting sequence: %', setval_sql;
    EXECUTE setval_sql;
  END LOOP;
END;
$$;

注意:

作業 4:在 DR 系統中建立 pg_cron 工作

執行下列查詢以建立 pg_cron 工作,並排定程序在 DR 資料庫系統上每隔一分鐘執行一次。

SELECT cron.schedule('UPDATE SEQUENCE', '*/1 * * * *', $$ CALL sync_sequences_from_remote(); $$);

附註:

工作 5:在主要系統中建立 pg_cron 工作並加以停用

執行下列查詢以建立 pg_cron 工作並將其停用。

SELECT cron.schedule('*/1 * * * *', $$ CALL sync_sequences_from_remote() $$);

-- Disable the job (on Primary)
SELECT cron.alter_job(jobid := <job_id>, active := false);

工作 6:處理容錯移轉

發生容錯移轉事件時,請遵循下列步驟:

  1. 在新的 DR (先前為主要) 中,啟用 pg_cron 工作。

  2. 在新的主要 (先前為 DR) 中,停用 pg_cron 工作。

這可確保同步處理程序永遠只會在目前的 DR 系統上執行。

注意:

確認

其他學習資源

docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center