配置 Cloud SQL 和外部服务器以进行复制

本页面介绍了如何配置用于复制到 Cloud SQL 的外部服务器,在 Cloud SQL 上创建源表示形式实例,以及将数据复制到 Cloud SQL。您需要先完成本页面上的所有步骤,然后才能继续执行复制步骤。

本页面中介绍的步骤的替代方案是数据库迁移服务,该服务提供从外部服务器到 Cloud SQL 的持续复制或一次性数据库迁移。

准备工作

术语

  • 外部服务器。您要从中复制数据的 Cloud SQL 外部的 PostgreSQL 服务器。它也称为源数据库或外部数据库服务器。它可以是另一个 Cloud SQL 实例或任何其他数据库服务器,例如本地、Amazon Relational Database Service (RDS) 等。

  • 源表示形式实例Cloud SQL 实例的模拟,表示要连接到 Cloud SQL 副本的外部服务器。该实例会显示在 Google Cloud 控制台中,看起来像常规 Cloud SQL 实例,但不包含数据,不需要配置或维护,也不会影响结算。

  • Cloud SQL 副本。从外部服务器复制的 Cloud SQL 实例。也称为外部主服务器读取副本。

  • 复制用户账号。外部服务器上的 PostgreSQL 用户账号,它具有足够的权限,可以在外部服务器和 Cloud SQL 副本之间进行复制。

  • 代管式导入。将数据从外部服务器直接导入 Cloud SQL 副本的过程。在这种情况下,Cloud SQL 使用复制用户账号连接到外部服务器,并直接在外部服务器上运行数据转储以将数据导入到 Cloud SQL 副本中。

设置 Google Cloud 项目

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud SQL Admin API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud SQL Admin API.

    Enable the API

  8. 确保您的用户账号具有 Cloud SQL Admin、Storage Admin、Compute Viewer 角色。

    转到 IAM 页面

安装 Google Cloud SDK

如需配置复制,请为您的外部服务器安装 Google Cloud SDK。除非已在其他位置安装 SDK,否则您可能需要在外部服务器上安装该 SDK。

设置外部服务器以进行复制

Cloud SQL 支持从源数据库到 Cloud SQL 目标数据库的持续迁移。

PostgreSQL 支持的源数据库包括:

  • (在本地或由您完全控制的任何云虚拟机上)自行管理的 PostgreSQL 9.4、9.5、9.6、10、11、12、13、14、15 和 16
  • Amazon RDS 9.6.10+、10.5+、11.1+、12、13、14、15 和 16
  • Amazon Aurora 10.11+、11.6+、12.4+、13.3+、14、15 和 16
  • Cloud SQL 9.6、10、11、12、13、14、15 和 16

配置来源需要同时配置源实例和底层源数据库。

外部服务器核对清单

如果因为传出专用 IP 地址不是静态的而使用专用 IP 地址启用了 Cloud SQL 副本,请配置外部服务器的防火墙以允许为 VPC 网络(Cloud SQL 副本将其用作专用网络)的专用服务访问通道分配的内部 IP 地址范围。

源数据库服务器的防火墙必须配置为允许为 VPC 网络(Cloud SQL 目标实例将其用作 ipConfiguration 设置privateNetwork 字段)的专用服务连接分配的整个内部 IP 地址范围

如需查找内部 IP 范围,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到“VPC 网络”页面

  2. 选择要使用的 VPC 网络。

  3. 点击专用服务连接标签页。

配置源实例

如需配置源实例,请按照下列步骤操作:

  1. 如果源实例不包含 postgres 数据库,请创建一个。
  2. 在源实例上安装 pglogical 软件包
  3. 根据需要设置以下参数。

    如果源 PostgreSQL 实例是 Amazon RDS,请将这些参数添加到新参数组中,并将参数组挂接到实例。

    • 如果源是 Cloud SQL,请将 cloudsql.logical_decodingcloudsql.enable_pglogical 标志设置为 on

      如需在 Cloud SQL 中启用标志,请参阅配置数据库标志

    • 使用以下命令将 shared_preload_libraries 设置为包含 pglogical

      ALTER SYSTEM SET shared_preload_libraries = 'pglogical';
            
    • 使用以下命令将 wal_level 设置为 logical

          ALTER SYSTEM SET wal_level = 'logical';
          

      如果源 PostgreSQL 实例为 Amazon RDS,要在 logical 级层启用 WAL 日志,请将 rds.logical_replication 参数设置为 1

    • 使用以下命令将 wal_sender_timeout 设置为 0

      ALTER SYSTEM SET wal_sender_timeout = 0;

      0 可停用用于终止非活跃复制连接的超时机制。

    • max_replication_slots 设置为源实例可以支持的复制槽数上限。在将 # 替换为数字后,使用以下命令:

      ALTER SYSTEM SET max_replication_slots = #;

      对于每个迁移的数据库,Cloud SQL 都需要一个槽。至少指定预期连接的订阅数,并预留一部分进行表同步。

      例如,如果源实例有 5 个数据库且为源创建了 2 个迁移作业,那么除了您已经使用的复制槽数量之外,复制槽的数量必须至少为 5 * 2 = 10。

    • 除了已在实例上使用的发送器数量之外,应将 max_wal_senders 设置为至少与 max_replication_slots 相同。使用以下命令,将 # 替换为同时运行的 WAL 发送器进程总数:

      ALTER SYSTEM SET max_wal_senders = #;

      例如,如果 max_replication_slots 参数设置为 10,并且您已经使用 2 个发送器,则同时运行的 WAL 发送器进程的数量将为 10 + 2 = 12。

    • 除了已在实例上使用的工作器进程数量之外,应至少将源实例中的数据库数量设置为 max_worker_processes。在将 # 替换为总数后,使用以下命令:

      ALTER SYSTEM SET max_worker_processes = #;
  4. 您在此步骤中设置的参数适用于正在运行的 PostgreSQL 数据库服务器。您还可以通过在 postgresql.conf 文件中添加这些更改来使它们持久不变。

  5. 如果 Cloud SQL 副本将使用专用 IP,对于副本的 VPC 网络,请将外部服务器的防火墙配置为允许为其专用服务访问通道分配的内部 IP 范围。
  6. 如需应用配置更改,请重启源实例。

为 9.6 之前的 PostgreSQL 版本启用复制延迟监控

如果您要从低于 9.6 的 PostgreSQL 版本进行迁移,则复制延迟指标默认不可用。您可以使用三种备选方法中的其中一种来跟踪此指标,以便在升级数据库时确保将停机时间控制在最短。

  • 选项 1:启用 Cloud SQL 外部服务器,通过授予对特定查询的访问权限来跟踪复制延迟。使用具有 SUPERUSER 权限的用户执行下列操作:

    1. 定义以下函数,以允许外部服务器查询复制延迟。

      CREATE OR REPLACE FUNCTION pg_stat_replication_user()
      RETURNS TABLE (
      pid               integer                  ,
      usesysid          oid                      ,
      username          name                    ,
      application_name  text                     ,
      client_addr       inet                     ,
      client_hostname   text                     ,
      client_port       integer                  ,
      backend_start     timestamp with time zone ,
      backend_xmin      xid                      ,
      state             text                     ,
      sent_location     pg_lsn                   ,
      write_location    pg_lsn                   ,
      flush_location    pg_lsn                   ,
      replay_location   pg_lsn                   ,
      sync_priority     integer                  ,
      sync_state        text
      )
      LANGUAGE SQL
      SECURITY DEFINER
      AS $$
       SELECT *
       FROM pg_catalog.pg_stat_replication;
      $$;
      
    2. 运行以下命令,向用户授予 EXECUTE 权限:

      1. REVOKE EXECUTE ON FUNCTION pg_stat_replication_user() FROM public;
      2. GRANT EXECUTE ON FUNCTION pg_stat_replication_user() to {replication_user};
  • 方法 2:直接将 SUPERUSER 权限授予用于连接到源实例的用户。这样,外部服务器就可以直接读取复制延迟。

  • 方法 3:使用以下查询独立跟踪复制延迟:

        SELECT current_timestamp, application_name,
        pg_xlog_location_diff(pg_current_xlog_location(), pg_stat_replication.sent_location) AS sent_location_lag,
        pg_xlog_location_diff(pg_current_xlog_location(), pg_stat_replication.write_location) AS write_location_lag,
        pg_xlog_location_diff(pg_current_xlog_location(), pg_stat_replication.flush_location) AS flush_location_lag,
        pg_xlog_location_diff(pg_current_xlog_location(), pg_stat_replication.replay_location) AS replay_location_lag
        FROM pg_stat_replication
        WHERE application_name like 'cloudsql%';
      

    在此选项中,Cloud SQL 不会反映图表或 API 响应中的复制延迟指标。

配置源数据库

Cloud SQL 外部服务器会迁移源实例下除以下数据库之外的所有数据库:

  • 对于本地源:模板数据库 template0template1
  • 对于 Amazon RDS 源:template0template1rdsadmin
  • 对于 Cloud SQL 源:模板数据库 template0template1

对源实例中未包含在上述列表中的每个数据库执行以下操作:

  1. 要安装 pglogical 扩展程序,请对源实例中的每个数据库运行以下命令:

    CREATE EXTENSION IF NOT EXISTS pglogical

    对于没有主键的表,Cloud SQL 支持在变更数据捕获 (CDC) 阶段迁移初始快照和 INSERT 语句。手动迁移 UPDATEDELETE 语句。

  2. 连接到实例并运行以下命令,为每个已迁移的数据库以及默认的 postgres 数据库上的用户设置权限。

    您用于连接到源实例的用户被配置为连接配置文件页面中的用户。您可以创建新用户,也可以重复使用现有用户。

    • 在要迁移的每个数据库的所有架构上(信息架构和以 pg_ 开头的架构除外),运行以下命令:

      GRANT USAGE on SCHEMA schema to username;
      GRANT SELECT on ALL SEQUENCES in SCHEMA schema to username;
      GRANT SELECT on ALL TABLES in SCHEMA schema to username;
    • 在每个要迁移的数据库上,运行以下命令:

      GRANT USAGE on SCHEMA pglogical to PUBLIC;
    • 要从源数据库获取复制信息,请对所有数据库运行以下命令:

      GRANT SELECT on ALL TABLES in SCHEMA pglogical to username;
    • 如果源是 Amazon RDS,请运行以下命令:

      GRANT rds_replication to username;

      否则,请运行以下命令:

      ALTER USER username with REPLICATION;

设置源表示形式实例

源表示形式实例会引用外部服务器。它仅包含来自外部服务器的请求数据。创建请求数据并在 curl 命令中使用这些数据,该命令会在 Cloud SQL 中创建源表示形式实例。

创建请求数据

请求数据包含 JSON 格式的外部服务器基本信息。您可以为公共或专用网络上的 Cloud SQL 副本配置请求数据,其中应包含以下信息:

source.json

    {
      "name": "SOURCE_NAME",
      "region": "REGION",
      "databaseVersion": "DATABASE_VERSION",
      "onPremisesConfiguration": {
        "hostPort": "SOURCE_HOST",
        "username": "USERNAME",
        "password": "PASSWORD",
        "caCertificate": "SOURCE_CERT",
        "clientCertificate": "CLIENT_CERT",
        "clientKey": "CLIENT_KEY"
      }
    }

代管式导入示例

// example of source.json for external server that
// - initiates replication from a Cloud SQL managed import
// - doesn't use SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "POSTGRES_9_6",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  }
}
属性 说明
SOURCE_NAME 要创建的源表示形式实例的名称。
REGION 源表示形式实例所在的区域
DATABASE_VERSION 外部服务器上运行的数据库版本。选项包括 POSTGRES_9_6POSTGRES_10POSTGRES_11POSTGRES_12POSTGRES_13POSTGRES_14POSTGRES_15POSTGRES_16
SOURCE HOST 外部服务器的 IPv4 地址和端口,或外部服务器的 DNS 地址。 如果外部服务器托管在 Cloud SQL 上,则端口为 5432
USERNAME 外部服务器上的复制用户账号。
PASSWORD 复制用户账号的密码。
BUCKET 包含转储文件的存储桶的名称。 仅当您使用 Cloud Storage 存储桶中存在的转储文件设置复制时,才应包含此字段。
DUMP_FILE 存储桶中包含外部服务器数据的文件。
CLIENT_CA_CERT 外部服务器上的 CA 证书。 仅当外部服务器上使用 SSL/TLS 时,才应包含此字段。
CLIENT_CERT 外部服务器上的客户端证书。仅对服务器-客户端身份验证是必需的。 仅当外部服务器上使用 SSL/TLS 时,才应包含此字段。
CLIENT_KEY 外部服务器上的客户端证书的私钥文件。仅对服务器-客户端身份验证是必需的。 仅当外部服务器上使用 SSL/TLS 时,才应包含此字段。

创建源表示形式实例

在开始此步骤之前,请创建包含源请求数据的 JSON 文件

然后,如需在 Cloud SQL 中创建源表示形式实例,请打开终端并运行以下命令:

curl

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances

示例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./source.json \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances
属性 说明
PROJECT_ID Google Cloud 中的项目 ID。
JSON_PATH 包含外部服务器请求数据的 JSON 文件的路径。

更新源表示形式实例

如果您从外部服务器更新请求数据,则可以更新现有源表示形式实例以使用修改后的值。

修改请求数据

更新请求数据,以包含已更改的所有字段。其中包括 hostPortusernamepasswordcaCertificateclientCertificateclientKey 字段。更新请求数据后,在 curl 命令中使用这些数据更新 Cloud SQL 中的实例。

以下示例展示了如何使用不同用户名和密码更新 usernamepassword 字段:

source.json

    {
      "name": "SOURCE_NAME",
      "region": "REGION",
      "databaseVersion": "DATABASE_VERSION",
      "onPremisesConfiguration": {
        "username": "NEW_USERNAME",
        "password": "NEW_PASSWORD"
      }
    }

代管式导入示例

// example of source.json for external server that
// - initiates replication from a Cloud SQL managed import
// - doesn't use SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "POSTGRES_9_6",
  "onPremisesConfiguration": {
    "username": "newReplicationUser",
    "password": "525#@%*@"
  }
}
属性 说明
SOURCE_NAME 源表示形式实例的名称。
REGION 源表示形式实例所在的区域
DATABASE_VERSION 外部服务器上运行的数据库版本。选项包括 POSTGRES_9_6POSTGRES_10POSTGRES_11POSTGRES_12POSTGRES_13POSTGRES_14POSTGRES_15POSTGRES_16
NEW_USERNAME 外部服务器上的新复制用户账号。
NEW_PASSWORD 新账号的密码。

修改源表示形式实例

在开始执行此步骤之前,请创建一个包含修改后的请求数据的 JSON 文件

然后,如需在 Cloud SQL 中修改源表示形式实例,请打开终端并运行以下命令:

curl

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/SOURCE_NAME

示例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./source.json \
     -X PATCH \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
属性 说明
PROJECT_ID Google Cloud 中的项目 ID。
JSON_PATH 包含外部服务器请求数据的 JSON 文件的路径。
SOURCE_NAME 源表示形式实例的名称。

设置 Cloud SQL 副本

Cloud SQL 副本最终包含来自外部服务器的数据。在此步骤中,您将创建请求数据并在 curl 命令中使用该请求,以在 Cloud SQL 中创建 Cloud SQL 副本。

创建请求数据

请求数据包含 JSON 格式的外部服务器和 Cloud SQL 副本的基本信息。您可以为公共或专用网络上的 Cloud SQL 副本配置请求数据,其中应包含以下信息:

replica.json

    {
        "settings": {
            "tier": "TIER",
            "dataDiskSizeGb": "DISK_SIZE",
            "ipConfiguration": {
                "ipv4Enabled": "PUBLIC_IP_STATUS",
                "privateNetwork": "projects/PROJECT_ID/global/networks/NETWORK_NAME"
             },
             "availabilityType": "AVAILABILITY_TYPE"
        },
        "masterInstanceName": "SOURCE_REPRESENTATION_INSTANCE_NAME",
        "region": "SOURCE_REGION",
        "databaseVersion": "DATABASE_VERSION",
        "name": "REPLICA_NAME"
    }

示例

    {
        "settings": {
            "tier": "db-custom-4-15360",
            "dataDiskSizeGb": "100"
        },
        "masterInstanceName": "source-instance",
        "region": "us-central1",
        "databaseVersion": "POSTGRES_14",
        "name": "replica-instance"
    }
属性 说明
TIER 用于托管副本实例的机器类型。如果您不知道要使用哪种机器类型,请先使用 db-custom-2-7680。您以后可以根据需要更改其大小和其他受支持的值
DISK_SIZE Cloud SQL 副本的存储空间大小(以 GB 为单位)。
PUBLIC_IP_STATUS 确定实例是否分配有公共 IP 地址。默认情况下,此属性的值为 true。如需停用为副本分配公共 IP 地址的功能,请将值设置为 false。如果您的项目已启用 constraints/sql.restrictPublicIp 组织政策,则如需创建 Cloud SQL 副本,您必须将 ipv4Enabled 属性的值设置为 false。如需详细了解如何关闭公共 IP 地址分配功能,请参阅停用公共 IP
PROJECT_ID 如果 Cloud SQL 副本位于专用网络上,请在 replica.json 文件中添加 privateNetwork 属性。对于 PROJECT_ID,请指定您的项目在 Google Cloud 中的 ID。
NETWORK_NAME 要与 Cloud SQL 副本搭配使用的专用网络的名称。
AVAILABILITY_TYPE Cloud SQL 副本的可用性类型。默认情况下,值为 ZONAL。如需使副本具有高可用性,请将值设置为 REGIONAL。如需了解允许的值,请参阅 SqlAvailabilityType
创建外部服务器高可用性副本后,您无法将其更改为非高可用性副本。反之亦然。您不能将外部服务器非高可用性副本更改为高可用性副本。
如果实例仍在加载初始数据,则尝试手动故障转移可能会导致不可恢复的迁移;如果实例已经在从实例进行复制,则会导致临时停机。检查复制状态
SOURCE_REPRESENTATION_INSTANCE_NAME 源表示形式实例的名称。
SOURCE_REGION 分配给源表示形式实例的区域。
DATABASE_VERSION 要与 Cloud SQL 副本搭配使用的数据库版本。此版本的选项包括 POSTGRES_9_6POSTGRES_10POSTGRES_11POSTGRES_12POSTGRES_13POSTGRES_14POSTGRES_15POSTGRES_16。与外部服务器上运行的数据库版本匹配,或将值设置为最多高一个版本。
REPLICA_NAME 要创建的 Cloud SQL 副本的名称。

创建 Cloud SQL 副本

在开始执行此步骤之前,请创建包含副本请求数据的 JSON 文件。然后,要创建 Cloud SQL 副本,请打开 Cloud Shell 终端并运行以下命令:

curl

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances

示例

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./replica.json \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances
属性 说明
PROJECT_ID Google Cloud 中的项目 ID,必须与来源实例的 ID 相同。
JSON_PATH 包含 Cloud SQL 副本请求数据的 JSON 文件的路径。

验证设置

如需确保实例设置正确,请转到“Cloud SQL 实例”页面

您应该在如下所示的列表中看到源表示形式实例和 Cloud SQL 副本:

实例 ID 类型 公共 IP
(-) source-representation-instance 数据库外部主实例 10.68.48.3:5432
replica-instance 数据库读取副本实例 34.66.48.59

此外,请确保您拥有 Cloud SQL 副本的 cloudsql.instances.migrate 权限。此权限包含在 cloudsql.admincloudsql.editor IAM 角色中。

将用户添加到 Cloud SQL 副本

您无法从外部服务器导入数据库用户账号,但可以在 Cloud SQL 副本上创建这些账号。 请在从外部服务器复制之前执行此操作。

获取 Cloud SQL 副本的传出 IP 地址

您可以使用 Cloud SQL 副本的传出 IP 地址在外部服务器和 Cloud SQL 副本之间创建安全连接。系统不会向您收取此 IP 地址的费用。

控制台

如需获取副本的传出 IP 地址,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 在 Cloud SQL 副本的公共 IP 地址旁边,将指针悬停在更多信息提示上,并检索传出 IP 地址。

    请注意,传出 IP 地址不是主列表中显示的 Google Cloud 控制台中副本的 IP 地址。

gcloud

如需获取副本的传出 IP 地址,请运行以下命令:

gcloud sql instances describe REPLICA_NAME --format="default(ipAddresses)"
属性 说明
REPLICA_NAME 您要检索传出公共 IP 地址的 Cloud SQL 副本的名称。

允许在外部服务器上传入的连接

Cloud SQL 副本需要连接到外部服务器才能使复制成功。在以下情况下,您必须为外部服务器配置网络防火墙,以接受来自 Cloud SQL 副本的传出 IP 地址的连接:

  • 外部服务器受防火墙保护或受到其他某个网络限制的约束。
  • 您的 Cloud SQL 副本使用的是公共 IP 地址。

如需连接到 Cloud SQL 副本,请使用该副本的主要 IP 地址。此 IP 地址会显示在 Google Cloud 控制台中。

更新源表示形式实例以允许复制到 Cloud SQL 副本

为 Cloud SQL 副本设置源表示形式实例后,您可能需要更新源表示形式实例。例如,以下场景需要更新您的配置:

  • 外部服务器的主机、端口或 IP 地址发生变化。
  • 您想使用其他 PostgreSQL 复制用户。
  • PostgreSQL 复制用户的密码发生变化。
  • 用于安全连接到外部服务器的 SSL 证书发生变化。

播种 Cloud SQL 副本

如需执行从外部服务器到 Cloud SQL 副本的初始数据加载,请使用代管式导入。它使用从外部服务器中提取数据并将其直接导入 Cloud SQL 实例的服务。如需了解详情,请参阅使用代管式导入设置从外部数据库复制

监控复制

Cloud SQL 副本完成初始数据加载后,会连接到外部服务器,并应用导出操作后执行的所有更新。确认您的复制状态

请务必在将副本提升为独立实例之前检查复制状态。如果复制过程未成功完成,则提升的副本将不具有外部服务器的所有更改。

如果复制延迟时间不接近于 0,请按照相关步骤解决该问题。 您可能希望检查这些指标:/postgresql/external_sync/initial_sync_completepostgresql/external_sync/max_replica_byte_lagdatabase/replication/state。查看 Cloud SQL 指标列表。

一旦 Cloud SQL 副本与外部服务器同步,且 Cloud SQL 副本没有复制延迟,就请连接到您的数据库。运行相应的数据库命令,以确保内容与外部服务器相比符合预期。保留您的外部服务器,直到完成必要的验证。

设置级联副本

迁移后,您可以先在 Cloud SQL 副本下创建级联读取副本,然后再升级 Cloud SQL 副本。

如需创建级联副本,请运行以下命令:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 单击副本的副本标签页,该副本将充当您要创建的副本的父级。
  3. 点击创建副本
  4. 创建读取副本页面上,更新实例 ID 和任何其他配置选项,包括名称、区域和可用区。
  5. 点击创建

    Cloud SQL 会创建一个副本。随后,您将返回到父级副本的实例页面。

  6. 对于要创建的每个新级联副本,请按照步骤 4-6 执行操作。

gcloud

  1. 使用 --master-instance-name 标志将 Cloud SQL 副本指定为主实例,以创建新副本:
  2. gcloud sql instances create REPLICA_NAME \
          --master-instance-name=PARENT_REPLICA_NAME \
    替换以下内容:
    • REPLICA_NAME:您要创建的副本的唯一 ID
    • PARENT_REPLICA_NAME:Cloud SQL 副本的名称
  3. 创建副本后,您可以看到对主实例所做的更改已通过级联副本链中的所有副本进行复制。

curl

  1. 如需在父级副本下创建副本,请修改以下 JSON 代码示例并将其保存到名为 request.json 的文件中:

    {
      "masterInstanceName": "EXTERNAL_SERVER_REPLICA_NAME",
      "project": "PROJECT_ID",
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
        }
    }
  2. 运行以下命令:
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"

提升副本数据库

按照以下步骤提升副本:

  1. 将副本提升为主实例
  2. 向实例添加读取副本
  3. 可选操作:配置实例以实现高可用性 (HA)。 为防止更久的停机时间,您可以通过将 AVAILABILITY_TYPE 设置为 REGIONAL设置副本,从而启用高可用性。

限制

  • 如果您在外部源数据库上安装 Cloud SQL 不支持的扩展程序,那么当您将相应数据库迁移到目标实例时,Cloud SQL 不会迁移这些扩展程序。为了确保顺利迁移,请确认没有对象或应用引用这些扩展程序。在继续迁移之前,我们建议您从源数据库中移除这些扩展程序以及所有引用。

    如需详细了解 Cloud SQL 支持的扩展程序,请参阅配置 PostgreSQL 扩展程序

  • 如果您在外部源数据库上安装了 pg_cron 扩展程序,那么当您将数据库迁移到目标实例时,Cloud SQL 不会迁移该扩展程序或与该扩展程序关联的任何 cron 设置。迁移数据库并提升副本后,Google 建议您在每个迁移的数据库上重新启用 pg_cron 扩展程序。

后续步骤