并行导出和导入文件

本页面介绍如何将文件并行导出和导入 Cloud SQL 实例。

须知事项

在开始导出或导入操作之前,请先做好以下准备工作:

  • 确保您的数据库具有足够的可用空间。
  • 导出和导入操作会使用数据库资源,但不会干扰典型的数据库操作,除非实例预配不足。

  • 遵循导出和导入数据的最佳做法
  • 完成导入操作后,请验证结果。

将数据从 Cloud SQL for PostgreSQL 并行导出到多个文件

以下部分介绍如何将数据从 Cloud SQL for PostgreSQL 并行导出到多个文件。

将数据从 Cloud SQL for PostgreSQL 并行导出到多个文件所需的角色和权限

如需将数据从 Cloud SQL 导出到 Cloud Storage 中,启动导出的用户必须拥有以下角色之一:

此外,Cloud SQL 实例的服务账号必须拥有以下角色之一:

  • storage.objectAdmin Identity and Access Management (IAM) 角色
  • 包括以下权限的自定义角色:
    • storage.objects.create
    • storage.objects.list(仅用于并行导出文件)
    • storage.objects.delete(仅用于并行导出文件)

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

将数据并行导出到多个文件

您可以将 Cloud SQL 中多个文件中的数据并行导出到 Cloud Storage。为此,请将 pg_dump 实用程序与 --jobs 选项搭配使用。

如果您打算将数据导入 Cloud SQL,请按照从外部数据库服务器导出数据中的说明操作,以便使文件格式适合 Cloud SQL。

gcloud

如需将数据从 Cloud SQL 并行导出到多个文件,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶
  2. 如需查找要导出文件的 Cloud SQL 实例的服务账号,请使用
    gcloud sql instances describe 命令。
    gcloud sql instances describe INSTANCE_NAME
    
  3. INSTANCE_NAME 替换为您的 Cloud SQL 实例的名称。

    在输出中,查找与 serviceAccountEmailAddress 字段关联的值。

  4. 如需向服务账号授予 storage.objectAdmin IAM 角色,请使用 gsutil iam 实用程序。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  5. 如需将数据从 Cloud SQL 并行导出到多个文件,请使用 gcloud sql export sql 命令:
    gcloud sql export sql INSTANCE_NAME gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME \
    --offload \
    --parallel \
    --threads=THREAD_NUMBER \
    --database=DATABASE_NAME \
    --table=TABLE_EXPRESSION
    

    进行以下替换:

    • INSTANCE_NAME:要并行导出文件的 Cloud SQL 实例的名称。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导出文件的存储桶的路径。
    • FOLDER_NAME:存储导出文件的文件夹。
    • THREAD_NUMBER:Cloud SQL 用于并行导出文件的线程数。例如,如果要同时导出三个文件,请指定 3 作为此参数的值。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导出。您只能指定一个数据库。
    • TABLE_EXPRESSION:要从指定数据库导出的表。

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

    导出完成后,Cloud Storage 存储桶中的文件夹应包含 pg_dump 目录格式的文件。

  6. 如果您不需要在从 Cloud SQL for PostgreSQL 导出所需的角色和权限中设置的 IAM 角色,请撤销该角色。

REST v1

如需将数据从 Cloud SQL 并行导出到多个文件,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶,请运行以下命令:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    
    进行以下替换:
    • PROJECT_NAME:包含您要创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • LOCATION_NAME:要存储导出文件的存储桶的位置。例如 us-east1
    • BUCKET_NAME:存储桶的名称(须遵循命名要求)。例如 my-bucket
  2. 为您的实例提供存储桶的 legacyBucketWriter IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  3. 将数据从 Cloud SQL 并行导出到多个文件:

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

    • PROJECT_NAME:包含您创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • INSTANCE_NAME:要并行导出文件的 Cloud SQL 实例的名称。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导出文件的存储桶的路径。
    • FOLDER_NAME:存储导出文件的文件夹。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导出。您只能指定一个数据库。
    • THREAD_NUMBER:Cloud SQL 用于并行导出文件的线程数。例如,如果要同时导出三个文件,请指定 3 作为此参数的值。

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/v1/projects/PROJECT_NAME/instances/INSTANCE_NAME/export

    请求 JSON 正文:

    {
     "exportContext":
       {
          "fileType": "SQL",
          "uri": "gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME",
          "databases": ["DATABASE_NAME"],
          "offload": [TRUE|FALSE],
          "sqlExportOptions": {
            "parallel": [TRUE|FALSE],
            "threads": [THREAD_NUMBER]
           }
       }
    }
    

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

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

  4. 导出完成后,Cloud Storage 存储桶中的文件夹应包含 pg_dump 目录格式的文件。

  5. 如果您不需要在从 Cloud SQL for PostgreSQL 导出所需的角色和权限中设置的 IAM 角色,请撤销该角色。
如需查看请求参数的完整列表,请参阅 Cloud SQL Admin API 页面。

REST v1beta4

如需将数据从 Cloud SQL 并行导出到多个文件,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶,请运行以下命令:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    
    进行以下替换:
    • PROJECT_NAME:包含您要创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • LOCATION_NAME:要存储导出文件的存储桶的位置。例如 us-east1
    • BUCKET_NAME:存储桶的名称(须遵循命名要求)。例如 my-bucket
  2. 为您的实例提供存储桶的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  3. 将数据从 Cloud SQL 并行导出到多个文件:

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

    • PROJECT_NAME:包含您创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • INSTANCE_NAME:要并行导出文件的 Cloud SQL 实例的名称。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导出文件的存储桶的路径。
    • FOLDER_NAME:存储导出文件的文件夹。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导出。您只能指定一个数据库。
    • THREAD_NUMBER:Cloud SQL 用于并行导出文件的线程数。例如,如果要同时导出三个文件,请指定 3 作为此参数的值。

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_NAME/instances/INSTANCE_NAME/export

    请求 JSON 正文:

    {
     "exportContext":
       {
          "fileType": "SQL",
          "uri": "gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME",
          "databases": ["DATABASE_NAME"],
          "offload": [TRUE|FALSE],
          "sqlExportOptions": {
            "parallel": [TRUE|FALSE],
            "threads": [THREAD_NUMBER]
           }
       }
    }
    

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

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

  4. 导出完成后,Cloud Storage 存储桶中的文件夹应包含 pg_dump 目录格式的文件。

  5. 如果您不需要在从 Cloud SQL for PostgreSQL 导出所需的角色和权限中设置的 IAM 角色,请撤销该角色。
如需查看请求参数的完整列表,请参阅 Cloud SQL Admin API 页面。

将多个文件中的数据并行导入 Cloud SQL for PostgreSQL

以下部分介绍如何将多个文件中的数据并行导入 Cloud SQL for PostgreSQL。

将多个文件中的数据并行导入 Cloud SQL for PostgreSQL 所需的角色和权限

如需将数据从 Cloud Storage 导入到 Cloud SQL 中,启动导入的用户必须拥有以下角色之一:

此外,Cloud SQL 实例的服务账号必须拥有以下角色之一:

  • storage.objectAdmin IAM 角色
  • 包括以下权限的自定义角色:
    • storage.objects.get
    • storage.objects.list(仅用于并行导入文件)

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

将数据导入到 Cloud SQL for PostgreSQL

您可以将 Cloud Storage 中多个文件的数据并行导入到数据库中。为此,请将 pg_restore 实用程序与 --jobs 选项搭配使用。

gcloud

如需将多个文件中的数据并行导入 Cloud SQL,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶
  2. 将文件上传到存储桶。

    如需有关将文件上传到存储桶方面的帮助,请参阅从文件上传对象

  3. 如需查找要导入文件的 Cloud SQL 实例的服务账号,请使用
    gcloud sql instances describe 命令。
    gcloud sql instances describe INSTANCE_NAME
    
  4. INSTANCE_NAME 替换为您的 Cloud SQL 实例的名称。

    在输出中,查找与 serviceAccountEmailAddress 字段关联的值。

  5. 如需向服务账号授予 storage.objectAdmin IAM 角色,请使用 gsutil iam 实用程序。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  6. 如需将多个文件中的数据并行导入 Cloud SQL,请使用 gcloud sql import sql 命令:
    gcloud sql import sql INSTANCE_NAME gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME \
    --offload \
    --parallel \
    --threads=THREAD_NUMBER \
    --database=DATABASE_NAME
    

    进行以下替换:

    • INSTANCE_NAME:Cloud SQL 实例的名称,您将向其中并行导入文件。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导入文件的存储桶的路径。
    • FOLDER_NAME:存储导入文件的文件夹。
    • THREAD_NUMBER:Cloud SQL 用于并行导入文件的线程数。例如,如果要同时导入三个文件,请指定 3 作为此参数的值。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导入。您只能指定一个数据库。

    如果该命令返回 ERROR_RDBMS 之类的错误,请检查权限;此类错误通常是由权限问题导致的。

  7. 如果您不需要在导入 Cloud SQL for PostgreSQL 所需的角色和权限中设置的 IAM 权限,请使用 gsutil iam 移除相应权限。

REST v1

如需将多个文件中的数据并行导入 Cloud SQL,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶,请运行以下命令:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    
    进行以下替换:
    • PROJECT_NAME:包含您要创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • LOCATION_NAME:要存储导入文件的存储桶的位置。例如 us-east1
    • BUCKET_NAME:存储桶的名称(须遵循命名要求)。例如 my-bucket
  2. 将文件上传到存储桶。

    如需有关将文件上传到存储桶方面的帮助,请参阅从文件上传对象

  3. 为您的实例提供存储桶的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  4. 将多个文件中的数据并行导入 Cloud SQL:

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

    • PROJECT_NAME:包含您创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • INSTANCE_NAME:Cloud SQL 实例的名称,您将向其中并行导入文件。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导入文件的存储桶的路径。
    • FOLDER_NAME:存储导入文件的文件夹。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导入。您只能指定一个数据库。
    • THREAD_NUMBER:Cloud SQL 用于并行导入文件的线程数。例如,如果要同时导入三个文件,请指定 3 作为此参数的值。

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/v1/projects/PROJECT_NAME/instances/INSTANCE_NAME/import

    请求 JSON 正文:

    {
     "importContext":
       {
          "fileType": "SQL",
          "uri": "gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME",
          "databases": ["DATABASE_NAME"],
          "offload": [TRUE|FALSE],
          "sqlImportOptions": {
            "parallel": [TRUE|FALSE],
            "threads": [THREAD_NUMBER]
           }
       }
    }
    

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

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

    如需使用其他用户身份执行导入操作,请指定 importContext.importUser 属性。

    如需查看请求参数的完整列表,请参阅 Cloud SQL Admin API 页面。
  5. 如果您不需要在导入 Cloud SQL for PostgreSQL 所需的角色和权限中设置的 IAM 权限,请使用 gsutil iam 移除相应权限。

REST v1beta4

如需将多个文件中的数据并行导入 Cloud SQL,请完成以下步骤:

  1. 创建 Cloud Storage 存储桶,请运行以下命令:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    
    进行以下替换:
    • PROJECT_NAME:包含您要创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • LOCATION_NAME:要存储导入文件的存储桶的位置。例如 us-east1
    • BUCKET_NAME:存储桶的名称(须遵循命名要求)。例如 my-bucket
  2. 将文件上传到存储桶。

    如需有关将文件上传到存储桶方面的帮助,请参阅从文件上传对象

  3. 为您的实例提供存储桶的 storage.objectAdmin IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限
  4. 将多个文件中的数据并行导入 Cloud SQL:

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

    • PROJECT_NAME:包含您创建的 Cloud Storage 存储桶的 Google Cloud 项目的名称。
    • INSTANCE_NAME:Cloud SQL 实例的名称,您将从其并行导入文件。
    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • BUCKET_PATH:存储导入文件的存储桶的路径。
    • FOLDER_NAME:存储导入文件的文件夹。
    • DATABASE_NAME:Cloud SQL 实例中的数据库的名称,您将从该数据库执行导入。您只能指定一个数据库。
    • THREAD_NUMBER:Cloud SQL 用于并行导入文件的线程数。例如,如果要同时导入三个文件,请指定 3 作为此参数的值。

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_NAME/instances/INSTANCE_NAME/import

    请求 JSON 正文:

    {
     "importContext":
       {
          "fileType": "SQL",
          "uri": "gs://BUCKET_NAME/BUCKET_PATH/FOLDER_NAME",
          "databases": ["DATABASE_NAME"],
          "offload": [TRUE|FALSE],
          "sqlImportOptions": {
            "parallel": [TRUE|FALSE],
            "threads": [THREAD_NUMBER]
           }
       }
    }
    

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

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

    如需使用其他用户身份执行导入操作,请指定 importContext.importUser 属性。

    如需查看请求参数的完整列表,请参阅 Cloud SQL Admin API 页面。
  5. 如果您不需要在导入 Cloud SQL for PostgreSQL 所需的角色和权限中设置的 IAM 权限,请使用 gsutil iam 移除相应权限。

限制

  • 如果在并行导入或导出多个文件中的数据时指定过多线程,则内存用量可能会超过 Cloud SQL 实例拥有的内存。如果发生这种情况,系统会显示内部错误消息。请检查实例的内存用量,并根据需要增加实例的大小。如需了解详情,请参阅实例设置简介
  • 执行导出时,不支持在 databasestables 字段中的数据库名称或表名称中使用英文逗号。
  • 请确保您有足够的磁盘可用空间用于下载初始转储文件。否则,系统会显示 no space left on disk 错误。
  • 如果实例只有一个虚拟 CPU (vCPU),则无法并行导入或导出多个文件。实例的 vCPU 数不能小于用于导入或导出操作的线程数,并且线程数必须至少为 2。
  • pg_dump 实用程序无法对导出的任何表进行分块。因此,如果您的表非常大,则可能会成为导出操作速度的瓶颈。

后续步骤