本页面介绍如何将 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 存储桶或文件夹。
- 点击导出开始导出。
- 创建 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 \ --offloadexport sql
命令不包含触发器或存储过程,但包含视图。 如需导出触发器和/或存储过程,请使用 mysqldump 工具。如需详细了解如何使用
export sql
命令,请参阅sql export sql
命令参考页面。 - 如果您不需要保留之前设置的 IAM 角色,请立即撤消该角色。
- 为导出创建一个存储桶:
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 } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/INSTANCE_ID /export"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/INSTANCE_ID /export" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/TARGET_INSTANCE_ID ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "UPDATE", "name": "OPERATION_ID ", "targetId": "INSTANCE_ID ", "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /operations/OPERATION_ID ", "targetProject": "PROJECT_ID " }
- 为导出创建一个存储桶:
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 } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/INSTANCE_ID /export"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/INSTANCE_ID /export" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/TARGET_INSTANCE_ID ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "UPDATE", "name": "OPERATION_ID ", "targetId": "INSTANCE_ID ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ", "targetProject": "PROJECT_ID " }
使用 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 --databasesDATABASE_NAME -hINSTANCE_IP -uUSERNAME -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
语句。如果要指定用户来执行导入,请选择该用户。
如果导入文件包含必须由特定用户执行的语句,请使用此字段指定该用户。
- 点击导入以开始导入。
- 创建 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
移除这些权限。
-
创建 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 " } }如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为
request.json
的文件中,然后执行以下命令:curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /import"PowerShell (Windows)
将请求正文保存在名为
request.json
的文件中,然后执行以下命令:$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /import" | Select-Object -Expand Content您应该收到类似以下内容的 JSON 响应:
如需查看请求的完整参数列表,请参阅 instances:import 页面。响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/
project-id /instances/target-instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "UPDATE", "name": "operation-id ", "targetId": "instance-id ", "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /operations/operation-id ", "targetProject": "project-id " } - 如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。
-
创建 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 " } }如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为
request.json
的文件中,然后执行以下命令:curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /import"PowerShell (Windows)
将请求正文保存在名为
request.json
的文件中,然后执行以下命令:$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /import" | Select-Object -Expand Content您应该收到类似以下内容的 JSON 响应:
如需查看请求的完整参数列表,请参阅 instances:import 页面。响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/
project-id /instances/target-instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "UPDATE", "name": "operation-id ", "targetId": "instance-id ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ", "targetProject": "project-id " } - 如果您不需要保留之前设置的 IAM 权限,请立即移除这些权限。
后续步骤
- 了解如何查看导入和导出操作的状态。
- 详细了解导入和导出数据的最佳做法。
- 详细了解 Cloud Storage。
- 导入和导出的已知问题。