从外部服务器复制 (v1)

本页面介绍如何创建将数据从源数据库服务器复制到 MySQL 副本的配置。

源数据库服务器可以是满足所有服务器要求的任何 MySQL 服务器,包括 Cloud SQL 实例在内。其他云提供商托管的实例只要符合要求(包括支持 GTID),则也可以作为数据源。

如需详细了解此配置,请参阅关于从外部服务器复制

准备工作

在设置从外部服务器复制数据的配置之前,您必须完成以下步骤:

  • 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • 确保您的 Google Cloud 项目已启用结算功能

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

    Go to project selector

  • 确保您的 Google Cloud 项目已启用结算功能

  • 启用 Cloud SQL Admin API。

    启用 API

  • 安装 gcloud CLI 并对其进行身份验证。
  • 确保您的服务器符合针对源数据库服务器的要求
  • 确定主实例与副本之间的连接所需的安全级别,并获取所需的证书文件。
  • 确定您要用于包含 Cloud SQL 副本的 Google Cloud 区域
  • 收集关于您的源数据库服务器的必需信息:

    • 外部 IPv4 地址和端口号

      默认情况下,MySQL 使用端口 3306。

    • MySQL 复制用户账户和密码
    • MySQL 版本号
    • 所有必需的 SSL/TLS 证书和密钥的位置,具体取决于您选择的安全级别
  • 准备好更新源数据库服务器的网络防火墙,以接受来自 Cloud SQL 副本的连接。

    必须在创建副本后的 30 分钟内完成此步骤。

  • 如果您不是项目所有者,则必须具有 Storage Admin 角色。

针对来源数据库服务器的要求

在将数据从外部服务器复制到 Cloud SQL 副本之前,请确保来源数据库服务器符合以下配置要求:

配置过程

要设置从外部数据库服务器复制数据的配置,请执行以下步骤:

  1. 为您的数据创建 Cloud Storage 存储分区
  2. 将数据导出到 Cloud Storage
  3. 设置复制配置
  4. 将源数据库服务器配置为接受来自副本的连接

  5. 限制 MySQL 复制用户的访问权限

  6. 完成副本配置

  7. 确认复制状态

  8. 清理存储空间

1. 为您的数据创建 Cloud Storage 存储分区

您可以创建存储分区,以便在导出过程中临时保存数据,也可以使用现有的存储分区。

如需详细了解如何创建存储分区,请参阅创建存储分区。如需详细了解 Storage Admin 角色,请参阅 Cloud Storage IAM 角色

2.将数据导出到 Cloud Storage

副本会在 Cloud Storage 中查找其数据,所以您在其中放置服务器数据的副本。导出数据后,您可以继续接受对服务器的写入操作。副本在完成转储文件的导入后,会开始处理自执行导出操作后发生的所有更改,并最终与主实例同步。

在安装了 gcloud CLI 并与 MySQL 服务器建立了网络连接的机器上,运行以下命令:

mysqldump \
    -h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
    --databases [DBS]  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gsutil cp - gs://[BUCKET]/[PATH_TO_DUMP]

If the source of the migration is a Relational Database Service (RDS) for MySQL,
the master-data flag is not supported and should not be specified.
This command might look like the following example:

mysqldump \
    -h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
    --databases [DBS]  \
    --hex-blob  --skip-triggers \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gsutil cp - gs://[BUCKET]/[PATH_TO_DUMP]

Additionally, you should configure RDS instances to retain binlogs for a
a longer period of time.
This command might look like the following example:

// Sets the retention period to one day.
call mysql.rds_set_configuration('binlog retention hours', 24);

[PROPERTIES_IN_BRACKETS] 替换为以下值:

属性
[PRIMARY_INSTANCE_IP] 源数据库服务器的 IPv4 地址。
[PRIMARY_INSTANCE_PORT] 源数据库服务器的端口。
[USERNAME] MySQL 复制用户账号。
[PASSWORD] MySQL 复制用户账号的密码。
[DBS] 源数据库服务器上所有数据库(系统数据库 sysmysqlperformance_schemainformation_schema 除外)的列表,以英文逗号分隔。使用 SHOW DATABASES MySQL 命令可以列出您的数据库。
[BUCKET] 您为保存导出文件而创建的存储分区的名称。
[PATH_TO_DUMP] 导出文件的路径。

如果系统显示有关部分转储和 GTID 的警告,则是正常现象。

此命令可能如以下示例所示:

mysqldump \
    -h 192.0.2.1 -P 3306 -u replicationUser \
    --databases guestbook  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gsutil cp - gs://export-bucket/hq-primary1.sql.gz

3. 创建复制配置

如果副本使用专用 IP,则来源数据库服务器必须配置为可从副本的 VPC 进行访问。目前仅支持通过 gcloud CLI 和 Cloud SQL Admin API 在专用 VPC 上创建副本。

控制台

此步骤创建 Cloud SQL 副本和源表示形式实例

  1. 打开 Google Cloud Console 中的 Cloud SQL 实例列表。

    打开实例列表

  2. 点击按钮栏中的迁移数据以打开 Cloud SQL Migration Assistant。

  3. 点击开始迁移

  4. 源数据库名称字段中,为 Cloud SQL 中的复制配置提供一个名称。

    此名称是配置的参考,请使用任何有效的 Cloud SQL 实例名称。

  5. 输入源数据库服务器的 IP 地址和端口号。

  6. 提供将用于复制连接的 MySQL 用户的用户名和密码。

  7. 选择源数据库服务器的 MySQL 版本。

  8. 如果您对副本与源数据库服务器之间的连接使用 SSL/TLS(推荐),请选择启用 SSL/TLS 安全设置并提供源服务器的 SSL/TLS 证书信息。

    如需详细了解 SSL/TLS 方式,请参阅 SSL/TLS 方式

  9. 点击下一步,然后填写副本的详细信息。

    要确保导入操作尽可能高效,请为副本配置足够大的存储空间以包含数据库。调整核心大小和内存的大小与源服务器类似。

  10. 提供之前上传到 Cloud Storage 的转储文件的路径。

  11. 点击创建以创建副本。

  12. 点击下一步

gcloud

  1. 创建源表示形式实例

    gcloud beta sql instances create [REPLICA_NAME] \
        --region=[REGION] --database-version=[MYSQL_VERSION] \
        --source-ip-address=[SOURCE_IP] --source-port=[SOURCE_PORT]
    

    如果副本使用的是专用 IP 地址,还需添加:-network=[VPC_NETWORK_NAME]

    [PROPERTIES_IN_BRACKETS] 替换为以下值:

    属性
    [SOURCE_REPRESENTATION_NAME] 源表示形式实例的名称。请使用任何有效的 Cloud SQL 实例名称。
    [REGION] 您希望 Cloud SQL 副本驻留的区域
    [MYSQL_VERSION] 源数据库服务器上运行的 MySQL 版本:MYSQL_5_6MYSQL_5_7
    [SOURCE_IP] 可从外部访问的源数据库服务器 IPv4 地址。
    [SOURCE_PORT] 可从外部访问的源数据库服务器端口。
  2. 创建 Cloud SQL 副本:

    gcloud beta sql instances create [REPLICA_NAME] \
        --master-instance-name=[SOURCE_REPRESENTATION_NAME] \
        --master-username=[USERNAME] --prompt-for-master-password \
        --master-dump-file-path=gs://[BUCKET]/[PATH_TO_DUMP] \
        --master-ca-certificate-path=[SOURCE_SERVER_CA_PATH] \
        --client-certificate-path=[CLIENT_CERT_PATH] \
        --client-key-path=[PRIVATE_KEY_PATH] \
        --tier=[MACHINE_TYPE] --storage-size=[DISK_SIZE]
    

    如果副本使用的是专用 IP 地址,还需添加:-network=[VPC_NETWORK_NAME]

    [PROPERTIES_IN_BRACKETS] 替换为以下值:

    属性
    [REPLICA_NAME] Cloud SQL 只读副本的名称。请使用任何有效的 Cloud SQL 实例名称。
    [SOURCE_REPRESENTATION_NAME] 您在上一步中创建的源表示形式实例的名称。
    [USERNAME] 源数据库服务器上的 MySQL 复制用户账号。
    [BUCKET] 您为保存导出文件而创建的存储分区的名称。
    [PATH_TO_DUMP] 导出文件的路径。
    [SOURCE_SERVER_CA_PATH] 存储源数据库服务器的 CA 证书的本地路径。仅对 SSL/TLS 是必需的。
    [CLIENT_CERT_PATH] 存储客户端证书的本地路径。仅对服务器-客户端身份验证是必需的。
    [PRIVATE_KEY_PATH] 存储客户端证书的私钥文件的本地路径。仅对服务器-客户端身份验证是必需的。
    [MACHINE_TYPE] 副本的大小。通常,副本的大小与源数据库服务器的大小大致相同。如果您不确定要使用哪种机器类型,请首先使用 db-custom-2-7680。如果需要,日后可以更改其大小。
    [DISK_SIZE] 副本的存储空间大小(以 GB 为单位)。为获得最佳性能,请创建存储空间足够大的副本以保存整个导入文件。
    [VPC_NETWORK_NAME] 下列格式的 VPC:projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]

cURL

1. 创建 Cloud SQL 源表示形式实例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "[SOURCE_REPRESENTATION_NAME]",
         "region": "[REGION]",
         "databaseVersion": "[MYSQL_VERSION]",
         "onPremisesConfiguration": {
             "hostPort": "[SOURCE_SERVER_IP]:[SOURCE_SERVER_PORT]"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

[PROPERTIES_IN_BRACKETS] 替换为以下值:

属性
[SOURCE_REPRESENTATION_NAME] 源表示形式实例的名称。请使用任何有效的 Cloud SQL 实例名称。
[REGION] 您希望 Cloud SQL 副本驻留的区域
[MYSQL_VERSION] 源数据库服务器上运行的 MySQL 版本:MYSQL_5_6MYSQL_5_7
[SOURCE_SERVER_IP] 可从外部访问的源数据库服务器 IPv4 地址。
[SOURCE_SERVER_PORT] 可从外部访问的源数据库服务器端口。
[PROJECT_ID] 您的 Google Cloud 项目的 ID。

例如,如需为 IP 地址为 192.0.2.0(在端口 3306 上打开)并运行 MySQL 5.7 的来源数据库服务器创建一个名为 hq-primary1 的源表示形式实例,以用于 MyProject 项目和 us-central1 区域中的 Cloud SQL 副本,请使用以下命令:

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "hq-primary1",
         "region": "us-central1",
         "databaseVersion": "MYSQL_5_7",
         "onPremisesConfiguration": {
             "hostPort": "192.0.2.0:3306"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

2. 创建 Cloud SQL 副本

在此步骤中,您将创建一个 Cloud SQL 只读副本(使用源表示形式服务器代表源数据库服务器),并为该副本提供您在上一步中加载到 Cloud Storage 中的数据。

由于此 API 调用要求您提供敏感信息,因此请使用 JSON 文件将数据提供给 cURL,而不是通过命令行提供。

创建数据文件:

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "[USERNAME]",
            "password": "[PASSWORD]",
            "dumpFilePath": "gs://[BUCKET]/[PATH_TO_DUMP]",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
     },
     "settings": {
         "tier": "[MACHINE_TYPE]",
         "dataDiskSizeGb": "[DISK_SIZE]"
     },
     "masterInstanceName": "[SOURCE_REPRESENTATION_NAME]",
     "region": "[REGION]",
     "databaseVersion": "[MYSQL_VERSION]",
     "name": "[REPLICA_NAME]"
}

如果副本使用专用 IP 地址,还需要在设置中添加“ipConfiguration.privateNetwork”,其值的格式为“projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]”

[PROPERTIES_IN_BRACKETS] 替换为以下值:

属性
[USERNAME] 源数据库服务器上的 MySQL 复制用户账号。
[PASSWORD] MySQL 复制用户账号的密码。
[BUCKET] 您为保存导出文件而创建的存储分区的名称。
[PATH_TO_DUMP] 导出文件的路径。
[SOURCE_SERVER_CA] 源数据库服务器的 CA 证书。仅 SSL/TLS 必须提供。将证书粘贴到请求正文中。
[CLIENT_CERT] 客户端证书。仅对服务器 - 客户端身份验证是必需的。将证书粘贴到请求正文中。
[PRIVATE_KEY] 客户端证书的私钥文件。仅对服务器 - 客户端身份验证是必需的。将密钥粘贴到请求正文中。
[MACHINE_TYPE] 副本的大小。通常,副本的大小与源数据库服务器的大小大致相同。如果您不确定要使用哪种机器类型,请首先使用 db-custom-2-7680。如果需要,日后可以更改其大小。
[DISK_SIZE] 副本的存储空间大小(以 GB 为单位)。为获得最佳性能,请创建存储空间足够大的副本以保存整个导入文件。
[SOURCE_REPRESENTATION_NAME] 您之前创建的源表示形式实例的名称。
[REGION] 您在其中创建了源表示形式实例的区域。只读副本必须与源表示实例位于同一个区域。
[MYSQL_VERSION] 源数据库服务器上运行的 MySQL 版本:MYSQL_5_6MYSQL_5_7
[REPLICA_NAME] Cloud SQL 只读副本的名称。请使用任何有效的 Cloud SQL 实例名称。

在命令行中,调用以下 API:

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

对于我们之前创建的源表示形式实例和存储分区,数据文件 data.json 可能类似于以下示例:

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "replicationUser",
            "password": "486#@%*@",
            "dumpFilePath": "gs://export-bucket/hq-primary1.sql.gz",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
    },
    "settings": {
        "tier": "db-custom-4-15360",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "hq-primary1",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "hq-primary1-replica1"
}

并且 cURL 命令如下所示:

curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./data.json
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

当读取副本可以访问转储文件时,会开始执行导入过程。 导入过程的时长取决于转储文件大小、副本的机器类型和数据库架构。按照一般估算指南,预计该副本每小时导入大约 25-50 GB 的数据。

该副本会一直保持 PENDING_CREATE 状态,直到导入过程完成为止;然后该副本会更改为 RUNNABLE 状态。

4. 将源数据库服务器配置为接受来自副本的连接

副本需要连接到来源数据库服务器才能使复制成功。如果源数据库服务器受到防火墙保护或受到一些其他网络限制,您必须使用该副本的 OUTGOING IP 地址为该副本启用网络访问权限。请注意,此地址不是在 Google Cloud 控制台的副本主列表中显示的 IP 地址。通过将鼠标悬停在 IP 地址的更多信息工具提示上或者使用以下 gcloud 命令,您可以检索 OUTGOING IP 地址。

  1. 检索读取副本的 IP 地址:

    gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"
    
  2. 如有必要,将来源数据库服务器的网络防火墙配置为接受来自 OUTGOING IP 地址的连接。
  3. 确认该副本已成功连接源数据库服务器。

    1. 实例列表页面中的副本图标不再是旋转状态,且是绿色的。
    2. 转到 Google Cloud 控制台中的“日志查看器”。

      转到“日志查看器”

    3. 实例下拉列表中选择副本。
    4. 选择 replication-setup.log 日志文件。

      如果副本无法连接到来源数据库服务器,请确认以下各项:

      • 来源数据库服务器上的任何防火墙都配置为允许来自副本的 OUTGOING IP 地址的连接。
      • 您的 SSL/TLS 配置正确无误。
      • 您的复制用户、主机和密码正确无误。

5.限制 MySQL 复制用户的访问权限

这是一个可选步骤,但为了安全起见,建议您执行此步骤。

来源数据库服务器上的 MySQL 复制用户已配置为接受来自任何主机 (%) 的连接。更新该用户账号以仅接受来自副本的 OUTGOING IP 地址的连接:

    UPDATE mysql.user SET Host='[OUTGOING_IP]' WHERE Host='%' AND User='[USERNAME]';
    FLUSH PRIVILEGES;

6. 完成副本配置

  1. 在副本上配置用户账号。

    您可以使用 Google Cloud Console、gcloud CLI 或 Cloud SQL API 来执行此操作。但是,您不能使用 mysql 客户端。如需详细了解 MySQL 用户,请参阅 MySQL 用户

    如需使用 Google Cloud 控制台创建用户,请执行以下操作

    1. 转到 Google Cloud 控制台中的“Cloud SQL 实例”页面。
      转到“Cloud SQL 实例”页面
    2. 点击实例名称,打开其实例详情页面。
    3. 选择用户标签。
    4. 点击创建用户账号
    5. 创建用户账号对话框中,指定用户的详细信息。
    6. 点击创建
  2. 从您打算使用公共 IP 地址与副本连接的任何客户端授予对副本的访问权限。

    有关说明,请参阅添加已获授权的地址或地址范围。如需连接到副本,请使用该副本的 PRIMARY IP 地址。此 IP 地址会显示在 Google Cloud 控制台中。

    您还可以使用任何其他连接方法来连接到副本。

7. 确认复制状态

当副本导入完转储文件时,会连接本地服务器,并应用在执行导出操作后发生的所有更新。

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

8. (可选)将副本提升为独立实例

检查复制状态后,如果您要将源数据库服务器完全替换(“迁移”)为 Cloud SQL,请将副本提升为独立的主实例。副本成为主实例后,将不再连接到原始源数据库服务器。

为新的主实例创建新的副本,然后重启连接应用,使其指向新的主实例(用于写入操作)或新副本(用于读取操作)。

9. 清理存储空间

  1. 删除导出文件:

    gsutil rm gs://[BUCKET]/[PATH_TO_DUMP]
    
  2. 如果您不再需要存储分区,请将其删除:

    gsutil rm -r gs://[BUCKET]
    

如需了解详情,请参阅 Cloud Storage 文档中的删除对象删除存储分区

更新配置

如需以后更新配置设置,您可以修改源表示形式实例。如果您需要更新本地配置设置,请注意 hostPorttype 无法更新。

后续步骤