导出数据

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

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

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

准备工作

所需的角色和权限

如需将数据导出到 Cloud Storage,服务帐号或用户必须拥有以下角色组合之一:

  • Cloud SQL Editor 角色和 roles/storage.legacyBucketWriter IAM 角色。
  • 包括以下权限的自定义角色
    • cloudsql.instances.get
    • cloudsql.instances.export
    • storage.buckets.create
    • storage.objects.create

如果该服务帐号或用户也在执行导入操作,为方便操作,请授予 Storage Object Admin IAM 角色以获取导入和导出操作所需的所有权限。

如需有关 IAM 角色的帮助,请参阅适用于 Cloud Storage 的 Cloud Identity and Access Management

将 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. 找到要从中导出数据的 Cloud SQL 实例的服务帐号。为此,您可以运行 gcloud sql instances describe 命令。在输出中查找 serviceAccountEmailAddress 字段。
    gcloud sql instances describe INSTANCE_NAME
      
  4. 使用 gsutil iam 向服务帐号授予 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  5. 导出数据库:
    gcloud beta sql export bak INSTANCE_NAME gs://BUCKET_NAME/sqldumpfile.sql.gz \
    --database=DATABASE_NAME
      

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

  6. 如果您不需要保留之前设置的 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://sqladmin.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 组件构建自己的自动化工具。如需了解详情,请参阅本教程

问题排查

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

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

无法查看操作状态

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

可能的原因

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

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


连接在导出操作期间关闭

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

可能的原因

与 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 Storage 存储桶移到更靠近 Cloud SQL 实例的位置。 在活动量较少的时候运行操作。

想要自动执行导出

您想要自动执行导出。

可能的原因

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

后续步骤