設定外部備用資源
本頁說明如何使用
logical decoding
和
pglogical 擴充功能,設定 Cloud SQL 執行個體,將資料複製到 Cloud SQL 外部的備用資源。
如要進一步瞭解複製作業,請參閱關於 Cloud SQL 中的複製作業。
設定外部備用資源設定
事前準備
開始這項工作前,您必須擁有符合外部副本需求的 Cloud SQL 執行個體和外部 PostgreSQL 執行個體。
來源執行個體需求
外部唯讀備用資源的來源執行個體必須是主要或獨立執行個體。您無法使用 Cloud SQL 唯讀備用資源做為外部唯讀備用資源的來源執行個體。有時會從主要執行個體的磁碟複製項重新建立唯讀備用資源,且唯讀備用資源無法維護其與外部唯讀備用資源的複製狀態。
- 前往 Trusted Cloud 控制台的 Cloud SQL 執行個體頁面。
- 在主要執行個體上,為外部副本的 IP 位址啟用存取權。
如要瞭解如何啟用 IP 存取權,請參閱「設定 IP 連線存取權」。
- 請記下主要執行個體的公開 IP 位址和公開傳出 IP 位址,稍後會用到。您可以在執行個體的「總覽」頁面找到這些值。
- 按一下右上角的 Cloud Shell 圖示
。
- 在 Cloud Shell 提示中,使用內建的 PostgreSQL 用戶端連線至主要執行個體:
gcloud sql connect PRIMARY_INSTANCE_NAME \
--user=postgres
- 輸入根密碼。接著應該會看到 postgres 提示。
- 建立具有
REPLICATION
屬性的 PostgreSQL 使用者。
CREATE USER REPLICATION_USER WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
- 安裝及設定 pglogical 擴充功能:
編輯 Cloud SQL 執行個體,新增並設定下列標記:
重新啟動資料庫,然後登入並切換至 replication_user,
建立 pglogical
擴充功能:
CREATE EXTENSION pglogical;
- 建立 pglogical 節點:
pglogical「節點」代表實體 PostgreSQL 執行個體,並儲存該執行個體的連線詳細資料。
SELECT pglogical.create_node(
node_name := 'provider',
dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
);
- 如果您要從新的資料庫開始,請在主要和副本執行個體上建立相同的資料庫和資料表。例如:
CREATE DATABASE test;
\connect test;
CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
CREATE EXTENSION pglogical;
- 如果主要執行個體上已有資料庫,您必須在副本上建立相同的資料庫。如要這麼做,請將主要執行個體的資料庫匯出至 Cloud Storage 值區,然後匯入副本。進一步瞭解如何
將 Cloud SQL 的資料匯出至 Cloud Storage 中的 SQL 傾印檔案。
-
為支援將不同資料集複製到不同目的地,pglogical 採用了複製集的概念。舉例來說,如要將資料表新增至預設複寫集:
SELECT pglogical.replication_set_add_table('default', 'replica_test', true);
- 建立複製專用使用者,並授予複製權限:
CREATE USER REPLICATION_USER WITH REPLICATION SUPERUSER LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
- 如果您要從新的資料庫開始,請使用 REPLICATION_USER 在主要和副本執行個體上建立相同的資料庫和資料表。例如:
CREATE DATABASE test;
\connect test;
CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
- 如果您要使用從主要執行個體匯出的檔案,為外部副本執行個體植入資料,請從 Cloud Storage 下載匯出的檔案。如果外部副本位於 Compute Engine 執行個體上,您可以使用
gcloud storage
指令下載檔案:
gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .
- 將檔案匯入資料庫。
psql --user=postgres --password < DUMP_FILE_NAME.
- 請根據作業系統安裝「
pglogical
」。舉例來說,在執行 PostgreSQL 13 版的 Debian 系統上,sudo apt-get install postgresql-13-pglogical
。
- 以 replication_user 身分登入資料庫,並設定下列參數:
ALTER SYSTEM SET shared_preload_libraries = 'pglogical';
ALTER SYSTEM SET max_replication_slots = #; (where # is the same as you set on the primary).
ALTER SYSTEM SET max_worker_processes = #; (where # is the same as you set on the primary).
# Logout of the database and restart it. For example,
# sudo /etc/init.d/postgresql restart
# Log back in the database as the replication_user.
# Since the pglogical extension is created local to each database, you need to
# execute CREATE EXTENSION pglogical
in each database you create, so if you
# haven't already done that:
CREATE EXTENSION pglogical;
For more information about these flags, see the PostgreSQL resources page.
- 建立 pglogical 節點:
SELECT pglogical.create_node(
node_name := 'subscriber',
dsn := 'host=REPLICA_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
);
- 建立 pglogical 訂閱:
SELECT pglogical.create_subscription(
subscription_name := 'SUBSCRIPTION_NAME',
provider_dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
);
- 查看訂閱狀態:
SELECT * FROM pglogical.show_subscription_status('SUBSCRIPTION_NAME');
- 如果狀態顯示為
replicating
,表示設定成功。
- 在主要資源中插入一些資料,然後檢查備用資源,確認資料是否也出現在該處。
疑難排解
請參閱「
Troubleshooting pglogical」
後續步驟
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-09-03 (世界標準時間)。
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2025-09-03 (世界標準時間)。"],[],[],null,["# Configure external replicas\n\n\u003cbr /\u003e\n\n[MySQL](/sql/docs/mysql/replication/configure-external-replica \"View this page for the MySQL database engine\") \\| PostgreSQL \\| [SQL Server](/sql/docs/sqlserver/replication/configure-external-replica \"View this page for the SQL Server database engine\")\n\n\u003cbr /\u003e\n\nThis page describes how to configure a Cloud SQL instance that replicates to a replica external to Cloud SQL using the [pglogical extension](/sql/docs/postgres/replication/configure-logical-replication) with `logical decoding`.\n\nFor more information about replication, see\n[About replication in Cloud SQL](/sql/docs/postgres/replication).\n\nSet up the external replica configuration\n-----------------------------------------\n\n### Before you begin\n\nBefore you start this task, you must have a Cloud SQL instance and an\nexternal PostgreSQL instance that meets the [requirements for external\nreplicas](/sql/docs/postgres/replication#external-read-replicas).\n\n### Configure the primary instance\n\n1. Go to the [Cloud SQL Instances page](https://console.cloud.google.com/sql/instances) in the Google Cloud console.\n2. Enable access on the primary instance for the IP address of the external replica. For information about enabling IP access, see\n [Configuring access for IP connections](/sql/docs/postgres/configure-ip).\n\n3. Record the public IP address and the public outgoing IP address of the primary instance for later use. You can find these values on the instance's **Overview** page.\n4. Click the Cloud Shell icon in the upper right corner.\n5. At the Cloud Shell prompt, use the built-in PostgreSQL client to connect to your primary instance: \n\n ```bash\n \n gcloud sql connect PRIMARY_INSTANCE_NAME \\\n --user=postgres\n \n \n ```\n6. Enter your root password. You should then see the postgres prompt.\n7. Create a PostgreSQL user with the `REPLICATION` attribute. \n\n CREATE USER \u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD '\u003cvar translate=\"no\"\u003eREPLICATION_USER_PASSWORD\u003c/var\u003e';\n \n8. Install and configure the pglogical extension: Edit the Cloud SQL instance to add and set the following flags:\n\n - `cloudsql.enable_pglogical`\n - `cloudsql.logical_decoding`\n - `max_replication_slots`\n - `max_worker_processes`\n - `max_wal_senders`\n - For more information about these flags, see the [PostgreSQL resources](/sql/docs/postgres/replication/configure-logical-replication#postgresql-resources) page.\n\n Restart the database, then login, change to the replication_user,\n create the `pglogical` extension: \n\n ```sql\n CREATE EXTENSION pglogical;\n \n ```\n9. Create a pglogical node:\n A pglogical _node_ represents a physical PostgreSQL instance, and stores\n connection details for that instance.\n\n ```sql\n SELECT pglogical.create_node(\n node_name := 'provider',\n dsn := 'host=\u003cvar translate=\"no\"\u003ePRIMARY_PUBLIC_IP_ADDRESS\u003c/var\u003e port=5432 dbname=\u003cvar translate=\"no\"\u003eDATABASE_NAME\u003c/var\u003e user=\u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e password=\u003cvar translate=\"no\"\u003eREPLICATION_USER_PASSWORD\u003c/var\u003e'\n );\n \n ```\n10. If you are starting with a new database, create the same database and tables on both the primary and replica instances. For example: \n\n ```sql\n CREATE DATABASE test;\n\n \\connect test;\n\n CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);\n INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');\n\n CREATE EXTENSION pglogical;\n ```\n11. If you already have a database on the primary instance, you must create the same on the replica. To do this, export the database from the primary instance to a Cloud Storage bucket and import it into the replica. Learn more about [Exporting data from Cloud SQL to a SQL dump file in Cloud Storage](/sql/docs/postgres/import-export/exporting#cloud-sql).\n12. To support replicating different sets of data to different destinations, pglogical has the concept of a replication set. For example, to add a table to the default replication set: \n\n ```sql\n SELECT pglogical.replication_set_add_table('default', 'replica_test', true);\n \n ```\n\n### Configure the external replica\n\n1. Create a special user for replication and grant replication privileges: \n\n CREATE USER \u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e WITH REPLICATION SUPERUSER LOGIN PASSWORD '\u003cvar translate=\"no\"\u003eREPLICATION_USER_PASSWORD\u003c/var\u003e';\n \n2. If you are starting with a new database, use the \u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e to create the same database and tables on both the primary and replica instances. For example: \n\n ```sql\n CREATE DATABASE test;\n \\connect test;\n CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);\n INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');\n \n ```\n3. If you are seeding the external replica instance with a file you exported file from the primary instance, download the exported file from Cloud Storage. If your external replica is on a Compute Engine instance, you can download the file using the `gcloud storage` command: \n\n ```bash\n gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .\n \n ```\n4. Import the file into your database. \n\n ```\n psql --user=postgres --password \u003c DUMP_FILE_NAME.\n ```\n5. Install `pglogical` according to your OS. For example, on Debian systems running PostgreSQL version 13, `sudo apt-get install postgresql-13-pglogical`.\n6. Login to the database as the replication_user and set the following parameters: \n\n ALTER SYSTEM SET shared_preload_libraries = 'pglogical';\n ALTER SYSTEM SET max_replication_slots = #; (where # is the same as you set on the primary).\n ALTER SYSTEM SET max_worker_processes = #; (where # is the same as you set on the primary).\n # Logout of the database and restart it. For example,\n # sudo /etc/init.d/postgresql restart\n # Log back in the database as the replication_user.\n # Since the pglogical extension is created local to each database, you need to\n # execute CREATE EXTENSION pglogical in each database you create, so if you\n # haven't already done that:\n CREATE EXTENSION pglogical;\n For more information about these flags, see the /sql/docs/postgres/replication/configure-logical-replication#postgresql-resources page.\n \n7. Create a pglogical node: \n\n ```sql\n SELECT pglogical.create_node(\n node_name := 'subscriber',\n dsn := 'host=\u003cvar translate=\"no\"\u003eREPLICA_PUBLIC_IP_ADDRESS\u003c/var\u003e port=5432 dbname=\u003cvar translate=\"no\"\u003eDATABASE_NAME\u003c/var\u003e user=\u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e password=\u003cvar translate=\"no\"\u003eREPLICATION_USER_PASSWORD\u003c/var\u003e'\n );\n \n ```\n8. Create a pglogical subscription: \n\n ```sql\n SELECT pglogical.create_subscription(\n subscription_name := '\u003cvar translate=\"no\"\u003eSUBSCRIPTION_NAME\u003c/var\u003e',\n provider_dsn := 'host=\u003cvar translate=\"no\"\u003ePRIMARY_PUBLIC_IP_ADDRESS\u003c/var\u003e port=5432 dbname=\u003cvar translate=\"no\"\u003eDATABASE_NAME\u003c/var\u003e user=\u003cvar translate=\"no\"\u003eREPLICATION_USER\u003c/var\u003e password=\u003cvar translate=\"no\"\u003eREPLICATION_USER_PASSWORD\u003c/var\u003e'\n );\n \n ```\n9. Check the status of the subscription: \n\n ```sql\n SELECT * FROM pglogical.show_subscription_status('\u003cvar translate=\"no\"\u003eSUBSCRIPTION_NAME\u003c/var\u003e');\n \n ```\n10. If the status appears as `replicating`, then the setup is successful.\n11. Insert some data into the primary and check the replica to make sure the data appears there as well.\n\nTroubleshoot\n------------\n\nSee [Troubleshooting pglogical](/sql/docs/postgres/replication/configure-logical-replication#troubleshooting-pglogical)\n\nWhat's next\n-----------\n\n- Learn how to [manage replicas](/sql/docs/postgres/replication/manage-replicas).\n- Learn about [requirements and best practices for the external replica configuration](/sql/docs/postgres/replication#external-read-replicas).\n- Learn more about [PostgreSQL replication](https://www.postgresql.org/docs/current/static/logical-replication.html).\n- Learn more about [replication configuration settings](https://www.postgresql.org/docs/current/static/runtime-config-replication.html).\n- Learn more about [replicating from an external server](/sql/docs/postgres/replication/replication-from-external)."]]