导出数据

本页面介绍如何从 Cloud SQL 实例或非 Cloud SQL 管理的数据库服务器导出数据。

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

将 Cloud SQL 中的数据导出到 SQL 转储文件

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

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

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

准备工作

此过程需要您将文件导出到 Cloud Storage。如需将数据导出到 Cloud Storage,实例的服务帐号必须在项目中设置 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 Storage 中的 SQL 转储文件

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

控制台

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

    转到“Cloud SQL 实例”页面

  2. 点击要从中导出数据的实例,打开其概览页面。
  3. 点击按钮栏中的导出
  4. Cloud Storage 导出位置下,添加存储分区、文件夹和要导出的文件的名称,或者点击浏览查找或创建存储分区、文件夹或文件。

    如果您点击浏览,请执行以下操作:

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

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

    3. 点击选择
  5. 格式下方,点击 SQL 创建 SQL 转储文件。
  6. 用于导出的数据库下,使用下拉菜单选择要从中导出数据的数据库。
  7. 点击导出开始导出。
  8. 导出数据库?对话框打开,提示大型数据库的导出过程可能需要一个小时或更长时间。在导出期间,您可在实例上执行的唯一操作是查看信息。导出一旦开始后就无法停止。如果此时适合开始导出,请点击导出。否则,请点击取消

gcloud

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

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

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

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

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

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

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

REST

  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:Cloud SQL 实例中数据库的名称

    HTTP 方法和网址:

    POST https://www.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"]
        }
    }
    

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

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

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

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

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

准备工作

此过程需要您将文件导出到 Cloud Storage。如需将数据导出到 Cloud Storage,实例的服务帐号必须在项目中设置 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 Storage 中的 CSV 文件

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

控制台

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

    转到“Cloud SQL 实例”页面

  2. 点击实例,以打开其实例概览页面。
  3. 点击按钮栏中的导出
  4. Cloud Storage 导出位置下,添加存储分区、文件夹和要导出的文件的名称,或者点击浏览查找或创建存储分区、文件夹或文件。

    如果您点击浏览,请执行以下操作:

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

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

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

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

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

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

gcloud

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

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

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

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

  3. 描述要从中进行导出的实例:
    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] --query=[SELECT_QUERY]
    

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

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

REST

  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 实例中数据库的名称
    • select_query:适用于导出的 SQL 查询

    HTTP 方法和网址:

    POST https://www.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"],
          "csvExportOptions":
           {
               "selectQuery":"select_query"
           }
       }
    }
    

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

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

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

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

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=plain

    Cloud SQL 仅支持简单的 SQL 格式。

  • --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

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

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

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

如需 pg_dump 方面的帮助,请参阅 pg_dump 参考文档

后续步骤