导出操作会使用数据库资源,但不会干扰正常的数据库操作,除非实例预配不足。
如需了解导出数据的最佳做法,请参阅导入和导出数据的最佳做法。
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 转储文件,请执行以下操作:
控制台
- 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。
- 点击要从中导出数据的实例,以打开其概览页面。
- 点击按钮栏中的导出。
- 在文件格式下,点击 SQL 以创建 SQL 转储文件。
- 在要导出的数据下,点击此实例中的一个或多个数据库以导出特定数据库。
- 使用下拉菜单选择要从中导出数据的数据库。
- 在目标位置下,选择浏览以搜索用于导出的 Cloud Storage 存储分区或文件夹。
- 点击导出开始导出。
gcloud
-
创建 Cloud Storage 存储分区(如果您尚未创建)。
有关创建存储分区方面的帮助信息,请参阅创建存储分区。
将文件上传到存储分区。
如需有关将文件上传到存储分区的帮助,请参阅上传对象。
- 描述要从中进行导出的实例:
gcloud sql instances describe [INSTANCE_NAME]
- 复制 serviceAccountEmailAddress 字段。
- 使用
gsutil iam
向服务帐号授予该存储分区的storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 导出数据库:
gcloud sql export sql [INSTANCE_NAME] gs://[BUCKET_NAME]/sqldumpfile.gz \ --database=[DATABASE_NAME] --offload
export sql
命令不包含触发器或存储过程,但包含视图。如需导出触发器和/或存储过程,请使用 mysqldump 工具。如需详细了解如何使用
export sql
命令,请参阅sql export sql
命令参考页面。 - 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
REST v1beta4
- 为导出创建一个存储分区:
gsutil mb -p [PROJECT_NAME] -l [LOCATION_NAME] gs://[BUCKET_NAME]
此步骤并非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。
- 为您的实例提供存储分区的
storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 导出数据库:
在使用下面的任何请求数据之前,请先进行以下替换:
- 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 响应:
- 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
将 Cloud SQL 中的数据导出到 Cloud Storage 中的 CSV 文件
您可使用 CSV 格式导出数据,以供其他工具和环境使用。导出操作在数据库级层进行。在 CSV 导出期间,您可以指定要导出的架构。数据库级层下的所有架构都可以导出。
如需将 Cloud SQL 实例上的数据库数据导出到 Cloud Storage 存储分区中的 SQL 转储文件,请执行以下操作:
控制台
- 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。
- 点击实例打开其概览页面。
- 点击导出。
- 在 Cloud Storage 导出位置下,选择导出的目标 Cloud Storage 存储分区或文件夹。
-
在名称字段中,为导出文件提供一个名称,然后点击选择。
您可以使用
.gz
的文件扩展名来压缩导出文件。 - 将格式设置为 CSV。
- 点击显示高级选项。
- 在数据库下,从下拉菜单中选择数据库的名称。
-
在 SQL 查询下,输入 SQL 查询,以指定要从中导出数据的表。
例如,如需导出
guestbook
数据库中entries
表的全部内容,请输入以下内容:SELECT * FROM guestbook.entries;
您的查询必须在指定的数据库中指定一个表;您无法以 CSV 格式导出整个数据库。 - 点击导出以开始导出。
- 系统会打开“导出数据库?”对话框,提示大型数据库的导出过程可能需要一个小时或更长时间。在导出期间,您可在实例上执行的唯一操作是查看信息。导出操作一旦开始就无法停止。如果此时适合开始导出,请点击导出。否则,请点击取消。
gcloud
-
创建 Cloud Storage 存储分区(如果您尚未创建)。
有关创建存储分区方面的帮助信息,请参阅创建存储分区。
将文件上传到存储分区。
如需有关将文件上传到存储分区的帮助,请参阅上传对象。
- 描述要从中导出数据的实例:
gcloud sql instances describe [INSTANCE_NAME]
- 使用
gsutil iam
向服务帐号授予该存储分区的storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 导出数据库:
gcloud sql export csv [INSTANCE_NAME] gs://[BUCKET_NAME]/[FILE_NAME] \ --database=[DATABASE_NAME] \ --offload \ --query=[SELECT_QUERY]
如需了解如何使用
export csv
命令,请参阅sql export csv
命令参考页面。 - 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
REST v1beta4
- 为导出创建一个存储分区:
gsutil mb -p [PROJECT_NAME] -l [LOCATION_NAME] gs://[BUCKET_NAME]
此步骤并非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。
- 为您的实例提供存储分区的
storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 -
导出数据库:
在使用下面的任何请求数据之前,请先进行以下替换:
- 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
属性。 - 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
以 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 权限。
- 数据库表可能不存在。
可以尝试的操作
- 检查核实您对存储分区至少拥有
WRITER
权限,并且对导出文件至少拥有READER
权限。如需详细了解如何在 Cloud Storage 中配置访问权限控制,请参阅创建和管理访问权限控制列表。 - 确保表已存在。如果表已存在,请确认您对存储分区拥有正确的权限。
访问遭拒;您需要(至少其中一种)SUPER 特权才能执行此操作
您会看到错误 Access denied; you need (at least one of) the SUPER privilege(s) for this operation
。
可能的原因
转储文件中可能有使用 super user@localhost(例如 root@localhost)的事件、视图、函数或过程。Cloud SQL 不支持此功能。
可以尝试的操作
如需了解如何使用 DEFINER
子句导入数据库,请参阅此文档。
后续步骤
- 了解如何查看导入和导出操作的状态。
- 详细了解导入和导出数据的最佳做法。
- 详细了解 Cloud Storage。