将数据导入 Cloud SQL

准备工作

  • 对于以下说明,请准备指定一个新数据库;不要等到开始导入 BAK 文件的时候才创建数据库。
  • 确保您已配置所需的角色和权限
注意:您无法将从较高版本 SQL Server 导出的数据库导入,也无法将数据库从较高兼容性级别导入较低级别。例如,如果您导出的是 SQL Server 2017 Enterprise 版本,则无法将其导入到 SQL Server 2017 Standard 版本中。

从 Cloud Storage 中的 BAK 文件导入数据

如果您的实例版本是 Microsoft SQL Server Enterprise Edition,则可以导入加密的 BAK 文件。 注意:Cloud SQL 仅支持导入包含单个备份集的完整备份。 如需使用 BAK 文件将数据导入 Cloud SQL 实例,请执行以下操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 选择实例以打开其概览页面。
  3. 点击按钮栏中的导入按钮。
  4. 选择要从中导入数据的文件下,输入要用于导入数据的存储分区路径和 BAK 文件路径。或者,浏览到该文件:
    1. 点击浏览
    2. 位置下,双击列表中存储分区的名称。
    3. 在列表中选择该文件。
    4. 点击选择

    您可以导入经过压缩 (.gz) 或未经压缩的文件。

  5. 格式下方,选择 BAK
  6. 指定要将 BAK 文件导入 Cloud SQL 实例中的哪个数据库
  7. 点击导入以开始导入。

gcloud

  1. 为导入创建一个存储分区:

    gsutil mb -p [PROJECT_NAME] -l [LOCATION_NAME] gs://[BUCKET_NAME]
    

    此步骤非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。

  2. 确保您已配置所需的角色和权限
  3. 将数据从 BAK 文件上传到存储分区。
  4. 描述要从中导出数据的实例:
    gcloud sql instances describe [INSTANCE_NAME]
    
  5. 复制 serviceAccountEmailAddress 字段。
  6. 使用 gsutil iam 向服务帐号授予该存储分区的 storage.objectViewer IAM 角色。如需有关设置 IAM 权限方面的帮助,请参阅使用 IAM 权限
  7. 从文件导入数据:
    gcloud beta sql import bak [INSTANCE_NAME] gs://[BUCKET_NAME]/[FILE_NAME] 
    --database=[DATABASE_NAME]

  8. 如果您不需要保留之前设置的 IAM 权限,请使用 gsutil iam 移除这些权限。

REST v1beta4

  1. 创建 Cloud Storage 存储分区(如果您尚未创建)。

    有关创建存储分区方面的帮助信息,请参阅创建存储分区

  2. 将文件上传到存储分区。

    如需有关将文件上传到存储分区方面的帮助,请参阅上传对象

  3. 为您的实例提供存储分区的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限方面的帮助,请参阅使用 IAM 权限
  4. 从文件导入数据:

    在使用下面的任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID
    • bucket_name:Cloud Storage 存储分区名称
    • path_to_bak_file:BAK 文件的路径
    • database_name:Cloud SQL 实例中数据库的名称

    HTTP 方法和网址:

    POST https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/import

    请求 JSON 正文:

    {
     "importContext":
       {
          "fileType": "BAK",
          "uri": "gs://bucket_name/path_to_bak_file",
          "database": "database_name"
        }
    }
    
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

    如需使用其他用户身份执行导入操作,请指定 importContext.importUser 属性。

    如需查看此请求的完整参数列表,请参阅 instances:import 页面。
  5. 如果您不需要保留之前设置的 IAM 权限,请移除这些权限。

如果出现类似 ERROR_RDBMS 这样的错误,请确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。如需有关在 Cloud Storage 中配置访问权限控制方面的帮助,请参阅创建和管理访问控制列表

要了解如何为此任务构建底层 REST API 请求,请参阅 instances:import 页面上的 APIs Explorer

将数据从 SQL 文件导入 Cloud SQL

SQL 文件是包含一系列 SQL 命令的纯文本文件。

准备工作

  • 对于以下说明,请准备指定一个新数据库;不要等到开始导入 SQL 文件的时候才创建数据库。
  • 确保您已配置所需的角色和权限

导入 SQL 文件

如需使用 SQL 文件将数据导入 Cloud SQL 实例,请按如下所述操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 选择相应实例以打开其“实例详情”页面。
  3. 点击按钮栏中的导入按钮。
  4. 选择要从中导入数据的文件下,输入要用于导入数据的存储分区路径和 SQL 文件路径。或者,浏览到该文件:
    1. 点击浏览
    2. 位置下,双击列表中存储分区的名称。
    3. 在列表中选择该文件。
    4. 点击选择

    您可以导入经过压缩 (.gz) 或未经压缩的文件。

  5. 格式下,选择 SQL
  6. 指定要将 SQL 文件导入 Cloud SQL 实例中的哪个数据库
  7. 点击导入以开始导入。

gcloud

  1. 为导入创建一个存储分区:

    gsutil mb -p [PROJECT_NAME] -l [LOCATION_NAME] gs://[BUCKET_NAME]
    

    此步骤并非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。

  2. 将 SQL 文件上传到此存储分区。
  3. 描述要从中进行导出的实例:
    gcloud sql instances describe [INSTANCE_NAME]
    
  4. 复制 serviceAccountEmailAddress 字段。
  5. 使用 gsutil iam 向服务帐号授予该存储分区的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  6. 导入文件:
    gcloud sql import sql [INSTANCE_NAME] gs://[BUCKET_NAME]/[FILE_NAME] \
                                --database=[DATABASE_NAME]
    
  7. 如果您不需要保留之前设置的 IAM 权限,请使用 gsutil iam 移除这些权限。

REST v1beta4

  1. 创建 Cloud Storage 存储分区(如果您尚未创建)。

    有关创建存储分区方面的帮助信息,请参阅创建存储分区

  2. 将文件上传到存储分区。

    如需有关将文件上传到存储分区方面的帮助,请参阅上传对象

  3. 为您的实例提供存储分区的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  4. 导入文件:

    在使用下面的任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID
    • bucket_name:Cloud Storage 存储分区名称
    • path_to_sql_file:SQL 文件的路径
    • database_name:Cloud SQL 实例中数据库的名称

    HTTP 方法和网址:

    POST https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/import

    请求 JSON 正文:

    {
     "importContext":
       {
          "fileType": "SQL",
          "uri": "gs://bucket_name/path_to_sql_file",
          "database": "database_name"
        }
    }
    
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

    如需使用其他用户身份执行导入操作,请指定 importContext.importUser 属性。

    如需查看此请求的完整参数列表,请参阅 instances:import 页面。
  5. 如果您不需要保留之前设置的 IAM 权限,请移除这些权限。

如果出现类似 ERROR_RDBMS 这样的错误,请确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问控制列表

要了解如何为此任务构建底层 REST API 请求,请参阅 instances:import 页面上的 APIs Explorer

所需的角色和权限

此过程需要您从 Cloud Storage 导入文件。如需从 Cloud Storage 导入数据,Cloud SQL 实例的服务帐号或用户必须具有 Cloud SQL Admin 角色或自定义角色(包括 cloudsql.instances.import 权限)以及 roles/storage.LegacyObjectReader IAM 角色(具有 storage.objects.get 权限)。

如果该帐号或用户也执行导出操作,请授予设置的“Storage Object Admin”(storage.objectAdmin) IAM 角色。如需有关 IAM 角色的帮助,请参阅适用于 Cloud Storage 的 Cloud Identity and Access Management

您可以在 Google Cloud Console 的实例概览页面上找到实例的服务帐号名称。您可以使用 gsutil 工具验证 Cloud Storage 存储分区的角色:

gsutil iam get gs://[BUCKET_NAME]

详细了解如何搭配使用 IAM 和存储分区。

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
无法查看当前操作状态。 用户界面仅显示成功或失败。 使用相关数据库命令了解详情。
导出时间太长。 Cloud SQL 不支持并发同步操作。 使用导出分流。了解详情
导入时间太长。 过多的有效连接可能会干扰导入操作。 关闭未使用的连接,或者在开始执行导入操作之前重启 Cloud SQL 实例。
导入失败。 导出的文件可能包含尚不存在的数据库用户。 请先清理发生故障的数据库,然后再重试导入。在导入之前先创建数据库用户
连接在导出操作期间关闭。 查询必须在前 7 分钟内生成数据。 手动测试查询。了解详情
导出过程中出现未知错误。 可能存在带宽问题。 确保实例和 Cloud Storage 存储分区位于同一区域
您想要自动执行导出。 Cloud SQL 不提供自动执行导出的方法。 构建您自己的流水线来执行此功能。了解详情
ERROR_RDBMS: system error occurred Cloud Storage 权限或不存在的表。 检查权限或确保表存在
导入后,您无法使用原始数据库用户登录 Cloud SQL。 用户没有 LOGIN 权限。 使用默认的 sqlserver 用户登录。然后向原始用户授予 LOGIN 权限。

无法查看操作状态

您无法查看正在进行的操作的状态。

可能的原因

Google Cloud Console 在完成后仅报告成功或失败,不会返回警告。

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


导出时间太长

导出时间太长,阻止了其他操作。

可能的原因

Cloud SQL 不支持并发同步操作。

可以尝试的操作

尝试一次导出较小的数据集。


导入时间太长

导入时间太长,阻止了其他操作。

可能的原因

过多的有效连接可能会干扰导入操作。连接会消耗 CPU 和内存,从而限制可用的资源。

可以尝试的操作

关闭未使用的操作。检查 CPU 和内存用量,以确保有大量的可用资源。确保将最多资源用于导入操作的最佳方法是在开始执行操作之前重启实例。重启后,系统会执行以下操作:

  • 关闭所有连接。
  • 结束任何可能正在消耗资源的任务。


导入失败

如果导出的 SQL 转储文件中引用的一个或多个用户不存在,则导入会失败。

可能的原因

在导入 SQL 转储之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在。如果不存在,则恢复将无法重新创建具有原始所有权和/或权限的对象。

可以尝试的操作

请先清理发生故障的数据库,然后再重试导入。在导入 SQL 转储之前,先创建数据库用户


连接在导出操作期间关闭

连接在导出操作期间关闭。

可能的原因

与 Cloud Storage 的连接可能超时,因为在导出中运行的查询在导出启动后的 7 分钟内未生成任何数据。

可以尝试的操作

手动测试查询,方法是从任何客户端连接,然后使用以下命令将查询的输出发送到 STDOUT:

COPY (INSERT_YOUR_QUERY_HERE) TO STDOUT WITH ( FORMAT csv, DELIMITER ',', ENCODING 'UTF8', QUOTE '"', ESCAPE '"' )

这是预期行为,因为启动导出后,客户端应立即开始发送数据。在未发送数据情况下保持连接最终会断开连接,最后导致导出失败,使操作处于不确定状态。此外,以下是来自 gcloud 的错误消息:

operation is taking longer than expected


导出过程中出现未知错误

您在尝试将数据库导出到 Cloud Storage 存储分区时看到错误消息 Unknown error

可能的原因

转移可能由于带宽问题失败。

可以尝试的操作

Cloud SQL 实例可能与 Cloud Storage 存储分区位于不同区域。从一个大洲读取数据并将数据写入另一个大洲涉及很多网络用量,可能会导致类似的问题。检查实例和存储分区所在的区域。


想要自动执行导出

您想要自动执行导出。

可能的原因

Cloud SQL 不提供自动执行导出的方法。

可以尝试的操作

您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Functions 等 Google Cloud 产品构建自己的自动导出系统。


出现 ERROR_RDBMS 系统错误

您看到错误消息 [ERROR_RDBMS] system error occurred

可能的原因

  • 用户可能没有所需的所有 Cloud Storage 权限。
  • 数据库表可能不存在。

可以尝试的操作

  1. 检查核实您对存储分区至少拥有 WRITER 权限,并且对导出文件至少拥有 READER 权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问权限控制列表
  2. 确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。


导入后,您无法使用原始数据库用户登录 Cloud SQL

将数据库导入 SQL Server 后,您无法使用原始数据库用户登录 Cloud SQL。

可能的原因

用户没有 LOGIN 权限。

可以尝试的操作

使用默认的 sqlserver 用户登录。然后向原始用户授予 LOGIN 权限。

后续步骤