本页面介绍了如何使用 Google Cloud 控制台。
使用 REST API 导出 Spanner 数据库 或使用 Google Cloud CLI,请完成 准备工作部分,然后查看 Spanner 到 Cloud Storage Avro 中的详细说明,请参阅 Dataflow 文档。 导出流程使用 Dataflow,并将数据写入 Cloud Storage 存储桶中的文件夹。生成的文件夹中包含一组 Avro 文件和 JSON 清单文件。
准备工作
如需导出 Spanner 数据库,请执行以下操作: 首先,您需要启用 Spanner、Cloud Storage Compute Engine 和 Dataflow API:
此外,您还需要足够的配额和必要的 IAM 权限。
配额要求
导出作业的配额要求如下:
- Spanner:导出数据库不需要额外的计算容量,但您可能需要增加更多计算容量,以便在合理的时间内完成作业。如需了解详情,请参阅优化作业。
- Cloud Storage: 如需执行导出操作,在以下情况下,您必须为导出的文件创建一个存储桶: 则您可能还没有账号。你可以在 Google Cloud 控制台中执行此操作 或通过 Cloud Storage 页面创建导出任务 。 您无需为存储桶设置大小。
- Dataflow:导出作业与其他 Dataflow 作业具有相同的 CPU、磁盘用量和 IP 地址 Compute Engine 配额。
Compute Engine:在运行导出作业之前,必须为 Compute Engine 设置初始配额,以供 Dataflow 使用。这些配额表示允许 Dataflow 针对作业使用的资源用量上限。建议使用以下初始值:
- CPU 数:200
- 使用中的 IP 地址数:200
- 标准永久性磁盘:50 TB
通常情况下,您不必进行其他调整。 Dataflow 提供自动扩缩功能,因此您只需为导出期间实际使用的资源付费。如果您的作业可能会使用更多资源,Dataflow 界面会显示警告图标。出现警告图标不会影响作业的完成。
所需的角色
如需获取导出数据库所需的权限, 请让管理员授予您 Dataflow 工作器服务账号的以下 IAM 角色:
-
Cloud Spanner Viewer (
roles/spanner.viewer
) -
Dataflow Worker (
roles/dataflow.worker
) -
Storage Admin (
roles/storage.admin
) -
Spanner 数据库读取者 (
roles/spanner.databaseReader
) -
Database Admin (
roles/spanner.databaseAdmin
)
如需在导出过程中使用 Spanner Data Boost 的独立计算资源,您还需要 spanner.databases.useDataBoost
IAM 权限。如需了解详情,请参阅 Data Boost 概览。
导出数据库
在您满足所述的配额和 IAM 要求后 您可以导出现有的 Spanner 数据库。
如需将 Spanner 数据库导出到 Cloud Storage 存储桶,请按以下步骤操作:
前往 Spanner 实例页面。
点击包含数据库的实例的名称。
点击左侧窗格中的导入/导出菜单项,然后点击 导出按钮。
在选择导出文件的存储位置下,点击浏览。
如果您还没有用于导出的 Cloud Storage 存储桶,请执行以下操作:
- 点击新建存储分区 。
- 为存储分区输入名称。存储分区名称在 Cloud Storage 中必须是唯一的。
- 选择默认存储类别和位置,然后点击创建。
- 点击并选中存储分区。
如果您已有存储分区,请从初始列表中选择存储分区,或点击搜索 来过滤列表,然后点击并选中存储分区。
点击选择。
在选择要导出的数据库下拉菜单中选择要您导出的数据库。
可选:如需从较早的时间点导出数据库,请选中此复选框并输入时间戳。
在为导出作业选择一个区域下拉菜单中选择一个区域。
可选:如需使用 客户管理的加密密钥:
- 点击显示加密选项。
- 选择使用客户管理的加密密钥 (CMEK)。
- 从下拉列表中选择您的密钥。
此选项不会影响目的地 Cloud Storage 存储分区层级加密。如需为 Cloud Storage 存储桶启用 CMEK,请参阅将 CMEK 与 Cloud Storage 搭配使用。
可选:如需使用 Spanner Data Boost 进行导出,请选中 Use Spanner Data Boost 复选框。如需了解详情,请参阅 Data Boost 概览。
选中确认费用下的复选框,确认您了解除现有 Spanner 实例产生的费用外,还存在其他费用。
点击导出。
Google Cloud 控制台会显示数据库导入/导出页面,该页面现在会显示导入/导出作业列表中的导出作业的专列项,其中包括作业的已用时间:
作业完成或终止后,会在“导入/导出”列表中更新状态。如果作业成功,状态会显示为成功:
如果作业失败,则会显示失败状态:
如需查看作业的 Dataflow 操作详细信息,请在 Dataflow 作业名称列中点击作业名称。
如果作业运行失败,请检查作业的 Dataflow 日志以获取关于错误的详细信息。
为避免失败的导出作业所创建的文件产生 Cloud Storage 费用,请删除该文件夹及其文件。请参阅查看您的 导出,以了解如何查找该文件夹。
关于导出生成的列和更改数据流的注意事项
存储的生成的列中的值不会导出。列定义会导出到 Avro 架构的 Null 类型记录字段,作为该字段的自定义属性。在新添加的生成列完成回填操作之前,该列将被忽略,就像架构中不存在该列一样。
以 Avro 文件形式导出的变更流仅包含 变更数据流,而不是任何数据变更记录。
关于导出序列的说明
序列(GoogleSQL、
PostgreSQL)
是用于生成唯一整数值的架构对象。
Spanner 会将每个架构对象作为记录字段导出到 Avro 架构,并将其序列类型、跳过的范围和计数器作为该字段的属性。请注意,为了防止序列被重置并生成
导入后出现重复的值,在架构导出期间,
GET_INTERNAL_SEQUENCE_STATE()
(GoogleSQL、
PostgreSQL)
函数捕获序列计数器。Spanner 会将
1000 写入计数器,并将新的计数器值写入记录字段。这个
方法可避免导入后可能发生的重复值错误。
如果在数据导出期间有更多写入源数据库,您应使用 ALTER SEQUENCE
(GoogleSQL、PostgreSQL)语句调整实际序列计数器。
导入时,序列从这个新计数器(而非计数器)开始
架构中。或者,您也可以使用 ALTER SEQUENCE
(GoogleSQL、PostgreSQL)语句使用新的计数器更新序列。
查看 Cloud Storage 中的导出内容
要在 前往 Google Cloud 控制台,前往 Cloud Storage 浏览器 选择之前选择的存储桶:
该存储分区内现在存在一个包含导出的数据库的文件夹。此文件夹名称以实例的 ID、数据库名称和导出作业的时间戳开头。该文件夹包含以下内容:
- 一个
spanner-export.json
文件 - 您导出的数据库中每个表的
TableName-manifest.json
文件。 一个或多个
TableName.avro-#####-of-#####
文件。扩展名.avro-#####-of-#####
中的第一组数字表示 Avro 文件的索引(从零开始),第二组数字则表示为每个表生成的 Avro 文件的数量。例如,
Songs.avro-00001-of-00002
表示包含Songs
表数据的两个文件中的第二个文件。您导出的数据库中每个更改流的
ChangeStreamName-manifest.json
文件。ChangeStreamName.avro-00000-of-00001
每个变更数据流此文件包含空数据 仅包含变更数据流的 Avro 架构。
为导入作业选择一个区域
您可能需要根据 Cloud Storage 存储桶的位置选择不同的区域。为避免 出站数据传输费用,请选择 与您的 Cloud Storage 存储桶的位置一致。
如果您的 Cloud Storage 存储桶位置为单区域, 可以充分利用免费网络使用 导入作业的相同区域(假设该区域可用)。
如果您的 Cloud Storage 存储桶位置是双区域, 您可以充分利用免费网络使用量,只需选择 作为导入作业的双区域位置中的其中一个, (假设其中一个区域可用)。
如果您的导入作业无法使用同位区域,或者您的 Cloud Storage 存储桶位置是多区域,则需要支付出站数据传输费用。参阅 Cloud Storage 数据传输价格来选择 数据传输费用最低。
导出部分表
如果您只想导出特定表中的数据,而不是整个数据库,则可以在导出过程中指定这些表。在这种情况下,Spanner 会导出数据库的整个架构,包括您指定的表的数据,并在导出的文件中保留所有其他表,但这些表是空的。
您可以使用 Google Cloud 控制台中的 Dataflow 页面或 gcloud CLI。(Spanner 页面不提供此操作。)
如果您要导出一个表(该表是另一个表的子表)的数据, 应导出其父级 表格的数据如果未导出父级,导出作业将失败。
如需导出部分表,请使用 Dataflow 的 Spanner to Cloud Storage Avro 模板开始导出,然后使用 Google Cloud 控制台中的 Dataflow 页面或 gcloud CLI 指定表,如下所述:
控制台
如果您使用的是 Google Cloud 控制台中的 Dataflow 页面, Cloud Spanner 表名称参数位于 基于模板创建作业页面的可选参数部分。 可以采用逗号分隔格式指定多个表。
gcloud
运行 gcloud dataflow jobs run
命令,并指定 tableNames
参数。例如:
gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='instanceId=test-instance,databaseId=example-db,tableNames=table1,outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123
在 gcloud 中指定多个表需要
字典类型的参数转义。
以下示例使用的是“|
”转义字符:
gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='^|^instanceId=test-instance|databaseId=example-db|tableNames=table1,table2|outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123
shouldExportRelatedTables
参数是一个便捷的选择,
自动导出所有父表
所选的表中例如,在此包含表 Singers
、Albums
和 Songs
的架构层次结构中,您只需指定 Songs
。shouldExportRelatedTables
选项还会导出 Singers
和 Albums
,因为 Songs
是这两个元素的后代。
gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='instanceId=test-instance,databaseId=example-db,tableNames=Songs,shouldExportRelatedTables=true,outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123
在 Dataflow 界面中查看作业或对作业进行问题排查
启动导出作业后,您可以在 Google Cloud 控制台的 Dataflow 部分中查看作业的详细信息,包括日志。
查看 Dataflow 作业的详细信息
如需查看过去一周内运行的任何导入或导出作业(包括当前正在运行的任何作业)的详细信息,请执行以下操作:
- 转到数据库的数据库概览页面。
- 点击左侧窗格中的导入/导出菜单项。数据库导入/导出页面会显示最近的作业列表。
在数据库导入/导出页面中,点击 Dataflow 作业名称列中的作业名称:
Google Cloud 控制台会显示 Dataflow 的详细信息 作业。
如需查看超过一周前运行的作业,请执行以下操作:
前往 Google Cloud 控制台中的 Dataflow 作业页面。
在列表中找到您的作业,然后点击其名称。
Google Cloud 控制台会显示 Dataflow 作业的详细信息。
查看作业的 Dataflow 日志
如需查看 Dataflow 作业的日志,请转到该作业的详细信息 页面上,然后点击作业名称右侧的日志。
如果作业失败,请查看日志了解错误。如果有错误,日志旁边会显示错误计数:
如需查看作业错误,请执行以下操作:
点击日志旁边的错误计数。
Google Cloud 控制台会显示作业的日志。您可能需要向下滚动才能看到错误。
找到带错误图标 的条目。
点击各个日志条目以展开其内容。
如需详细了解如何对 Dataflow 作业进行问题排查,请参阅 排查流水线问题。
排查导出作业失败问题
如果您在作业日志中看到以下错误,请执行以下操作:
com.google.cloud.spanner.SpannerException: NOT_FOUND: Session not found --or-- com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED: Deadline expired before operation could complete.
在 Google Cloud 控制台中,查看 Spanner 数据库的 Monitoring 标签页中的 99% 读取延迟时间 (99% Read latency)。如果显示的值较大(几秒钟),则表示实例已过载,导致读取超时并失败。
高延迟的一个原因是 Dataflow 作业运行时使用的工作器过多,导致 Spanner 实例负载过高。
如需指定 Dataflow 工作器数量的限额,您必须使用 Dataflow Spanner to Cloud Storage Avro 模板开始导出(而不是使用 Google Cloud 控制台中 Spanner 数据库实例详情页面中的“导入/导出”标签页),并指定工作器数量上限,如下所述:控制台
如果您使用的是 Dataflow 控制台,工作器数量上限 参数位于 基于模板创建作业页面。
gcloud
运行 gcloud dataflow jobs run
命令,并指定 max-workers
参数。例如:
gcloud dataflow jobs run my-export-job \
--gcs-location='gs://dataflow-templates/latest/Cloud_Spanner_to_GCS_Avro' \
--region=us-central1 \
--parameters='instanceId=test-instance,databaseId=example-db,outputDir=gs://my-gcs-bucket' \
--max-workers=10 \
--network=network-123
排查网络连接错误
导出 Spanner 时可能会发生以下错误 数据库:
Workflow failed. Causes: Error: Message: Invalid value for field 'resource.properties.networkInterfaces[0].subnetwork': ''. Network interface must specify a subnet if the network resource is in custom subnet mode. HTTP Code: 400
出现此错误是因为 Spanner 假定您打算在与 Dataflow 作业位于同一项目中的自动模式 VPC 网络中使用名为 default
的 VPC 网络。如果该项目中没有默认 VPC 网络,或者您的 VPC 网络是自定义模式 VPC 网络,则必须创建 Dataflow 作业并指定备用网络或子网。
优化运行缓慢的导出作业
如果您已按照初始设置中的建议配置,则通常不必进行其他调整。如果作业运行缓慢,则可以尝试以下优化操作:
优化作业和数据位置选择:在 Spanner 实例和 Cloud Storage 存储桶所在的同一区域中运行 Dataflow 作业。
确保有足够的 Dataflow 资源:如果相关的 Compute Engine 配额限制了您的 Dataflow 作业的资源,则 Google Cloud 控制台中该作业的 Dataflow 页面会显示警告图标 和日志消息:
在这种情况下,为 CPU、使用中的 IP 地址和标准永久性磁盘增加配额或许可以缩短作业的运行时间,但可能会因此产生更多的 Compute Engine 费用。
检查 Spanner CPU 利用率:如果您发现 CPU 利用率 超过 65% 后,您可以 可增加该实例中的计算容量。容量增加了 Spanner 资源和作业应该会加快,但会产生更多 Spanner 费用。
影响导出作业性能的因素
以下几个因素会影响完成导出作业所需的时间。
Spanner 数据库大小:处理的数据越多,需要的时间就越长 资源。
Spanner 数据库架构,其中包括:
- 表的数量
- 行大小
- 二级索引的数量
- 外键的数量
- 变更数据流的数量
数据位置:数据在 Spanner 和 使用 Dataflow 存储 Cloud Storage。理想情况下,这三个组件全都位于同一区域。如果这些组件不在同一区域,则跨区域移动数据会减慢作业运行速度。
Dataflow 工作器数量:最佳 Dataflow 工作器是实现良好性能所必需的。Dataflow 使用自动扩缩功能,根据需要完成的工作量选择作业的工作器数量。但是,工作器数量会受到 CPU、使用中的 IP 地址和标准永久性磁盘的配额的限制。如果工作器数量达到配额上限,Dataflow 界面中会显示一个警告图标。在这种情况下,运行速度会减慢,但作业仍会完成。
Spanner 上的现有负载: 导出作业通常会在 Spanner 上增加少量负载 实例。 如果该实例原本已有大量负载,则作业的运行速度会较慢。
Spanner 计算容量的数量:如果实例的 CPU 利用率 超过 65%,则作业的运行速度会减慢。