本页面介绍了如何配置用于复制到 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 项目
- 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.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Cloud SQL Admin API. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Cloud SQL Admin API. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 
    确保您的用户账号具有 Cloud SQL Admin、Storage Admin、Compute Viewer 角色。 
- 自行管理的 PostgreSQL(在本地或由您完全控制的任何云虚拟机上)9.4、9.5、9.6、10、11、12、13、14、15、16、17 和 18
- Amazon RDS 9.6.10+、10.5+、11.1+、12、13、14、15、16、17 和 18。
- Amazon Aurora 10.11+、11.6+、12.4+、13.3+、14.6+、15.2+、16 和 17。
- Microsoft Azure Database for PostgreSQL Flexible Server 11 及更高版本
- Cloud SQL 9.6、10、11、12、13、14、15、16、17 和 18
- 在 Google Cloud 控制台中,前往 VPC 网络页面。 
- 选择要使用的 VPC 网络。 
- 点击专用服务连接标签页。 
- 如果源实例不包含 postgres数据库,请创建一个。
- 在源实例上安装 pglogical 软件包
- 根据需要设置以下参数。 - 如果源 PostgreSQL 实例是 Amazon RDS,那么请将这些参数添加到新参数组中,并将参数组挂接到实例。 
- 如果源是 Cloud SQL,请将 - cloudsql.logical_decoding和- cloudsql.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 设置为源实例可以支持的复制槽数上限。在将 MAX_REPLICATION_SLOTS 替换为数字后,使用以下命令: - ALTER SYSTEM SET max_replication_slots = MAX_REPLICATION_SLOTS; - 对于每个迁移的数据库,Cloud SQL 都需要一个槽。至少指定预期连接的订阅数,并预留一部分进行表同步。 - 例如,如果源实例有 5 个数据库且为源创建了 2 个迁移作业,那么除了您已经使用的复制槽数量之外,复制槽的数量必须至少为 5 * 2 = 10。 
- 除了已在实例上使用的发送器数量之外,应将 max_wal_senders 设置为至少与 - max_replication_slots相同。使用以下命令,将 MAX_WAL_SENDERS 替换为同时运行的 WAL 发送器进程总数:- ALTER SYSTEM SET max_wal_senders = MAX_WAL_SENDERS; - 例如,如果 - max_replication_slots参数设置为- 10,并且您已经使用 2 个发送器,则同时运行的 WAL 发送器进程的数量将为 10 + 2 = 12。
- 除了已在实例上使用的工作器进程数量之外,应至少将源实例中的数据库数量设置为 max_worker_processes。在将 MAX_WORKER_PROCESSES 替换为总数后,使用以下命令: - ALTER SYSTEM SET max_worker_processes = MAX_WORKER_PROCESSES; 
- 如果源 PostgreSQL 实例是 Microsoft Azure Database for PostgreSQL Flexible Server,请执行以下操作以支持将数据从外部服务器迁移到 Cloud SQL 实例:- 使用以下命令将 - shared_preload_libraries设置为包含- pglogical:- ALTER SYSTEM SET shared_preload_libraries = 'pglogical'; 
- 将 wal_level设置为logical。如需了解详情,请参阅 Azure Database for PostgreSQL - Flexible Server 中的逻辑复制和逻辑解码。
- 将 max_replication_slots 设置为源实例可以支持的复制槽数上限。在将 MAX_REPLICATION_SLOTS 替换为数字后,使用以下命令: - ALTER SYSTEM SET max_replication_slots = MAX_REPLICATION_SLOTS; - 对于每个迁移的数据库,Cloud SQL 都需要一个槽。至少指定预期连接的订阅数,并预留一部分进行表同步。 - 例如,如果源实例有 5 个数据库且为源创建了 2 个迁移作业,那么除了您已经使用的复制槽数量之外,复制槽的数量必须至少为 5 * 2 = 10。 
- 除了已在实例上使用的发送器数量之外,应将 max_wal_senders 设置为至少与 - max_replication_slots相同。使用以下命令,将 MAX_WAL_SENDERS 替换为同时运行的 WAL 发送器进程总数:- ALTER SYSTEM SET max_wal_senders = MAX_WAL_SENDERS; - 例如,如果 - max_replication_slots参数设置为- 10,并且您已经使用 2 个发送器,则同时运行的 WAL 发送器进程的数量将为 10 + 2 = 12。
- 除了已在实例上使用的工作器进程数量之外,应至少将源实例中的数据库数量设置为 max_worker_processes。在将 MAX_WORKER_PROCESSES 替换为总数后,使用以下命令: - ALTER SYSTEM SET max_worker_processes = MAX_WORKER_PROCESSES; 
- 将 azure.extensions 设置为包含 pglogical。如需了解详情,请参阅 Azure Database for PostgreSQL 中的服务器参数 - 弹性服务器。
 
 
- 如果 Cloud SQL 副本将使用专用 IP,对于副本的 VPC 网络,请将外部服务器的防火墙配置为允许为其专用服务访问通道分配的内部 IP 范围。
- 如需应用配置更改,请重启源实例。
- 选项 1:启用 Cloud SQL 外部服务器,通过授予对特定查询的访问权限来跟踪复制延迟。使用具有 - SUPERUSER权限的用户执行下列操作:- 定义以下函数,以允许外部服务器查询复制延迟。 - 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; $$;
- 运行以下命令,向用户授予 - EXECUTE权限:- REVOKE EXECUTE ON FUNCTION pg_stat_replication_user() FROM public;
- 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 响应中的复制延迟指标。 
- 对于本地源:模板数据库 template0和template1
- 对于 Amazon RDS 源:template0、template1和rdsadmin
- 对于 Cloud SQL 源:模板数据库 template0和template1
- 要安装 - pglogical扩展程序,请对源实例中的每个数据库运行以下命令:- CREATE EXTENSION IF NOT EXISTS pglogical - 对于没有主键的表,Cloud SQL 支持在变更数据捕获 (CDC) 阶段迁移初始快照和 - INSERT语句。手动迁移- UPDATE和- DELETE语句。
- 连接到实例并运行以下命令,为每个已迁移的数据库以及默认的 - 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; - 如果您的来源是低于 14 的 Microsoft Azure Database for PostgreSQL 版本,请运行以下命令: - GRANT SELECT on ALL TABLES in SCHEMA pglogical to username; - 您可以忽略 - pglogical.node界面上显示的错误。- 如果您的来源是 Microsoft Azure Database for PostgreSQL 14 及更高版本,请运行以下命令: - GRANT pg_read_all_data to username; - 否则,请运行以下命令: - ALTER USER username with REPLICATION; 
 
- SSL_OPTION_UNSPECIFIED:目标数据库在不加密的情况下连接到源数据库。
- DISABLED:副本连接到源数据库时,SSL 会停用。
- REQUIRE:副本需要使用 SSL 才能连接到源数据库。
- VERIFY_CA:使用此参数来指定是使用仅服务器身份验证还是服务器-客户端身份验证作为 SSL/TLS 加密的一部分来连接源数据库和目标数据库。- 如需使用仅限服务器的身份验证,您必须为 - SOURCE_CERT变量提供签署外部服务器证书的证书授权机构 (CA) 的 x509 PEM 编码证书。- 如需使用服务器-客户端身份验证,请进行以下替换: - SOURCE_CERT:提供签署源数据库服务器证书的 CA 的证书
- CLIENT_CERT:提供目标数据库用来对源数据库服务器进行身份验证的证书
- CLIENT_KEY:提供与客户端证书关联的私钥
 
- 
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。 
- 在 Cloud SQL 副本的公共 IP 地址旁边,将指针悬停在更多信息提示上,并检索传出 IP 地址。 - 请注意,传出 IP 地址不是在 Google Cloud 控制台的副本主列表中显示的 IP 地址。 
- 外部服务器受防火墙保护或受到其他某个网络限制的约束。
- 您的 Cloud SQL 副本使用的是公共 IP 地址。
- 外部服务器的主机、端口或 IP 地址发生变化。
- 您想使用其他 PostgreSQL 复制用户。
- PostgreSQL 复制用户的密码发生变化。
- 用于安全连接到外部服务器的 SSL 证书发生变化。
- 
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。 
- 单击副本的副本标签页,该副本将充当您要创建的副本的父级。
- 点击创建副本。
- 在创建只读副本页面上,更新实例 ID 和任何其他配置选项,包括名称、区域和可用区。
- 点击创建。Cloud SQL 会创建一个副本。随后,您将返回到父级副本的实例页面。 
- 对于要创建的每个新级联副本,请按照步骤 4-6 执行操作。
- 使用 --master-instance-name标志将 Cloud SQL 副本指定为主实例,以创建新副本:
- REPLICA_NAME:您要创建的副本的唯一 ID
- PARENT_REPLICA_NAME:Cloud SQL 副本的名称
- 创建副本后,您可以看到对主实例所做的更改已通过级联副本链中的所有副本进行复制。 
- 如需在父级副本下创建副本,请修改以下 JSON 代码示例并将其保存到名为 request.json的文件中:{ "masterInstanceName": "EXTERNAL_SERVER_REPLICA_NAME", "project": "PROJECT_ID", "name": "REPLICA_NAME", "region": "REPLICA_REGION", "settings": { "tier": "MACHINE_TYPE", } } 
- 运行以下命令: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" 
- 将副本提升为主实例。
- 向实例添加读取副本。
- 可选操作:配置实例以实现高可用性 (HA)。
为防止更久的停机时间,您可以通过将 AVAILABILITY_TYPE设置为REGIONAL来设置副本,从而启用高可用性。
- 如果您在外部源数据库上安装 Cloud SQL 不支持的扩展程序,那么当您将相应数据库迁移到目标实例时,Cloud SQL 不会迁移这些扩展程序。为了确保顺利迁移,请确认没有对象或应用引用这些扩展程序。在继续迁移之前,我们建议您从源数据库中移除这些扩展程序以及所有引用。 - 如需详细了解 Cloud SQL 支持的扩展程序,请参阅配置 PostgreSQL 扩展程序。 
- 如果您在外部源数据库上安装了 - pg_cron扩展程序,那么当您将数据库迁移到目标实例时,Cloud SQL 不会迁移该扩展程序或与该扩展程序关联的任何- cron设置。迁移数据库并提升副本后,Google 建议您在每个迁移的数据库上重新启用- pg_cron扩展程序。
- 您无法将数据从源 Microsoft Azure 服务器的版本 11 迁移到目标 Cloud SQL for PostgreSQL 实例的版本 11。如需解决此问题,请将数据迁移到版本为 12 或更高版本的 Cloud SQL 实例。 
- 了解如何使用代管式导入来设置从外部数据库复制。
安装 Google Cloud SDK
如需配置复制,请为您的外部服务器安装 Google Cloud SDK。除非已在其他位置安装 SDK,否则您可能需要在外部服务器上安装该 SDK。
设置外部服务器以进行复制
Cloud SQL 支持从源数据库到 Cloud SQL 目标数据库的持续迁移。
PostgreSQL 支持的源数据库包括:
配置来源需要同时配置源实例和底层源数据库。
外部服务器核对清单
如果因为传出专用 IP 地址不是静态的而使用专用 IP 地址启用了 Cloud SQL 副本,请配置外部服务器的防火墙以允许为 VPC 网络(Cloud SQL 副本将其用作专用网络)的专用服务访问通道分配的内部 IP 地址范围。
源数据库服务器的防火墙必须配置为允许为 VPC 网络(Cloud SQL 目标实例将其用作 ipConfiguration 设置的 privateNetwork 字段)的专用服务连接分配的整个内部 IP 地址范围。
如需查找内部 IP 范围,请执行以下操作:
配置源实例
如需配置源实例,请按照下列步骤操作:
 您在此步骤中设置的参数适用于正在运行的 PostgreSQL 数据库服务器。您还可以通过在 postgresql.conf 文件中添加这些更改来使它们持久不变。
为 9.6 之前的 PostgreSQL 版本启用复制延迟监控
如果您要从低于 9.6 的 PostgreSQL 版本进行迁移,则复制延迟指标默认不可用。您可以使用三种备选方法中的其中一种来跟踪此指标,以便在升级数据库时确保将停机时间控制在最短。
配置源数据库
Cloud SQL 外部服务器会迁移源实例下除以下数据库之外的所有数据库:
对源实例中未包含在上述列表中的每个数据库执行以下操作:
设置源表示形式实例
源表示形式实例会引用外部服务器。它仅包含来自外部服务器的请求数据。创建请求数据并在 curl 命令中使用这些数据,该命令会在 Cloud SQL 中创建源表示形式实例。
创建请求数据
请求数据包含 JSON 格式的外部服务器基本信息。您可以为公共或专用网络上的 Cloud SQL 副本配置请求数据,其中应包含以下信息。
如果您想将部分数据库从源表示形式实例迁移到目标 Cloud SQL 实例,请使用selectedObjects 参数指定数据库名称。如果您不使用此参数或将空列表作为此参数的值,则所有数据库都会从源迁移到目标。source.json
{ "name": "SOURCE_NAME", "region": "REGION", "databaseVersion": "DATABASE_VERSION", "onPremisesConfiguration": { "selectedObjects": "SELECTED_OBJECTS", "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/TLS
{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "POSTGRES_9_6",
  "onPremisesConfiguration": {
    "selectedObjects":[{"database":"db1"}, {"database":"db2"}],
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  }
}
| 属性 | 说明 | 
|---|---|
| SOURCE_NAME | 要创建的源表示形式实例的名称。 | 
| REGION | 源表示形式实例所在的区域。 | 
| DATABASE_VERSION | 外部服务器上运行的数据库版本。 选项包括 POSTGRES_9_6、POSTGRES_10、POSTGRES_11、POSTGRES_12、POSTGRES_13、POSTGRES_14、POSTGRES_15、POSTGRES_16或POSTGRES_17。 | 
| SELECTED_OBJECTS | 一个英文逗号分隔的对象列表,其中包含您要从源表示形式实例迁移到目标 Cloud SQL 实例的数据库。 | 
| 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 时,才应包含此字段。 | 
| SSL_OPTION | 是否使用 SSL/TLS 加密在源 Microsoft Azure 数据库与目标 Cloud SQL 数据库之间建立连接。您可以为此参数指定以下值: 此参数的默认值是  | 
创建源表示形式实例
在开始此步骤之前,请创建包含源请求数据的 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文件的路径。 | 
更新源表示形式实例
如果您从外部服务器更新请求数据,则可以更新现有源表示形式实例以使用修改后的值。
修改请求数据
更新请求数据,以包含已更改的所有字段。其中包括 hostPort、username、password、caCertificate、clientCertificate 和 clientKey 字段。更新请求数据后,在 curl 命令中使用这些数据更新 Cloud SQL 中的实例。
selectedObjects 参数关联的数据库名称列表。如果您不使用此参数或将空列表作为此参数的值,则所有数据库都会从源迁移到目标。
以下示例展示了如何使用不同用户名和密码更新 username 和 password 字段:
source.json
{ "name": "SOURCE_NAME", "region": "REGION", "databaseVersion": "DATABASE_VERSION", "onPremisesConfiguration": { "selectedObjects": "SELECTED_OBJECTS", "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/TLS
{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "POSTGRES_9_6",
  "onPremisesConfiguration": {
    "selectedObjects":[{"database":"db1"}, {"database":"db3"}],
    "username": "newReplicationUser",
    "password": "525#@%*@"
  }
}
| 属性 | 说明 | 
|---|---|
| SOURCE_NAME | 源表示形式实例的名称。 | 
| REGION | 源表示形式实例所在的区域。 | 
| DATABASE_VERSION | 外部服务器上运行的数据库版本。选项包括 POSTGRES_9_6、POSTGRES_10、POSTGRES_11、POSTGRES_12、POSTGRES_13、POSTGRES_14、POSTGRES_15、POSTGRES_16或POSTGRES_17。 | 
| SELECTED_OBJECTS | 一个更新的英文逗号分隔的对象列表,其中包含您要从源表示形式实例迁移到目标 Cloud SQL 实例的数据库。 | 
| 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_16", "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_6、POSTGRES_10、POSTGRES_11、POSTGRES_12、POSTGRES_13、POSTGRES_14、POSTGRES_15、POSTGRES_16或POSTGRES_17。与外部服务器上运行的数据库版本匹配,或将值设置为最多高一个版本。 | 
| 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.admin 或 cloudsql.editor IAM 角色中。
设置默认用户密码,并将其他用户账号添加到 Cloud SQL 副本
创建 Cloud SQL 副本后,为默认用户设置密码。您还可以根据需要向副本添加其他用户账号。 您无法从外部服务器导入数据库用户账号,但可以在 Cloud SQL 副本上重新创建这些用户账号。请在从外部服务器复制之前执行这些操作。
如需为默认用户设置密码,请使用 gcloud sql users set-password 命令,如下所示。
gcloud sql users set-password postgres \ --instance=INSTANCE_NAME \ --password=PASSWORD
在运行该命令之前,将 INSTANCE_NAME 替换为实例的名称,并将 PASSWORD 替换为您选择的密码。
如需在副本上创建用户账号,请参阅创建和管理用户。获取 Cloud SQL 副本的传出 IP 地址
您可以使用 Cloud SQL 副本的传出 IP 地址在外部服务器和 Cloud SQL 副本之间创建安全连接。系统不会向您收取此 IP 地址的费用。
控制台
如需获取副本的传出 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 地址。此 IP 地址会显示在 Google Cloud 控制台中。
更新源表示形式实例以允许复制到 Cloud SQL 副本
为 Cloud SQL 副本设置源表示形式实例后,您可能需要更新源表示形式实例。例如,以下场景需要更新您的配置:
播种 Cloud SQL 副本
如需执行从外部服务器到 Cloud SQL 副本的初始数据加载,请使用代管式导入。它使用从外部服务器中提取数据并将其直接导入 Cloud SQL 实例的服务。如需了解详情,请参阅使用代管式导入设置从外部数据库复制。
监控复制
Cloud SQL 副本完成初始数据加载后,会连接到外部服务器,并应用导出操作后执行的所有更新。确认您的复制状态。
请务必在将副本提升为独立实例之前检查复制状态。如果复制过程未成功完成,则提升的副本将不具有外部服务器的所有更改。
如果复制延迟时间不接近于 0,请按照相关步骤解决该问题。
您可能希望检查这些指标:/postgresql/external_sync/initial_sync_complete、postgresql/external_sync/max_replica_byte_lag 和 database/replication/state。查看 Cloud SQL 指标列表。
如果您想将部分数据库从源表示形式实例迁移到目标 Cloud SQL 实例,请检查以下数据库指标:
| 指标 | 说明 | 
|---|---|
| per_database/postgresql/external_sync/initial_sync_complete | 了解数据库的迁移阶段。如果此指标的值为 0,则表示该数据库仍属于初始数据转储的一部分。如果该值为1,则表示数据库已完成初始数据转储,并处于变更数据捕获 (CDC) 阶段。 | 
| per_database/postgresql/external_sync/replication_byte_lag | 了解数据库的复制延迟(以字节为单位)。 | 
在 Cloud SQL 副本与外部服务器同步,且 Cloud SQL 副本没有复制延迟后,请连接到您的数据库。运行相应的数据库命令,以确保内容与外部服务器相比符合预期。保留您的外部服务器,直到完成必要的验证。
设置级联副本
迁移后,您可以先在 Cloud SQL 副本下创建级联读取副本,然后再升级 Cloud SQL 副本。
如需创建级联副本,请运行以下命令:
控制台
gcloud
gcloud sql instances create REPLICA_NAME \ --master-instance-name=PARENT_REPLICA_NAME \
curl
提升副本数据库
按照以下步骤提升副本: