并行导出和导入文件

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

须知事项

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

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

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

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

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

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

如需将数据从 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。为此,请使用 dumpInstance 实用程序。

文件导出到 Cloud Storage 后,您可以将其导入另一个 Cloud SQL 数据库。如果要在本地访问文件中的数据,请将数据从 Cloud Storage 下载到本地环境。

如果您的文件包含 DEFINER 子句(视图、触发器、stored_procedures 等),则根据这些语句的运行顺序,使用这些文件进行导入可能会失败。详细了解 Cloud SQL 中的 DEFINER 用法以及可能的解决方法。

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 实例中的数据库的名称,您将从该数据库执行导出。如果您未指定任何数据库,则 Cloud SQL 会导出实例的所有数据库。
    • TABLE_EXPRESSION:要从指定数据库导出的表。

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

    导出完成后,Cloud Storage 存储桶中的文件夹应包含 MySQL Shell 转储格式的文件。

  6. 如果您不需要在从 Cloud SQL for MySQL 导出所需的角色和权限中设置的 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 实例中的数据库的名称,您将从该数据库执行导出。如果您未指定任何数据库,则 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 存储桶中的文件夹应包含 MySQL Shell 转储格式的文件。

  5. 如果您不需要在从 Cloud SQL for MySQL 导出所需的角色和权限中设置的 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 实例中的数据库的名称,您将从该数据库执行导出。如果您未指定任何数据库,则 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 存储桶中的文件夹应包含 MySQL Shell 转储格式的文件。

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

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

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

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

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

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

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

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

将数据导入到 Cloud SQL for MySQL

您可以将 Cloud Storage 中多个文件的数据并行导入到数据库中。为此,请使用 loadDump 实用程序。

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 实例中的数据库的名称,您将从该数据库执行导入。如果您未指定任何数据库,则 Cloud SQL 会导入实例的所有数据库。

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

  7. 如果您不需要在导入 Cloud SQL for MySQL 所需的角色和权限中设置的 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 实例中的数据库的名称,您将从该数据库执行导入。如果您未指定任何数据库,则 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 响应:

    如需查看请求参数的完整列表,请参阅 Cloud SQL Admin API 页面。
  5. 如果您不需要在导入 Cloud SQL for MySQL 所需的角色和权限中设置的 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 实例中的数据库的名称,您将从该数据库执行导入。如果您未指定任何数据库,则 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 响应:

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

限制

  • 如果在并行导入或导出多个文件中的数据时指定过多线程,则内存用量可能会超过 Cloud SQL 实例拥有的内存。如果发生这种情况,系统会显示内部错误消息。请检查实例的内存用量,并根据需要增加实例的大小。如需了解详情,请参阅实例设置简介
  • 执行导出时,不支持在 databasestables 字段中的数据库名称或表名称中使用英文逗号。
  • 请确保您有足够的磁盘可用空间用于下载初始转储文件。否则,系统会显示 no space left on disk 错误。
  • 如果实例只有一个虚拟 CPU (vCPU),则无法并行导入或导出多个文件。实例的 vCPU 数不能小于用于导入或导出操作的线程数,并且线程数必须至少为 2。
  • 如果您在导出操作期间写入了数据定义语言 (DDL) 语句(例如 CREATEDROPALTER),则操作可能会失败,或者导出的数据可能与时间点恢复快照不一致。
  • 如果导入操作失败,有可能导入了部分数据。对于 DDL 语句,MySQL 会自动提交。如果发生这种情况,请在再次导入数据之前清理部分数据。

后续步骤