导出数据

本页面介绍如何从 Cloud SQL 实例或非 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 中的 SQL 转储文件

使用 Cloud SQL 执行导出时(无论是从 Cloud Console、gcloud 命令行工具还是从 API 导出),都要使用 pg_dump 实用程序并指定必需选项,以确保生成的导出文件可重新导入 Cloud SQL。

如果要导出到非 Cloud SQL 管理的数据库,也可以使用 psql 客户端手动运行 pg_dump

如果您打算将数据导入 Cloud SQL,则必须按照从外部数据库服务器导出数据中的说明操作,以便为 Cloud SQL 正确设置 SQL 转储文件格式。

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

控制台

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

    转到“Cloud SQL 实例”页面

  2. 点击要从中导出数据的实例,以打开其概览页面。
  3. 点击按钮栏中的导出
  4. 文件格式下,点击 SQL 以创建 SQL 转储文件。
  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 sql export sql [INSTANCE_NAME] gs://[BUCKET_NAME]/sqldumpfile.gz \
                                  --database=[DATABASE_NAME] --offload
      

    export sql 命令不包含触发器或存储过程,但包含视图。如需导出触发器和/或存储过程,请使用 pg_dump 工具。

    如需详细了解如何使用 export sql 命令,请参阅 sql export sql 命令参考页面。

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

REST API 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": "SQL",
          "uri": "gs://bucket_name/path_to_dump_file",
          "databases": ["database_name"]
          "offload": true | false
        }
    }
    

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

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

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

将 Cloud SQL 中的数据导出到 Cloud Storage 中的 CSV 文件

您可使用 CSV 格式导出数据,以供其他工具和环境使用。导出操作在数据库级层进行。在 CSV 导出期间,您可以指定要导出的架构。数据库级层下的所有架构都可以导出。

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

控制台

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

    转到“Cloud SQL 实例”页面

  2. 点击实例打开其概览页面。
  3. 点击导出
  4. Cloud Storage 导出位置下,选择导出的目标 Cloud Storage 存储分区或文件夹。
  5. 名称字段中,为导出文件提供一个名称,然后点击选择

    您可以使用 .gz 的文件扩展名来压缩导出文件。

  6. 格式设置为 CSV
  7. Cloud Storage 导出位置下,添加存储分区、文件夹和要导出的文件的名称,或者点击浏览查找或创建存储分区、文件夹或文件。

    如果点击了浏览

    1. 位置下,为导出操作选择 Cloud Storage 存储分区或文件夹。
    2. 名称文本框中,添加 CSV 文件的名称;或者如果您之前创建过文件,请从位置下的列表中选择该文件。

      您可以使用 .gz 文件扩展名(完整扩展名为 .csv.gz)来压缩导出文件。

    3. 点击选择
  8. 格式下,点击 CSV
  9. 要导出的数据库下,从下拉菜单中选择数据库的名称。
  10. SQL 查询下,输入 SQL 查询,以指定要从中导出数据的表。

    例如,如需导出 guestbook 数据库中 entries 表的全部内容,请输入以下内容:

    SELECT * FROM guestbook.entries;
    您的查询必须在指定的数据库中指定一个表;您无法以 CSV 格式导出整个数据库。

  11. 点击导出以开始导出。
  12. 系统会打开“导出数据库?”对话框,提示大型数据库的导出过程可能需要一个小时或更长时间。在导出期间,您可在实例上执行的唯一操作是查看信息。导出操作一旦开始就无法停止。如果此时适合开始导出,请点击导出。否则,请点击取消

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 sql export csv [INSTANCE_NAME] gs://[BUCKET_NAME]/[FILE_NAME] \
                                --database=[DATABASE_NAME] \
                                --offload \
                                --query=[SELECT_QUERY]
    

    如需了解如何使用 export csv 命令,请参阅 sql export csv 命令参考页面。

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

REST API 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_csv_file:CSV 文件的路径
    • database_name:Cloud SQL 实例中数据库的名称
    • offload:启用无服务器导出功能。设置为 true 可使用无服务器导出功能。
    • select_query:适用于导出的 SQL 查询

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
     "exportContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "databases": ["database_name"],
          "offload": true | false
          "csvExportOptions":
           {
               "selectQuery":"select_query"
           }
       }
    }
    

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

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

    您必须使用 databases 属性仅指定一个数据库;如果 select 查询指定了数据库,则该数据库必须与之相同。

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

CSV 导出会创建标准 CSV 输出。如果需要非标准 CSV 格式,则可以在 psql 客户端中使用以下语句:

      \copy [table_name] TO '[csv_file_name].csv' WITH
          (FORMAT csv, ESCAPE '[escape_character]', QUOTE '[quote_character]',
          DELIMITER '[delimiter_character]', ENCODING 'UTF8', NULL '[null_marker_string]');
如需查看此请求的完整参数列表,请参阅实例:导出页面。

使用 pg_dump 从本地 PostgreSQL 服务器导出数据

如需导出非 Cloud SQL 管理的数据库,以便稍后导入 Cloud SQL,请将 pg_dump 实用程序与以下标志搭配使用:

  • --no-owner

    SQL 转储文件中不得包含所有权更改命令。

  • --format

    Cloud SQL Admin API 仅支持 plain SQL 格式。

    如果转储文件支持 pg_restore,则允许使用 custom 格式。

  • --no-acl

    如果您的转储包含要在 SUPERUSER 角色中授予或撤消成员资格的语句,则必须使用此标志。

此外,您还必须移除所有以下内容:

  • 与扩展程序相关的语句(如果 Cloud SQL 不支持该扩展程序)。如需查看受支持扩展程序的列表,请参阅 PostgreSQL 扩展程序
  • 引用 plpgsql 的 CREATE EXTENSIONDROP EXTENSION 语句。此扩展程序预安装在 Cloud SQL Postgres 实例上。
  • COMMENT ON EXTENSION 语句。

对于纯文本格式:从命令行运行 pg_dump

pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \
    | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql

对于自定义格式:从命令行运行 pg_dump

pg_dump -U [USERNAME] --format=custom --no-owner --no-acl [DATABASE_NAME] > [DATABASE_NAME].dmp

sed 后处理操作会注释掉 SQL 转储文件中的所有扩展程序语句。

使用 pg_restore 导入时,使用命令行参数“--use-list=[DATABASE_NAME].toc”指定已处理的内容目录。

确认由数据库设置确定的默认编码是否适合您的数据。如果需要,您可以使用 --encoding 标志替换默认值。

如需执行并行导出,请使用 -j NUM_CORES 标志。NUM_CORES 是源实例上的核心数。如需执行并行导入,请将此相同标志与 pg_restore 搭配使用。

如需有关 pg_dump 的帮助,请参阅 pg_dump 参考文档

自动执行导出操作

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

问题排查

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

针对此问题… 可能的原因… 请尝试以下操作…
无法查看当前操作状态。 用户界面仅显示成功或失败。 使用相关数据库命令了解详情。
在导出过程中出现 408 Error (Timeout) SQL 导出可能需要很长时间,具体取决于数据库大小和导出内容。 使用多个 CSV 导出以减小每项操作的规模
CSV 导出成功,但 SQL 导出失败。 SQL 导出更有可能遇到 Cloud SQL 的兼容性问题。 使用 CSV 导出以仅导出您需要的文件。
导出时间太长。 Cloud SQL 不支持并发同步操作。 使用导出分流。了解详情
创建扩展程序错误。 转储文件包含对不受支持的扩展程序的引用。 修改转储文件以移除引用
使用 pg_dumpall 时出错。 该工具需要超级用户角色。 超级用户角色不受支持
导出操作在导出任何内容之前超时。 查询必须在前 7 分钟内生成数据。 尝试使用 pg_dump 工具进行手动导出
连接在导出操作期间关闭。 查询必须在前 7 分钟内生成数据。 手动测试查询。了解详情
导出过程中出现未知错误。 可能存在带宽问题。 确保实例和 Cloud Storage 存储分区位于同一区域
您想要自动执行导出。 Cloud SQL 不提供自动执行导出的方法。 构建您自己的流水线来执行此功能。了解详情

无法查看操作状态

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

可能的原因

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

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


导出过程中出现 408 错误(超时)

您在 Cloud SQL 中执行导出作业时看到错误消息 408 Error (Timeout)

可能的原因

CSV 和 SQL 格式的导出方式不同。SQL 格式会导出整个数据库,可能需要较长的时间才能完成。CSV 格式可让您定义要导出的数据库元素。

可以尝试的操作

使用 CSV 格式,并运行多个较小的导出作业,以减小每项操作的规模和长度。


CSV 导出成功,但 SQL 导出失败

CSV 导出成功,但 SQL 导出失败。

可能的原因

CSV 和 SQL 格式的导出方式不同。SQL 格式会导出整个数据库,可能需要较长的时间才能完成。CSV 格式可让您定义要导出的数据库元素。

可以尝试的操作

使用 CSV 导出以仅导出您需要的内容。


导出时间太长

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

可能的原因

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

可以尝试的操作

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



使用 pg_dumpall 时出错

尝试使用外部 pg_dumpall 命令行工具时出错。

可能的原因

此工具需要超级用户角色。

可以尝试的操作

Cloud SQL 是一项代管式服务,不向用户授予超级用户角色或权限。


对等方重置了连接

导出操作在导出任何内容之前超时。您看到错误消息“Could not receive data from client: Connection reset by peer.”。

可能的原因

如果 Cloud Storage 在特定时间范围内未收到任何数据,则连接会重置。

可以尝试的操作

使用 pg_dump 工具执行手动导出。


连接在导出操作期间关闭

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

可能的原因

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

后续步骤