从 Cloud SQL 导出数据

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

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

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

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

准备工作

确保您已配置所需的角色和权限。

如需将数据导出到 Cloud Storage,实例的服务帐号或用户必须具有 Cloud SQL Editor 角色或自定义角色(包括 cloudsql.instances.export 权限),并且至少具有 roles/storage.legacyBucketWriter IAM 角色。

如果该服务帐号或用户也执行导入操作,则您可以向相应帐号授予在项目中设置的 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 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. 描述要从中进行导出的实例:
      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.gz \
                                  --database=[DATABASE_NAME] --offload
      

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

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

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

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://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"]
          "offload": true | false
        }
    }
    

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

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

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

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

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

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

控制台

  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. 描述要从中导出数据的实例:
    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 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://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"],
          "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] INTO OUTFILE '[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 组件构建自己的自动化工具。如需了解详情,请参阅本教程

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
无法查看当前操作状态。 用户界面仅显示成功或失败。 使用相关数据库命令了解详情。
在导出过程中出现 408 Error (Timeout) SQL 导出可能需要很长时间,具体取决于数据库大小和导出内容。 使用多个 CSV 导出以减小每项操作的规模
CSV 导出成功,但 SQL 导出失败。 SQL 导出更有可能遇到 Cloud SQL 的兼容性问题。 使用 CSV 导出以仅导出您需要的文件。
导出时间太长。 Cloud SQL 不支持并发同步操作。 使用导出分流。了解详情
Error 1412: Table definition has changed 导出期间表发生了更改。 从转储操作中移除任何表更改语句
连接在导出操作期间关闭。 查询必须在前 7 分钟内生成数据。 手动测试查询。了解详情
导出过程中出现未知错误。 可能存在带宽问题。 确保实例和 Cloud Storage 存储分区位于同一区域
您想要自动执行导出。 Cloud SQL 不提供自动执行导出的方法。 构建您自己的流水线来执行此功能。了解详情
错误消息:Access denied; you need (at least one of) the SUPER privilege(s) for this operation 转储文件中可能有使用 super user@localhost(例如 root@localhost)的事件、视图、函数或过程。Cloud SQL 不支持此功能。 详细了解 Cloud SQL 中的 DEFINER 用法以及可能的解决方法。

无法查看操作状态

您无法查看正在进行的操作的状态。

可能的原因

Google Cloud Console 在完成后仅报告成功或失败,不会返回警告。

可以尝试的操作

连接到数据库并运行 SHOW WARNINGS


导出过程中出现 408 错误(超时)

您在 Cloud SQL 中执行导出作业时看到错误消息 408 Error (Timeout)

可能的原因

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

可以尝试的操作

使用 CSV 格式,并运行多个较小的导出作业,以减小每项操作的规模和长度。


CSV 导出成功,但 SQL 导出失败

CSV 导出成功,但 SQL 导出失败。

可能的原因

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

可以尝试的操作

使用 CSV 导出以仅导出您需要的内容。


导出时间太长

导出时间太长,阻止了其他操作。

可能的原因

Cloud SQL 不支持并发同步操作。

可以尝试的操作

尝试一次导出较小的数据集。


mysqldump:错误 1412:表定义已更改

您看到错误消息 mysqldump: Error 1412: Table definition has changed, retry transaction when dumping the table

可能的原因

在导出过程中,表发生了更改。

可以尝试的操作

如果在导出操作期间使用以下语句,则转储事务可能会失败:

  • ALTER TABLE
  • CREATE TABLE
  • DROP TABLE
  • RENAME TABLE
  • TRUNCATE TABLE
从转储操作中移除所有这些语句。


连接在导出操作期间关闭

连接在导出操作期间关闭。

可能的原因

与 Cloud Storage 的连接可能超时,因为在导出中运行的查询在导出启动后的 7 分钟内未生成任何数据。

可以尝试的操作

手动测试查询,方法是从任何客户端连接,然后使用以下命令将查询的输出发送到 STDOUT:

COPY (INSERT_YOUR_QUERY_HERE) TO STDOUT WITH ( FORMAT csv, DELIMITER ',', ENCODING 'UTF8', QUOTE '"', ESCAPE '"' )

这是预期行为,因为启动导出后,客户端应立即开始发送数据。在未发送数据情况下保持连接最终会断开连接,最后导致导出失败,使操作处于不确定状态。此外,以下是来自 gcloud 的错误消息:

operation is taking longer than expected


导出过程中出现未知错误

您在尝试将数据库导出到 Cloud Storage 存储分区时看到错误消息 Unknown error

可能的原因

转移可能由于带宽问题失败。

可以尝试的操作

Cloud SQL 实例可能与 Cloud Storage 存储分区位于不同区域。从一个大洲读取数据并将数据写入另一个大洲涉及很多网络用量,可能会导致类似的问题。检查实例和存储分区所在的区域。


想要自动执行导出

您想要自动执行导出。

可能的原因

Cloud SQL 不提供自动执行导出的方法。

可以尝试的操作

您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Functions 等 Google Cloud 产品构建自己的自动导出系统。


出现 ERROR_RDBMS 系统错误

您看到错误消息 [ERROR_RDBMS] system error occurred

可能的原因

  • 用户可能没有所需的所有 Cloud Storage 权限。
  • 数据库表可能不存在。

可以尝试的操作

  1. 检查核实您对存储分区至少拥有 WRITER 权限,并且对导出文件至少拥有 READER 权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问权限控制列表
  2. 确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。

访问遭拒;您需要(至少其中一种)SUPER 特权才能执行此操作

您会看到错误 Access denied; you need (at least one of) the SUPER privilege(s) for this operation

可能的原因

转储文件中可能有使用 super user@localhost(例如 root@localhost)的事件、视图、函数或过程。Cloud SQL 不支持此功能。

可以尝试的操作

如需了解如何使用 DEFINER 子句导入数据库,请参阅此文档

后续步骤