导出数据

本页面介绍如何从 Cloud SQL 实例导出数据。

导出操作会使用数据库资源,但不会干扰正常的数据库操作,除非实例预配不足。

如需了解导出数据的最佳做法,请参阅导入和导出数据的最佳做法

准备工作

确保您已配置所需的角色和权限。 如需将数据导出到 Cloud Storage,实例的服务帐号或用户必须:

  • Cloud SQL Editor 角色或包含 cloudsql.instances.export 权限的自定义角色。
  • roles/storage.legacyBucketWriter IAM 角色。
  • 如果服务帐号或用户也执行导入操作,请授予 cloudsql.instances.import 权限和 roles/storage.legacyObjectReader 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 Storage 中的 BAK 文件

如需将 Cloud SQL 实例上的数据库数据导出到 Cloud Storage 存储分区中的 BAK 文件,请执行以下操作:

控制台

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

    转到“Cloud SQL 实例”页面

  2. 点击要从中导出数据的实例,以打开其概览页面。
  3. 点击按钮栏中的导出
  4. 文件格式下,点击 BAK
  5. 要导出的数据下,使用下拉菜单选择要从中导出数据的数据库。
  6. 目标位置下,选择浏览以搜索用于导出的 Cloud Storage 存储分区或文件夹。
  7. 点击导出开始导出。

gcloud

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

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

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

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

  3. 描述要从中进行导出的实例:
      gcloud sql instances describe [INSTANCE_NAME]
      
  4. 复制 serviceAccountEmailAddress 字段。
  5. 使用 gsutil iam 向服务帐号授予该存储分区的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  6. 导出数据库:
      gcloud beta sql export bak [INSTANCE_NAME] gs://[BUCKET_NAME]/sqldumpfile.sql.gz \
                                  --database=[DATABASE_NAME]
      

    如需了解如何使用 gcloud beta sql export bak 命令,请参阅命令参考页面

  7. 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。

REST v1beta4

  1. 为导出创建一个存储分区:
    gsutil mb -p [PROJECT_NAME] -l [LOCATION_NAME] gs://[BUCKET_NAME]
    

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

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

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • bucket_name:Cloud Storage 存储分区名称
    • path_to_dump_file:SQL 转储文件的路径
    • database_name_1:Cloud SQL 实例中数据库的名称
    • database_name_2:Cloud SQL 实例中数据库的名称
    • offload:启用无服务器导出功能。设置为 true 可使用无服务器导出功能。

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
     "exportContext":
       {
          "fileType": "BAK",
          "uri": "gs://bucket_name/path_to_dump_file",
          "databases": ["database_name"]
          "offload": true | false
        }
    }
    

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

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

  4. 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
如需查看此请求的完整参数列表,请参阅 instances:export 页面。

自动执行导出操作

尽管 Cloud SQL 没有提供自动导出数据库的内置方法,但是您可以使用多个 Google Cloud 组件构建自己的自动化工具。如需了解详情,请参阅本教程

问题排查

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

针对此问题… 可能的原因… 请尝试以下操作…
无法查看当前操作状态。 用户界面仅显示成功或失败。 使用相关数据库命令了解详情。
导出时间太长。 Cloud SQL 不支持并发同步操作。 使用导出分流。了解详情
连接在导出操作期间关闭。 查询必须在前 7 分钟内生成数据。 手动测试查询。了解详情
导出过程中出现未知错误。 可能存在带宽问题。 确保实例和 Cloud Storage 存储分区位于同一区域
您想要自动执行导出。 Cloud SQL 不提供自动执行导出的方法。 构建您自己的流水线来执行此功能。了解详情

无法查看操作状态

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

可能的原因

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

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


导出时间太长

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

可能的原因

Cloud 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. 确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。

后续步骤