配置 Cloud SQL 以从外部服务器复制

本页面介绍如何配置外部服务器以复制到 Cloud SQL,在 Cloud SQL 上创建源表示形式实例,以及如何将选项复制到 Cloud SQL。在继续执行所选选项的复制步骤之前,您需要完成本页面上的所有步骤。

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

准备工作

术语

  • 外部服务器。您要从中复制数据的 Cloud SQL 外部的 MySQL 服务器。也称为源数据库或外部数据库服务器。

  • 源表示形式实例Cloud SQL 实例的模拟,表示要连接到 Cloud SQL 副本的外部服务器。该实例会显示在 Google Cloud Console 中,并且看起来与常规 Cloud SQL 实例相同,但不包含任何数据,无需进行任何配置或维护,也不会影响结算。包含外部服务器配置

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

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

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

设置 Google Cloud 项目

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Cloud SQL Admin API。

    启用 API

  5. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  6. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  7. 启用 Cloud SQL Admin API。

    启用 API

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

    转到 IAM 页面

  9. 启用 Cloud SQL Admin API。

    启用 API

安装 Google Cloud SDK

如需配置复制,请为您的外部服务器安装 Google Cloud SDK。如果您尚未将其安装到外部服务器上,则可能需要将其安装在外部服务器上。

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

外部服务器核对清单

  • 确保您的外部服务器上安装了 MySQL 5.5、5.6、5.7 或 8.0。支持 MySQL Community Edition、Cloud SQL for MySQL、MySQL on Amazon Relational Database Service (RDS)。

    • 您必须在 Cloud SQL 副本上使用 MySQL 的主要版本,该版本必须与外部服务器上运行的 MySQL 版本相同或更高。
    • 如果外部服务器上安装了 MySQL 5.5,则 GTID 不受支持。
  • 确保启用二进制日志,并且确保:

  • 记下外部服务器是否已启用 GTID。这会影响设置复制所需执行的步骤。

  • 记下外部服务器是否具有全局读取锁定权限。这会影响设置复制所需执行的步骤。

  • 如果 Cloud SQL 副本将使用专用 IP,则必须配置外部服务器的防火墙,以允许整个内部 IP 地址范围分配给 VPC 网络的专用服务访问,VPC 网络是 Cloud SQL 副本将被用作其 ipConfiguration 设置privateNetwork 字段。

  • 如果外部服务器包含 DEFINER 子句(视图、事件、触发器或存储过程),则复制可能会失败,具体取决于这些语句的执行时间。详细了解 Cloud SQL 中的 DEFINER 用法以及可能的解决方法。

配置二进制日志保留

您应该将外部服务器配置为保留二进制日志至少 24 小时。

MySQL Community

如果您的外部服务器使用的是 MySQL Community Edition,则您可以使用以下 MySQL 命令更新二进制日志保留设置。

Cloud SQL for MySQL

如果您的外部服务器默认使用 Cloud SQL for MySQL,则二进制日志会保留七天。如需更改此设置,请按以下步骤操作。

Amazon RDS

如果外部服务器是 Amazon RDS 实例,则您可以使用以下命令更新二进制日志保留设置:

call mysql.rds_set_configuration('binlog retention ', HOURS);
属性 说明
小时 RDS 实例要保留的二进制日志的总小时数。

如需了解详情,请参阅 mysql.rds_set_configuration

创建复制用户帐号

您的外部服务器上必须存在专用于管理 Cloud SQL 副本复制的 MySQL 用户帐号。此用户帐号只能用于管理复制。根据您使用的迁移方法,您可能需要在以后向用户授予权限。

如需添加复制用户帐号,请在外部服务器上打开终端并输入以下 MySQL 命令:

MySQL

      CREATE USER 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD';
      GRANT SELECT, SHOW VIEW ON *.* TO 'USERNAME'@'HOST';
      FLUSH PRIVILEGES;

示例

CREATE USER 'replicationUser'@'%' IDENTIFIED BY '8*&fwwd';
GRANT SELECT, SHOW VIEW ON *.* TO 'replicationUser'@'%';
FLUSH PRIVILEGES;
属性 说明
USERNAME 外部服务器上的复制用户帐号。
PASSWORD 复制用户帐号的密码。
HOST 将此属性设置为 % 可接受来自任何主机的所有连接。在稍后的步骤中,此属性更改为仅接受来自 Cloud SQL 副本的连接。

设置源表示形式实例

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

创建请求数据

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

source.json

    {
      "name": "SOURCE_NAME",
      "region": "REGION",
      "databaseVersion": "MYSQL_VERSION",
      "onPremisesConfiguration": {
        "hostPort": "SOURCE_HOST",
        "username": "USERNAME",
        "password": "PASSWORD",
        "dumpFilePath": "gs://BUCKET/DUMP_FILE",
        "caCertificate": "SOURCE_CERT",
        "clientCertificate": "CLIENT_CERT",
        "clientKey": "CLIENT_KEY"
      }
    }

代管式转储示例

// example of source.json for external server that
// - initiates replication from a Cloud SQL managed dump
// - does not use SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  }
}

转储文件示例

// example of source.json for external server that
// - initiates replication from a file
// - uses SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@",
    "dumpFilePath": "gs://replica-bucket/source-database.sql.gz",
    "caCertificate": "content of your certificate",
    "clientCertificate": "content of your certificate",
    "clientKey": "content of your client key"
  }
}

自定义导入示例

// example of source.json for external server that
// - initiates replication from a Cloud SQL custom import
// - does not use SSL/TSL

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

创建源表示形式实例

在完成此步骤之前,您应创建包含源请求数据的 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 文件的路径。

设置 Cloud SQL 副本

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

创建请求数据

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

replica.json

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

示例

    {
        "settings": {
            "tier": "db-custom-4-15360",
            "dataDiskSizeGb": "100"
        },
        "masterInstanceName": "source-instance",
        "region": "us-central1",
        "databaseVersion": "MYSQL_5_7",
        "name": "replica-instance"
    }
可选字段 备注
ipConfiguration 仅当 Cloud SQL 副本位于专用网络上时,才应包含此字段。
属性 说明
TIER 用于托管副本实例的机器类型。如果您不知道要使用哪种机器类型,请首先使用 db-custom-2-7680。您以后可以根据需要更改其大小和其他受支持的值
DISK_SIZE Cloud SQL 副本的存储空间大小(以 GB 为单位)。
PROJECT_ID Google Cloud 中的项目 ID。
NETWORK_NAME 要与 Cloud SQL 副本搭配使用的专用网络的名称。
SOURCE_REPRESENTATION_INSTANCE_NAME 源表示形式实例的名称。
SOURCE_REGION 分配给源表示形式实例的地区。
MYSQL_VERSION 要与 Cloud SQL 副本搭配使用的 MySQL 版本。选项包括 MYSQL_5_6MYSQL_5_7MYSQL_8_0。此版本可以与外部服务器上运行的 MySQL 版本匹配,也可以最多高一个版本。例如,如果您在外部服务器上使用 MySQL 5.5,则可以将 MySQL 5.6 与 Cloud SQL 副本搭配使用。
REPLICA_NAME 要创建的 Cloud SQL 副本的名称。

创建 Cloud SQL 副本

在完成此步骤之前,您应创建包含副本请求数据的 JSON 文件。然后,打开终端并使用以下命令在 Cloud SQL 中创建 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 @./replica.json \
         -X POST \
属性 说明
JSON_PATH 包含 Cloud SQL 副本请求数据的 JSON 文件的路径。
PROJECT_ID Google Cloud 中的项目 ID。

完成后应该看到的内容

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

您应该会看到源表示形式实例和 Cloud SQL 副本。它们类似于以下内容:

实例 ID 类型 公共 IP 地址
(-) source-representation-instance MySQL 外部主实例 10.68.48.3:3306
replica-instance MySQL 读取副本 34.66.48.59

将用户添加到 Cloud SQL 副本

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

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

您可以使用 Cloud SQL 副本的传出 IP 地址在外部服务器和 Cloud SQL 副本之间创建安全连接。

如需获取副本的传出 IP 地址,请按照以下所述操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 在 Cloud SQL 副本的公共 IP 地址旁边,将指针悬停在更多信息提示上,并检索传出 IP 地址。请注意,传出 IP 地址不是 Cloud Console 上副本主列表中显示的 IP 地址

gcloud

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 地址会显示在 Cloud Console 中。

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

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

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

设置初始数据加载和复制到 Cloud SQL

您可以通过以下三种方式执行从外部服务器初始加载到 Cloud SQL 副本的数据:

  • 代管式导入使用从外部服务器中提取数据并将其直接导入 Cloud SQL 实例的服务。对于全局事务标识符 (GTID) 复制,建议使用此选项。如果外部服务器在 RDS 上,并且 RDS 使用 GTID 或二进制日志复制,则建议使用此选项。如需了解详情,请参阅使用代管式导入设置从外部数据库复制
  • 转储文件要求您创建外部服务器的转储文件,将其移动到 Cloud Storage 存储分区,并将其导入 Cloud SQL。如果您的服务器使用的是 RDS 并且 GTID 已停用,则无法使用此选项。如需了解详情,请参阅使用转储文件设置从外部数据库复制
  • 自定义导入要求您创建 Cloud SQL 主实例,使用首选工具执行自定义数据导入,将其降级为 Cloud SQL 副本,然后设置外部服务器复制。这最适合非常大型的数据库。如需了解详情,请参阅使用自定义导入设置从大型外部数据库复制

监控复制

确认复制状态

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

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

如果复制延迟时间不接近于 0,请按照相关步骤解决该问题

完成迁移

提升副本并添加高可用性和只读副本

这些步骤准备用于生产的实例。

  1. 将副本提升为主实例。请注意,GTID 和二进制日志已开启,并且计划备份在提升的副本上已启用。
  2. 向实例添加读取副本
  3. 配置实例以实现高可用性

后续步骤