設定邏輯複製和解碼

您可以使用 PostgreSQL 適用的 Cloud SQL 邏輯複製和解碼功能。這些功能可啟用邏輯複製工作流程和變更資料擷取 (CDC) 工作流程。

如需複製作業的一般資訊,請參閱「關於 Cloud SQL 中的複製作業」。

簡介

PostgreSQL 執行邏輯複製時,會使用邏輯解碼,從 WAL 記錄擷取串流至副本的變更。解碼後的變更與基礎實體儲存空間格式無關。這些變更僅反映 SQL 層級的資料變更,包括 INSERT、UPDATE 和 DELETE。這種與儲存層獨立的特性提供了極大的彈性,並可讓變更串流的使用者使用多種功能。

邏輯複製是邏輯解碼的主要功能。

PostgreSQL 的實體複製功能要求來源和目的地資料庫必須是相同版本,但邏輯複製功能則可跨 PostgreSQL 主要版本進行複製。Cloud SQL 的邏輯複製功能由 pglogical 擴充功能支援,適用於所有 PostgreSQL 版本,以及 PostgreSQL 10 新增的原生邏輯複製功能。

您可以使用不同的外掛程式,設定變更串流的格式。這可讓您靈活變更資料擷取 (CDC) 架構。舉例來說,wal2json 擴充功能可將資料庫中的所有變更串流至消費者,並格式化為 JSON。Cloud SQL 支援內建的 pgoutput 解碼器、test_decoding contrib 模組和 wal2json。Cloud SQL 目前支援兩種 wal2json 變體的 JSON 輸出:format-version 1 會將整個交易編碼為單一 JSON 物件,format-version 2 則會為每個指令輸出一個 JSON 物件。這些外掛程式可將資料複製到非 PostgreSQL 資料庫。

設定 PostgreSQL 執行個體

PostgreSQL 支援邏輯解碼,方法是將額外資訊寫入預寫記錄檔 (WAL)。

在 Cloud SQL 中,只要將 cloudsql.logical_decoding 旗標設為 on,即可啟用這項功能。這項設定與標準 PostgreSQL 中使用的設定不同。如要變更外部 PostgreSQL 執行個體,請將 wal_level 設定參數設為 logical,啟用這項功能。

如要使用 pglogical 擴充功能,請務必將 pglogical 新增至 shared_preload_libraries。Cloud SQL 不允許直接修改這個旗標,因此請將 cloudsql.enable_pglogical 設為 on,啟用 pglogical。(在 VM 上,sudo apt-get install postgresql-13-pglogical),然後重新啟動資料庫。

如果您使用 pglogical 在兩個 PostgreSQL 執行個體之間複製資料,則只需在「主要」執行個體上啟用邏輯解碼,不必在副本執行個體上啟用 (除非該執行個體本身是其他副本的主要執行個體)。不過,兩個執行個體都必須啟用 pglogical 擴充功能。如需「主要」和「副本」一詞的使用方式和含義範例,請參閱「關於 Cloud SQL 中的複製功能」。

啟用網路連線

確認主要執行個體接受來自副本執行個體的連線。

主要 備用資源 設定
Cloud SQL (公開 IP) Cloud SQL (公開 IP) 將副本的傳出 IP 位址新增至主要執行個體的授權網路。
Cloud SQL (私人 IP) Cloud SQL (私人 IP) 如果兩個執行個體位於同一個 Cloud de Confiance 專案,請將副本虛擬私有雲網路的分配 IP 範圍,新增至託管執行個體的授權網路。

如要在 Cloud de Confiance 控制台查看分配的 IP 範圍,請按照下列步驟操作:

  1. 前往「VPC networks」(虛擬私有雲網路) 頁面。
  2. 選取您使用的虛擬私有雲網路。
  3. 選取 [Private service connection] (私人服務連線) 分頁標籤。
  4. 選取「Allocated IP ranges」(已分配的 IP 範圍) 分頁標籤。
外部 Cloud SQL 您可以使用資料庫遷移服務。
Cloud SQL 外部 詳情請參閱「設定外部副本」。

取得副本執行個體的傳出 IP 位址

如果副本執行個體是 Cloud SQL 執行個體,且具有公開 IP 位址,請執行下列步驟,取得其傳出 IP 位址。

控制台

  1. 開啟「Cloud SQL 執行個體」頁面。

  2. 將滑鼠游標懸停在 Cloud SQL 副本公開 IP 位址旁的「More info」(更多資訊) 工具提示上,然後擷取傳出 IP 位址。請注意,傳出 IP 位址「不是」 Cloud de Confiance 控制台副本主要清單中顯示的 IP 位址。

如果副本執行個體不是 Cloud SQL 執行個體,請參閱相關說明文件。

如要進一步瞭解如何取得執行個體的公開 IP 位址,請參閱「取得 Cloud SQL 副本的傳出 IP 位址」。

gcloud

您可以使用下列 gcloud 指令:

gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"

允許連線

如果主要執行個體是 Cloud SQL 執行個體,您可以將副本的傳出 IP 位址新增為授權網路,允許從該位址存取。

為 PostgreSQL 9.6 以下版本啟用複製連線

如果主要執行個體並非在 Cloud SQL 中執行,且執行的是 PostgreSQL 9.6 以下版本,則必須確保執行個體的 pg_hba.conf 檔案設為接受複製連線。請在該檔案中加入下列程式碼,並僅在初始測試時使用 all all。為提高安全性,請僅限必要的使用者和 IP 位址,如以下範例所示:

host replication all all md5

詳情請參閱「pg_hba.conf 檔案」。

建立複製使用者

如要使用邏輯解碼功能,請建立具有 REPLICATION 屬性的 PostgreSQL 使用者。

範例

CREATE USER replication_user WITH REPLICATION
IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'secret';

或者,您也可以在現有使用者上設定這項屬性:

ALTER USER existing_user WITH REPLICATION;

PostgreSQL 資源

使用邏輯解碼時,主要 PostgreSQL 執行個體上的背景程序會使用所選解碼外掛程式,將 WAL 變更轉換為邏輯變更,並將這些變更轉送至取用者 (甚至可以是非 PostgreSQL 執行個體)。這個背景程序稱為 WAL 傳送器。PostgreSQL 執行個體中可同時運作的 WAL 傳送者數量,受 max_wal_senders 旗標限制。這個旗標預設為 10,上限會隨著 Cloud SQL 執行個體的記憶體線性增加,每 GB 記憶體允許 8 個 WAL 傳送者。

為確保 WAL 區隔在傳送至所有消費者之前不會遭到捨棄,PostgreSQL 會使用邏輯複製運算單元,追蹤哪些資料已傳送至哪些消費者 (以及用於唯讀副本的實體複製運算單元)。PostgreSQL 執行個體可建立的複製運算單元數量,受限於 max_replication_slots 旗標。這個旗標預設為 10,上限會隨著 Cloud SQL 執行個體的記憶體增加而提高,每 GB 記憶體可有 2 到 8 個複製運算單元。

下表顯示 Cloud SQL 執行個體的記憶體上限,與執行個體複製運算單元上限之間的關係。

記憶體上限 (GB)
複製運算單元數量上限
4
10
16
32
32
128
64
256
128
512
256
1024
512
2048
512+
4096

每個消費者通常有一個複製槽和 WAL 傳送器,因此這些旗標應設為大致相等的值。不過,PostgreSQL 建議為 max_wal_senders 提供少量緩衝區,以便在連線意外中斷並建立新連線時進行處理。Cloud SQL 唯讀副本使用的實體複製作業,也會使用複製槽和 WAL 傳送器,因此在計算每項資源的需求量時,請一併計入這些資源。

PostgreSQL 原生邏輯複製和 pglogical 需要額外的背景程序,才能在主要和副本執行個體上執行。可執行的背景程序數量受 max_worker_processes 旗標限制。預設值為 8,上限會隨著 Cloud SQL 執行個體的記憶體線性增加,每 GB 記憶體可增加兩個程序。這些方法使用的確切工作站程序數量,會在各自的章節中說明。

如果這個旗標設得太低,且複製失敗,記錄中顯示 worker registration failed 錯誤訊息,您可能需要提高 max_worker_processes 設定。

請注意,WAL 傳送器不算工作站程序。為平行查詢執行作業產生的 worker 會計入,因此如果 max_worker_processes 的值設得太低,PostgreSQL 就無法運用平行查詢執行作業,效能可能會降低。

您可以使用 pg_ls_waldir () 函式,判斷 WAL 磁碟用量。這項功能僅限 cloudsqlsuperuser 使用者 (例如預設管理員使用者 postgres) 使用。這項函式僅適用於 PostgreSQL 10 以上版本。

如要計算 WAL 磁碟總用量,請按照下列步驟操作:

postgres=> select * from pg_ls_waldir();
名稱 大小 修改
00000001000000000000000A 16777216 2021-08-11 15:16:49+00
000000010000000000000009 16777216 2021-08-12 06:23:24+00

(2 列)

postgres=> select pg_size_pretty(sum(size)) as "Total WAL disk usage" from pg_ls_waldir();
WAL 磁碟總用量
32 MB

(1 列)

使用外部副本設定邏輯複製

如需使用 pglogical 和邏輯解碼的完整範例,請參閱「設定外部副本」。

使用 pglogical 設定邏輯複製功能

如要使用 pglogical 設定邏輯複製功能,必須在主要執行個體上啟用邏輯解碼。在 Cloud SQL 執行個體上設定 cloudsql.logical_decoding=on,或在外部執行個體上設定 wal_level=logical。此外,主要和副本執行個體都必須啟用 pglogical;請在 Cloud SQL 執行個體上設定 cloudsql.enable_pglogical=on,或在外部執行個體上將 pglogical 新增至 shared_preload_libraries。請注意,變更這些旗標時,必須重新啟動主要和副本執行個體。

如果執行這些步驟時遇到問題,請參閱「排解 pglogical 問題」。

建立具備複製權限的使用者

使用 pglogical 時,您需要具備複製權限和 cloudsqlsuperuser 角色的使用者,同時適用於主要和副本執行個體。下列所有指令都應由該使用者執行。

安裝 pglogical 擴充功能

您必須在主要和副本執行個體上安裝 pglogical 擴充功能。在主要執行個體上,複製使用者 (即連線至資料庫的使用者) 必須安裝該外掛程式。

CREATE EXTENSION pglogical;

在每個執行個體上建立 pglogical 節點

pglogical 節點代表實體 PostgreSQL 執行個體,並儲存該執行個體的連線詳細資料。主要執行個體和副本執行個體都必須註冊為節點。

  1. 在主要執行個體上,連線至要複製的資料庫,並建立供應器節點:

    SELECT pglogical.create_node(
        node_name := '<var>PRIMARY_NODE_NAME</var>',
        dsn := 'host=<var>PRIMARY_IP_ADDRESS</var> port=5432 dbname=<var>SOURCE_DATABASE_NAME</var> user=<var>REPLICATION_USER</var> password=<var>REPLICATION_USER_PASSWORD</var>'
    );
    

    更改下列內容:

    • PRIMARY_NODE_NAME:供應商節點的名稱,例如 primary。
    • PRIMARY_IP_ADDRESS:主要執行個體的 IP 位址。
    • SOURCE_DATABASE_NAME:主要執行個體上要複製的資料庫名稱。
    • REPLICATION_USER:主要執行個體上的複製使用者名稱。
    • REPLICATION_USER_PASSWORD:複製使用者的密碼。
  2. 在副本執行個體上,連線至要複製資料的資料庫,並建立訂閱者節點:

    SELECT pglogical.create_node(
        node_name := '<var>REPLICA_NODE_NAME</var>',
        dsn := 'host=<var>REPLICA_IP_ADDRESS</var> port=5432 dbname=<var>DESTINATION_DATABASE_NAME</var> user=<var>REPLICATION_USER</var> password=<var>REPLICATION_USER_PASSWORD</var>'
    );
    

    更改下列內容:

    • REPLICA_NODE_NAME:訂閱者節點的名稱,例如 replica。
    • REPLICA_IP_ADDRESS:副本執行個體的 IP 位址。
    • DESTINATION_DATABASE_NAME:副本執行個體上要複製資料的目標資料庫名稱。
    • REPLICATION_USER::副本執行個體上的複製作業使用者名稱。
    • REPLICATION_USER_PASSWORD:複製使用者的密碼。

建立資料表,並填入要複製的資料

pglogical 擴充功能可讓您只將部分資料表複製到目的地。舉例來說,在主要執行個體上建立測試資料表,並填入資料:

CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');

此外,也必須在副本執行個體上建立資料表。

將資料表新增至複製集

為支援將不同資料集複製到不同目的地,pglogical 會使用複製集。將測試資料表新增至預設複製集:

SELECT pglogical.replication_set_add_table('default', 'replica_test', true);

建立 pglogical 訂閱項目

提供主要執行個體的連線詳細資料,在目的地執行個體上建立 pglogical 訂閱項目。

SELECT pglogical.create_subscription(
    subscription_name := '<var>SUBSCRIPTION_NAME</var>',
    provider_dsn := 'host=<var>PRIMARY_IP_ADDRESS</var> port=5432 dbname=<var>SOURCE_DATABASE_NAME</var> user=<var>REPLICATION_USER</var> password=<var>REPLICATION_USER_PASSWORD</var>'
);

SELECT * FROM pglogical.show_subscription_status('<var>SUBSCRIPTION_NAME</var>');

更改下列內容:

  • SUBSCRIPTION_NAME:訂閱項目的名稱,例如 test_sub。
  • PRIMARY_IP_ADDRESS:主要執行個體的 IP 位址。
  • SOURCE_DATABASE_NAME:主要執行個體上要複製的資料庫名稱。
  • REPLICATION_USER:主要執行個體上的複製使用者名稱。
  • REPLICATION_USER_PASSWORD:複製使用者的密碼。

如果狀態顯示為「正在複製」,表示設定成功。查詢 replica_test 資料表,確認資料已複製。在主要執行個體上插入及修改記錄,並確認這些記錄會顯示在副本執行個體上。

在主要執行個體中,查詢 pg_replication_slots 資料表,查看訂閱項目建立的複製槽。

清除所用資源

測試成功後,請使用 pglogical.drop_subscription('test_sub') 捨棄副本上的訂閱項目。確認主要執行個體上的複製槽也已刪除。否則,WAL 區段會繼續在副本執行個體上累積。

如要進一步瞭解複製集、部分資料複製、DDL 複製、其他進階設定和限制,請參閱 pglogical 說明文件。

資源使用情況

pglogical 擴充功能會執行多個背景程序,這些程序會計入 max_worker_processes 限制。

在穩定狀態下,啟用時會執行一個「supervisor」程序、每個已安裝擴充功能的 PostgreSQL 資料庫會執行一個「manager」程序 (例如,可能有 D 個),以及副本執行個體上的每個 pglogical 訂閱會執行一個「apply」程序 (例如,可能有 S 個)。不過,擴充功能在執行初始同步處理時,可能會產生額外的 worker 程序,而且確實會為執行個體中的「每個」資料庫產生「管理員」程序,但如果資料庫未安裝擴充功能,則會立即結束。

因此,請分配比穩定狀態所需數量稍多的 worker 程序。PostgreSQL 會將 worker 程序用於其他用途,例如平行查詢處理。如果 max_worker_processes 設定過低,複製作業可能會失敗,但不會顯示任何訊息,或者 PostgreSQL 可能無法執行平行查詢處理。

總之,建議您採用下列設定:

max_worker_processes
  >= 1 + D + 8 (on the source instance)
  >= 1 + D + S + 8 (on the destination instance)
max_wal_senders >= S + 2 (on the source instance)
max_replication_slots >= S (on the source instance)

疑難排解 pglogical 問題

無法建立 pglogical 擴充功能

嘗試安裝 pglogical 擴充功能時,可能會看到以下錯誤訊息:

ERROR:  pglogical is not in shared_preload_libraries

在 Cloud SQL 執行個體上安裝 pglogical 時,請務必設定 cloudsql.enable_pglogical=on。如果使用外部執行個體,請直接將其新增至 shared_preload_libraries 旗標,例如 shared_preload_libraries=pg_stat_statements,pglogical。必須重新啟動主要執行個體,這些修改才會生效。

無法建立 pglogical 訂閱項目

建立訂閱項目時,pglogical 會先檢查是否能使用連線詳細資料連至執行個體。系統會先嘗試建立一般連線,如果失敗,就會發生錯誤:ERROR: could not connect to the postgresql server。

如果發生這項錯誤,請確認主要執行個體已設為允許來自副本執行個體的連線,並確認您提供的連線詳細資料正確無誤。系統會提供其他詳細資料,說明 PostgreSQL 無法建立連線的原因。

建立一般連線後,pglogical 會嘗試建立特殊複製連線。在 PostgreSQL 9.6 以下版本中,這類連線可能會有不同的驗證設定。如果看到以下錯誤,請更新來源執行個體上的 pg_hba.conf 檔案:ERROR: could not connect to the postgresql server in replication mode。

Cloud SQL 使用的 pg_hba.conf 檔案已完成必要變更,只有在連線至非 Cloud SQL 代管的外部執行個體時,才會發生這項錯誤。

或者,如果來源執行個體不允許足夠的 WAL 傳送者,複寫模式連線可能會失敗。如果看到 FATAL: number of requested standby connections exceeds max_wal_senders,請增加主要執行個體的 max_wal_senders。

pglogical 訂閱項目已停止運作

pglogical 訂閱項目可能無法複製。如要解決這個問題,請先確認副本執行個體上是否有背景程序正在執行。查詢 pg_stat_activity,確認 pglogical apply 程序正在執行。如果沒有,請檢查目的地節點的記錄。如果看到 worker registration failed, 訊息,可以調高 max_worker_processes 設定。

接著,確認主要執行個體上已建立複製槽。在副本執行個體上,pglogical.subscription 中的資料列包含訂閱項目嘗試建立的運算單元名稱,在主要執行個體上,您可以查詢 pg_replication_slots,確認運算單元已成功建立。

如果未建立任何複製槽,請檢查主要執行個體的記錄。

如果發生 ERROR: logical decoding requires wal_level >= logical 錯誤,表示 wal_level 旗標未設為 logical。如要解決這個問題,請在主要執行個體 (如果是 Cloud SQL 執行個體) 上設定 cloudsql.logical_decoding=on。

或者,如果執行個體是外部執行個體,請設定 wal_level=logical。

否則,您可能會看到 ERROR: all replication slots are in use,以及實用的 HINT: Free one or increase max_replication_slots。

設定原生 PostgreSQL 邏輯複製

自 PostgreSQL 10 起,PostgreSQL 支援原生內建邏輯複製功能。如要設定原生邏輯複製,必須在主要執行個體上啟用邏輯解碼,方法是在 Cloud SQL 執行個體上設定 cloudsql.logical_decoding=on,或在外部執行個體上設定 wal_level=logical。請注意,修改這些旗標後,必須重新啟動主要執行個體。

請參閱「設定 PostgreSQL 執行個體」中的各節,確保執行個體已正確設定 (網路連線等)。本頁提供概念驗證的步驟。如果按照這些章節的步驟操作時遇到任何問題,請參閱「排解 pglogical 問題」。詳情請參閱 PostgreSQL 說明文件中的「邏輯複製」一節。

建立資料表,並填入要複製的資料

原生 PostgreSQL 邏輯複製支援整個資料庫或個別資料表。舉例來說,我們會在主要執行個體上建立虛擬資料表,並填入資料進行測試。

CREATE TABLE native_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO native_test (data) VALUES ('apple'), ('banana'), ('cherry');

此外,也必須在副本執行個體上建立資料表。

在主要執行個體上建立發布項目

原生 PostgreSQL 邏輯複製會處理發布者和訂閱者。在 native_test 中建立資料發布作業:

CREATE PUBLICATION pub FOR TABLE native_test;

在副本執行個體上建立訂閱項目

以下是在副本執行個體上建立訂閱項目的範例:

CREATE SUBSCRIPTION sub
    CONNECTION 'host=<primary-ip> port=5432 dbname=postgres user=replication_user password=replicapassword'
    PUBLICATION pub;

您必須具備 cloudsqlsuperuser 角色,才能在副本執行個體上建立訂閱項目。建立訂閱項目後,請查詢 native_test 資料表,確認資料已顯示在副本執行個體中。

在主要執行個體上,您可以查詢 pg_replication_slots 資料表,查看訂閱項目建立的複製槽。

清除所用資源

測試成功後,請使用 DROP SUBSCRIPTION sub; 捨棄副本上的訂閱項目。確認主要執行個體上的複製槽也已刪除。否則 WAL 區隔會繼續在主要執行個體上累積。

原生 PostgreSQL 邏輯複製功能的限制

無法存取 pg_subscription 系統資料表的 subconninfo 資料欄。

執行 pg_dump 時,系統會檢查連線使用者是否具備超級使用者權限,因此無法傾印訂閱項目的相關資訊。

接收解碼的 WAL 變更,用於變更資料擷取 (CDC)

做為 CDC 的替代用途,邏輯解碼可以從 PostgreSQL 執行個體串流變更。這項作業的標準工具是 pg_recvlogical。

您可以使用 pg_recvlogical 工具建立複製槽,並串流該槽追蹤的變更。變更格式取決於您選擇的解碼外掛程式。例如:

建立複製運算單元

如要建立複製槽,請執行:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --create-slot \
  -P <decoder_plugin>

串流變更

在 Cloud Shell 終端機執行下列指令:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --start \
  -f -

在另一個 Cloud Shell 終端機中,連線至資料庫並執行下列指令:

CREATE TABLE cdc_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO cdc_test (data) VALUES ('apple', 'banana');
UPDATE cdc_test SET data = 'cherry' WHERE id = 2;
DELETE FROM cdc_test WHERE id = 1;
DROP TABLE cdc_test;

如果您使用的是 wal2json 解碼器外掛程式,第一個 Cloud Shell 終端機會顯示類似下方的輸出內容:

{"change":[]}
{"change":[{"kind":"insert","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[1,"apple"]},{"kind":"insert","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[2,"banana"]}]}
{"change":[{"kind":"update","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[2,"cherry"],"oldkeys":{"keynames":["id"],"keytypes":["integer"],"keyvalues":[2]}}]}
{"change":[{"kind":"delete","schema":"public","table":"cdc_test","oldkeys":{"keynames":["id"],"keytypes":["integer"],"keyvalues":[1]}}]}
{"change":[]}

如果您使用的是 test_decoding 解碼器外掛程式,第一個 Cloud Shell 終端機會顯示類似下方的輸出內容:

BEGIN 19460
COMMIT 19460
BEGIN 19461
table public.cdc_test: INSERT: id[integer]:1 data[text]:'apple'
table public.cdc_test: INSERT: id[integer]:2 data[text]:'banana'
COMMIT 19461
BEGIN 19462
table public.cdc_test: UPDATE: id[integer]:2 data[text]:'cherry'
COMMIT 19462
BEGIN 19463
table public.cdc_test: DELETE: id[integer]:1
COMMIT 19463
BEGIN 19464
COMMIT 19464

(您的交易 ID 可能不同)。

清除所用資源

測試完成後,請執行下列指令,捨棄您建立的複製運算單元:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --drop-slot

注意事項與限制

本節中的附註和限制適用於 PostgreSQL 適用的 Cloud SQL 邏輯複製和解碼功能。

  • 使用高可用性 (HA) 的執行個體沒有一致的傳出 IP 位址,因此無法做為複製訂閱者。

  • 如果執行個體已啟用連接器強制執行功能,則無法使用 pglogical 擴充功能。這項限制不適用於已設定私人服務存取權的執行個體。

  • 如果執行個體已啟用 cloudsql.logical_decoding 或 cloudsql.enable_pglogical,且目前是邏輯複製作業的發布者,您必須先停用所有目標執行個體的複製作業,才能還原該執行個體。否則,還原至執行個體會失敗並顯示錯誤,但目前無法查看錯誤詳細資料。

  • 如果還原的執行個體備份在備份時已啟用 cloudsql.logical_decoding 或 cloudsql.enable_pglogical,且您要將其還原至新的執行個體,則複製狀態不會還原至新的執行個體。之後必須手動重新設定複製作業。

  • 在具有一或多個 Cloud SQL 唯讀副本 (使用實體複製) 的 Cloud SQL 執行個體上,如果啟用 cloudsql.logical_decoding 或 cloudsql.enable_pglogical,這些旗標也會在唯讀副本上啟用。

    • 如果是 PostgreSQL 適用的 Cloud SQL 15 以下版本,Cloud SQL 唯讀副本執行個體無法做為邏輯複製的發布者,因為 PostgreSQL 不支援在這些舊版本的唯讀副本上進行邏輯解碼。不過,為了確保執行個體在升級時能做為主要執行個體的替代方案,這些舊版本的唯讀副本執行個體仍會啟用邏輯旗標。

    • 從 PostgreSQL 適用的 Cloud SQL 16 版開始,如果主要執行個體已設定邏輯旗標,Cloud SQL 唯讀副本執行個體就能做為邏輯複製的發布者。邏輯訂閱者可以是 Cloud SQL 執行個體或外部執行個體。不過,在主要執行個體上刪除資料列和執行 vacuum 作業,可能會刪除唯讀副本上邏輯解碼仍需要的元組。在這種情況下,唯讀副本上的邏輯複製運算單元會失效,以免發生不一致的情況。

    • 在主要執行個體上啟用 cloudsql.logical_decoding 或 cloudsql.enable_pglogical,會導致所有唯讀副本也啟用這些旗標,進而導致主要執行個體和唯讀副本在短時間內接連重新啟動。如要避免這種情況,並控制每個執行個體的重新啟動時間,您可以 (1) 依序設定每個唯讀副本的旗標,然後 (2) 設定主要執行個體的旗標。

    • 在主要執行個體上停用 cloudsql.logical_decoding 或 cloudsql.enable_pglogical,不會導致所有唯讀副本停用這些旗標。如要停用執行個體中的旗標,您必須執行上述步驟的反向操作:(1) 停用主要執行個體中的旗標,然後 (2) 依序停用每個唯讀副本中的旗標。