导出 CSV 文件

本页介绍了如何将 AlloyDB for PostgreSQL 集群中的数据以 CSV 格式导出到 Cloud Storage 存储桶,以供其他工具和环境使用。

如需了解如何将整个数据库从受支持的数据库服务器迁移到新的 AlloyDB 实例,请参阅使用 Database Migration Service 将数据库迁移到 AlloyDB。如果要导出数据以通过导出的文件创建新实例,请考虑从存储的备份恢复集群

您可以取消从 AlloyDB for PostgreSQL 集群导出数据。如需了解详情,请参阅取消导出数据

准备工作

  • 在开始导出操作之前,请注意,导出操作会使用数据库资源,但不会干扰标准数据库操作,除非实例预配不足。
  • SELECT_QUERY 可以包含注释或前导和尾随空格。在运行导出查询之前,系统会忽略注释并删除空格。
  • 如果目标存储桶与源集群位于不同区域,则会产生区域间数据传输费用。如需了解详情,请参阅 AlloyDB for PostgreSQL 价格
  • 可以并行运行多个导出操作。
  • 如果对象名称以 .gz 扩展名结尾,则启用压缩。然后,系统会将该对象以 .gz 格式导出到 Cloud Storage。
  • CSV 选项(例如 field_delimiterquote_characterescape_character)中的字符值仅允许使用十六进制代码中的 ASCII 字符(无论是否带有 0x 前缀)。

从 AlloyDB 导出所需的角色和权限

如需将数据从 AlloyDB 导出到 Cloud Storage,启动导出的用户必须拥有以下 Identity and Access Management (IAM) 角色之一:

此外,AlloyDB 集群的服务账号必须拥有以下角色之一:

  • storage.objectAdmin IAM 角色
  • 自定义角色,包括以下权限:
    • storage.objects.create

如需有关 IAM 角色的帮助,请参阅 Identity and Access Management

将数据导出到 CSV 文件

在 CSV 导出期间,您可以指定要导出的架构。数据库级层下的所有架构都可以导出。

您可以使用 gcloud CLI 或 REST API 自定义 CSV 文件格式。

gcloud

  1. 创建 Cloud Storage 存储桶
  2. 向服务账号授予对 Cloud Storage 存储桶的权限,以便执行导出操作。使用服务账号格式来确定要从中导出数据的项目的服务账号。服务账号的格式如下所示:

    service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com
  3. 使用 gcloud storage buckets add-iam-policy-binding 向服务账号授予 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限

  4. 将数据库导出到您的 Cloud Storage 存储桶。

    运行 CSV 导出命令:TODOgcloud alloydb clusters export

    下表列出了以 CSV 格式导出数据的选项:

    • --select-query(必需):用于提取数据的 select 查询。
    • --async(可选):立即返回,而无需等待正在进行的操作完成。
    • --field-delimiter(可选):指定文件中每行(线)中的列的分隔符。默认值为英文逗号。此参数的值必须是十六进制 ASCII 代码中的字符。
    • --quote-character(可选):指定在对数据值添加引号时要使用的引号字符。默认值为英文双引号。此参数的值必须是十六进制 ASCII 代码中的字符。
    • --escape-character(可选):指定必须出现在需要转义的数据字符之前的字符。默认值与 --quote-character 相同。此参数的值必须是十六进制 ASCII 代码中的字符。

    如需使用这些功能,请在 gcloud CLI 命令中添加这些选项。

    否则,请从以下命令中移除这些参数:

    gcloud alloydb clusters export CLUSTER_NAME
      --region=REGION
      --database=DATABASE_NAME
      --gcs-uri="gs://BUCKET_NAME/OBJECT_NAME"
      --select-query=SELECT_QUERY
      --field-delimiter=FIELD_DELIMITER
      --quote-character=QUOTE_CHARACTER
      --escape-character=ESCAPE_CHARACTER
      --csv
  5. 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。

REST v1

  1. 为导出创建一个存储桶:

    gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION_NAME --project=PROJECT_NAME>
  2. 使用服务账号格式来识别要从中导出数据的项目的服务账号。

    服务账号的格式如下所示:

     service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com

    此服务账号需要获得对 Cloud Storage 存储桶的权限,才能执行导出操作。

  3. 使用 gcloud storage buckets add-iam-policy-binding 向服务账号授予 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限

  4. 导出数据库。

    使用以下 HTTP 方法和网址:

    POST https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER_ID:export

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

    • PROJECT_ID:项目 ID。
    • REGION:AlloyDB 集群的部署区域。
    • CLUSTER_ID:集群 ID。
    • BUCKET_NAME:Cloud Storage 存储桶名称。
    • PATH_TO_CSV_FILE:CSV 文件的路径。
    • DATABASE_NAME:AlloyDB 集群中数据库的名称。
    • SELECT_QUERY:导出的 SQL 查询。

    • ESCAPE_CHARACTER(可选):需转义的数据字符之前必须显示的字符。此参数的值必须是十六进制 ASCII 代码中的字符。例如,22 表示双引号。

    • QUOTE_CHARACTER(可选):此标志表示包含字符串数据类型列中的值的字符。此参数的值必须是十六进制 ASCII 代码中的字符。例如,22 表示双引号。

    • FIELD_DELIMITER(可选):用于拆分列值的字符。此参数的值必须是十六进制 ASCII 代码中的字符。例如,2C 表示英文逗号。

    请求 JSON 正文:

    {
      "gcs_destination": {
        "uri": "gs://BUCKET_NAME/PATH_TO_CSV_FILE"
      },
      "database": "DATABASE_NAME",
      "csv_export_options": {
        "select_query": "SELECT_QUERY",
        "escape_character": "ESCAPE_CHARACTER",
        "quote_character": "QUOTE_CHARACTER",
        "field_delimiter": "FIELD_DELIMITER"
      }
    }
    

    如需发送请求,请使用以下任一方式:

curl(Linux、macOS 或 Cloud Shell)

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

       curl -X POST \
             -H "Authorization: Bearer $(gcloud auth print-access-token)" \
             -H "Content-Type: application/json; charset=utf-8" \
             -d @request.json \
             "https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER_ID:export"
  

PowerShell (Windows)

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
      -Method POST `
      -Headers $headers `
      -ContentType: "application/json; charset=utf-8" `
      -InFile request.json `
      -Uri "https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/clusters/CLUSTER_ID:export"| Select-Object -Expand Content
  

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

响应

    {
     "name": "projects/PROJECT_ID/locations/REGION/operations/OPERATION_ID",
     "metadata": {
      "@type": "type.googleapis.com/google.cloud.alloydb.v1.OperationMetadata",
      "createTime": "2024-09-17T06:05:31.244428646Z",
      "target": "projects/PROJECT_ID/locations/REGION/clusters/TARGET_CLUSTER",
      "verb": "export",
      "requestedCancellation": false,
      "apiVersion": "v1"
     },
     "done": false
    }
  

如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。

如需查看该请求的完整参数列表,请参阅 clusters:export

自定义 CSV 导出文件的格式

您可以使用 gcloud CLI 或 REST API 自定义 CSV 文件格式。执行导出时,您可以指定以下格式设置选项:


CSV 选项

默认值

gcloud 标志

REST API 属性

说明

退出

默认值与 QUOTE 值相同。
--escape-character escape_character 出现在需要转义的数据字符之前的字符。

引用
"22"
双引号的 ASCII 十六进制代码。
--quote-character quote_character 指定在对数据值进行引用时要使用的引号字符。
字段分隔符 "2C"
英文逗号的 ASCII 十六进制代码。
--field-delimiter field_delimiter 用于拆分列值的字符。

例如,使用所有这些参数的 gcloud CLI 命令可能如下所示:

gcloud alloydb clusters export CLUSTER_NAME \
--region=REGION \
--database=DATABASE_NAME \
--gcs-uri='gs://BUCKET_NAME/PATH_TO_CSV_FILE' \
--select-query=SELECT_QUERY \
--field-delimiter='2C' \
--quote-character='22' \
--escape-character='5C'
--csv

等效的 REST API 请求正文如下所示:

{
 "exportContext":
   {
      "gcs_destination": {
        "uri": "gs://BUCKET_NAME/PATH_TO_CSV_FILE",
      },
      "database": "DATABASE_NAME",
      "csv_export_options":
       {
           "select_query": "SELECT_QUERY",
           "escape_character": "5C",
           "quote_character": "22",
           "field_delimiter": "2C",
       }
   }
}

默认情况下,CSV 导出功能会创建标准 CSV 输出。如果您需要比 AlloyDB 提供的更多选项,可以在 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');

后续步骤