本页面介绍如何将 Cloud SQL 实例数据导出为 SQL 转储文件以及使用 SQL 转储文件将数据导入 Cloud SQL 实例。
须知事项
导出操作会使用数据库资源,但不会干扰正常的数据库操作,除非实例预配不足。
如需最佳实践,请参阅导入和导出数据的最佳实践。
完成导入操作后,请验证结果。
从 Cloud SQL for MySQL 导出数据
从 Cloud SQL for MySQL 导出所需的角色和权限
如需将数据从 Cloud SQL 导出到 Cloud Storage 中,启动导出的用户必须拥有以下角色之一:
- Cloud SQL Editor 角色
- 包括以下权限的自定义角色:
cloudsql.instances.get
cloudsql.instances.export
此外,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 for MySQL 导出到 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 等),则根据这些语句的执行顺序,使用此文件进行导入可能会失败。详细了解 Cloud SQL 中的 DEFINER 用法以及可能的解决方法。
如需将 Cloud SQL 实例上的数据库数据导出到 Cloud Storage 存储桶中的 SQL 转储文件,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 点击导出。
- 在文件格式部分中,点击 SQL 以创建 SQL 转储文件。
- 在要导出的数据部分中,点击此实例中的一个或多个数据库以导出特定数据库。
- 使用下拉菜单选择要从中导出数据的数据库。
- 在目标位置部分,选择浏览以搜索用于导出的 Cloud Storage 存储桶或文件夹。
- 点击导出开始导出。
gcloud
- 创建 Cloud Storage 存储桶。
- 找到要从中导出数据的 Cloud SQL 实例的服务账号。为此,您可以运行
gcloud sql instances describe
命令。在输出中查找serviceAccountEmailAddress
字段。gcloud sql instances describe INSTANCE_NAME
- 使用
gcloud storage buckets add-iam-policy-binding
向服务账号授予storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 将数据库导出到 Cloud Storage 存储桶:
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 v1
- 为导出创建一个存储桶:
gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_NAME --location=LOCATION_NAME
此步骤非必需,但强烈建议执行此步骤,确保您不会访问任何其他数据。
- 为您的实例提供存储桶的
legacyBucketWriter
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 实例中数据库的名称
- 如果您不需要保留之前设置的 IAM 角色,请立即移除该角色。
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 响应:
REST v1beta4
- 为导出创建一个存储桶:
gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_NAME --location=LOCATION_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 实例中数据库的名称
- 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
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 响应:
使用 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 for MySQL
如需创建转储文件以在外部服务器配置中使用,请参阅从外部服务器复制。
将数据导入到 Cloud SQL for MySQL
导入到 Cloud SQL for MySQL 所需的角色和权限
如需将数据从 Cloud Storage 导入到 Cloud SQL 中,启动导入的用户必须拥有以下角色之一:
- Cloud SQL Admin 角色
- 包括以下权限的自定义角色:
cloudsql.instances.get
cloudsql.instances.import
此外,Cloud SQL 实例的服务账号必须拥有以下角色之一:
storage.objectAdmin
IAM 角色- 包括以下权限的自定义角色:
storage.objects.get
storage.objects.list
(仅用于并行导入文件)
如需有关 IAM 角色的帮助,请参阅 Identity and Access Management。
将 SQL 转储文件导入 Cloud SQL for MySQL
SQL 文件是包含一系列 SQL 命令的纯文本文件。
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 点击导入。
- 在选择您要从中导入数据的文件部分中,输入要用于导入的存储桶和 SQL 转储文件的路径,或浏览到现有文件。
您可以导入经过压缩 (
.gz
) 或未经压缩 (.sql
) 的文件。 - 对于格式,请选择 SQL。
选择要导入数据的数据库。
这样,Cloud SQL 会在导入数据之前运行
USE DATABASE
语句。如果要指定用户来执行导入,请选择该用户。
如果导入文件包含必须由特定用户执行的语句,请使用此字段指定该用户。
- 点击导入以开始导入。
gcloud
- 创建 Cloud Storage 存储桶。
将文件上传到存储桶。
如需有关将文件上传到存储桶方面的帮助,请参阅上传对象。
- 描述要向其中导入数据的实例:
gcloud sql instances describe INSTANCE_NAME
- 复制
serviceAccountEmailAddress
字段。 - 使用
gcloud storage buckets add-iam-policy-binding
向服务账号授予该存储桶的storage.objectAdmin
IAM 角色。 如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE-ACCOUNT \ --role=roles/storage.objectAdmin
- 导入数据库:
gcloud sql import sql INSTANCE_NAME gs://BUCKET_NAME/IMPORT_FILE_NAME \ --database=DATABASE_NAME
如需了解如何使用
import sql
命令,请参阅sql import sql
命令参考页面。如果该命令返回
ERROR_RDBMS
之类的错误,请检查权限;此类错误通常是由权限问题导致的。 - 如果您不需要保留之前设置的 IAM 权限,请使用
gcloud storage buckets remove-iam-policy-binding
移除这些权限。
REST v1
-
创建 SQL 转储文件。链接中的说明会设置特定标志,使转储文件与 Cloud SQL 兼容。
- 如果要从本地 MySQL 服务器导入数据,请执行以下操作:
- 创建 SQL 转储文件。
- 在 Cloud Storage 中创建存储桶。
- 将 SQL 转储文件上传到 Cloud Storage 存储桶。
- 如果您要从其他 Cloud SQL 实例导入数据,请参阅将 Cloud SQL 中的数据导出到 SQL 转储文件中的说明。
- 创建 Cloud Storage 存储桶。
将文件上传到存储桶。
如需有关将文件上传到存储桶方面的帮助,请参阅上传对象。
- 为您的实例提供存储桶的
legacyBucketWriter
和objectViewer
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 导入转储文件:
在使用任何请求数据之前,请先进行以下替换:
- project-id:项目 ID
- instance-id:实例 ID
- bucket_name:Cloud Storage 存储桶名称
- path_to_sql_file:SQL 文件的路径
- database_name:Cloud SQL 实例中数据库的名称
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/import
请求 JSON 正文:
{ "importContext": { "fileType": "SQL", "uri": "gs://bucket_name/path_to_sql_file", "database": "database_name" } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
如需查看请求的完整参数列表,请参阅 instances:import 页面。 - 如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。
REST v1beta4
-
创建 SQL 转储文件。链接中的说明会设置特定标志,使转储文件与 Cloud SQL 兼容。
- 如果要从本地 MySQL 服务器导入数据,请执行以下操作:
- 创建 SQL 转储文件。
- 在 Cloud Storage 中创建存储桶。
- 将 SQL 转储文件上传到 Cloud Storage 存储桶。
- 如果您要从其他 Cloud SQL 实例导入数据,请参阅将 Cloud SQL 中的数据导出到 SQL 转储文件中的说明。
- 创建 Cloud Storage 存储桶。
将文件上传到存储桶。
如需有关将文件上传到存储桶方面的帮助,请参阅上传对象。
- 为您的实例提供存储桶的
storage.objectAdmin
IAM 角色。如需有关设置 IAM 权限的帮助,请参阅使用 IAM 权限。 - 导入转储文件:
在使用任何请求数据之前,请先进行以下替换:
- project-id:项目 ID
- instance-id:实例 ID
- bucket_name:Cloud Storage 存储桶名称
- path_to_sql_file:SQL 文件的路径
- database_name:Cloud SQL 实例中数据库的名称
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/import
请求 JSON 正文:
{ "importContext": { "fileType": "SQL", "uri": "gs://bucket_name/path_to_sql_file", "database": "database_name" } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
如需查看请求的完整参数列表,请参阅 instances:import 页面。 - 如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。
后续步骤
- 了解如何查看导入和导出操作的状态。
- 详细了解导入和导出数据的最佳做法。
- 详细了解 Cloud Storage。
- 导入和导出的已知问题。