从 Cloud SQL 导出数据

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

导出操作会使用数据库资源,但不会干扰正常的数据库操作,除非实例预配不足。

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

CSV 和 mysqldump 导出在 Cloud SQL 中的行为与在任何其他 MySQL 数据库中一样。

准备工作

所需的角色和权限

如需将数据导出到 Cloud Storage,服务帐号或用户必须拥有以下角色组合之一:

  • Cloud SQL Editor 角色和 roles/storage.legacyBucketWriter IAM 角色。
  • 包括以下权限的自定义角色
    • cloudsql.instances.get
    • cloudsql.instances.export
    • storage.buckets.create
    • storage.objects.create

如果该服务帐号或用户也在执行导入操作,为方便操作,请授予 Storage Object Admin IAM 角色以获取导入和导出操作所需的所有权限。

如需有关 IAM 角色的帮助,请参阅适用于 Cloud Storage 的 Cloud Identity and Access Management

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

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

从 Cloud SQL 导出时,会将 mysqldump 实用程序与 --single-transaction--hex-blob 选项搭配使用。使用 --single-transaction 选项时,mysqldump 会在运行之前启动事务。这样, mysqldump 就可以读取当前状态的数据库,进而实现一致的数据转储,而不是锁定整个数据库。

如果您的 SQL 转储文件包含 DEFINER 子句(视图、触发器、stored_proceduce 等),则根据这些语句的执行顺序,使用此文件进行导入可能会失败中下载 Google 健身应用。详细了解 Cloud SQL 中的“DEFINER”用法以及可能的解决方法。

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

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击导出
  4. 文件格式部分中,点击 SQL 以创建 SQL 转储文件。
  5. 要导出的数据部分中,点击此实例中的一个或多个数据库以导出特定数据库。
  6. 使用下拉菜单选择要从中导出数据的数据库。
  7. 目标位置部分,选择浏览以搜索用于导出的 Cloud Storage 存储桶或文件夹。
  8. 点击导出开始导出。

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_1,[DATABASE_NAME_2…] \
    --table=TABLE_1,[TABLE_2…] \
    --offload
      

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

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

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

REST v1

  1. 为导出创建一个存储分区:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    

    此步骤并非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。

  2. 为您的实例提供存储桶的 legacyBucketWriter 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/v1/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 角色,请立即移除该角色。
如需查看此请求的完整参数列表,请参阅 instances:export 页面。

REST 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 角色,请立即撤消该角色。
如需查看此请求的完整参数列表,请参阅 instances:export 页面。

将 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. 点击显示高级选项
  8. 数据库部分中,从下拉菜单中选择数据库的名称。
  9. SQL 查询下,输入 SQL 查询,以指定要从中导出数据的表。

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

    SELECT * FROM guestbook.entries;
    您的查询必须在指定的数据库中指定一个表;您无法以 CSV 格式导出整个数据库。
  10. 点击导出以开始导出。
  11. 系统会打开“导出数据库?”对话框,提示大型数据库的导出过程可能需要一个小时或更长时间。在导出期间,您可在实例上执行的唯一操作是查看信息。导出操作一旦开始就无法停止。如果此时适合开始导出,请点击导出。否则,请点击取消

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 v1

  1. 为导出创建一个存储分区:
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    

    此步骤并非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。

  2. 为您的实例提供存储桶的 legacyBucketWriter 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/v1/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 响应:

    如果您的 select 查询指定了数据库,则它将替换 databases 属性。

  4. 如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。
如需查看此请求的完整参数列表,请参阅 instances:export 页面。

REST 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 响应:

    如果您的 select 查询指定了数据库,则它将替换 databases 属性。

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

以 CSV 格式导出等效于运行以下 SQL 语句:

      SELECT [QUERY] INTO OUTFILE ... CHARACTER SET 'utf8mb4'
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
            ESCAPED BY '\"' LINES TERMINATED BY '\n'

如需查看此请求的完整参数列表,请参阅 instances:export 页面。

将数据从本地 MySQL 服务器导出到 CSV 文件

如需将非 Cloud SQL 管理的 MySQL 数据库导出到 CSV 文件,以便稍后导入到 Cloud SQL,请使用以下命令:

mysql --host=INSTANCE_IP --user=USER_NAME --password DATABASE \
-e " SELECT * FROM TABLE INTOOUTFILE 'FILE_NAME' CHARACTER SET 'utf8mb4'
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' "

使用 mysqldump 从本地 MySQL 服务器导出数据

如果要从本地 MySQL 数据库导出数据以导入到 Cloud SQL 数据库,则必须将 mysqldump 实用程序与以下标志搭配使用:

  • --databases 必须使用 --databases 选项明确指定要导出的数据库列表,并且此列表不得包含 mysql 系统数据库。
  • --hex-blob 如果您的数据库包含任何二进制字段,则必须使用此标志来确保二进制字段正确导入。
  • --set-gtid-purged=OFF GTID 信息不得包含在 SQL 转储文件中,且 SQL 转储文件不得停用二进制日志记录。(MySQL 5.5 或外部复制无此要求。)
  • --single-transaction 在运行前启动事务。它不会锁定整个数据库,而是让 mysqldump 读取当前状态的数据库,从而形成一致的数据转储。

标准配置

从命令行运行 mysqldump

mysqldump --databases DATABASE_NAME -h INSTANCE_IP -u USERNAME -p \
--hex-blob --single-transaction --set-gtid-purged=OFF \
--default-character-set=utf8mb4 > SQL_FILE.sql

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

外部复制

如需创建转储文件以在外部服务器配置中使用,请参阅从外部服务器复制

自动执行导出操作

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

问题排查

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

使用 CSV 导出以仅导出您需要的文件。

导出时间太长。 Cloud SQL 不支持并发同步操作。

使用导出分流。概括来讲,在进行导出分流时,Cloud SQL 会启动一个分流实例来执行导出,而不是在源实例上发起导出。导出分流具有多项优势,包括可提高源实例的性能,以及在导出操作期间取消屏蔽管理操作。使用导出分流时,总延迟时间会增加,因为启动分流实例需要时间。通常,对于规模合理的导出,延迟时间并不明显。但是,如果导出作业足够小,那么您可能会发现延迟时间有所增加。

导出操作在导出任何内容之前超时,并显示错误消息 Could not receive data from client: Connection reset by peer. 如果 Cloud Storage 在特定时间范围内(通常是大约七分钟内)未收到任何数据,则连接会重置。初始导出查询的运行时间可能过长。

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

您可能会希望自动执行导出。 Cloud SQL 不提供自动执行导出的方法。

您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Functions 等 Google Cloud 产品构建自己的自动导出系统,类似自动备份一文所述。

后续步骤