将数据库从 Spanner 导出到 Avro

本页面介绍了如何使用 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:

Enable the APIs

此外,您还需要足够的配额和必要的 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 角色:

如需在导出过程中使用 Spanner Data Boost 的独立计算资源,您还需要 spanner.databases.useDataBoost IAM 权限。如需了解详情,请参阅 Data Boost 概览

导出数据库

在您满足所述的配额和 IAM 要求后 您可以导出现有的 Spanner 数据库。

如需将 Spanner 数据库导出到 Cloud Storage 存储桶,请按以下步骤操作:

  1. 前往 Spanner 实例页面。

    转到实例

  2. 点击包含数据库的实例的名称。

  3. 点击左侧窗格中的导入/导出菜单项,然后点击 导出按钮。

  4. 选择导出文件的存储位置下,点击浏览

  5. 如果您还没有用于导出的 Cloud Storage 存储桶,请执行以下操作:

    1. 点击新建存储分区 新的存储分区界面元素的屏幕截图
    2. 为存储分区输入名称。存储分区名称在 Cloud Storage 中必须是唯一的
    3. 选择默认存储类别和位置,然后点击创建
    4. 点击并选中存储分区。

    如果您已有存储分区,请从初始列表中选择存储分区,或点击搜索 搜索界面元素的屏幕截图 来过滤列表,然后点击并选中存储分区。

  6. 点击选择

  7. 选择要导出的数据库下拉菜单中选择要您导出的数据库。

  8. 可选:如需从较早的时间点导出数据库,请选中此复选框并输入时间戳。

  9. 为导出作业选择一个区域下拉菜单中选择一个区域。

  10. 可选:如需使用 客户管理的加密密钥

    1. 点击显示加密选项
    2. 选择使用客户管理的加密密钥 (CMEK)
    3. 从下拉列表中选择您的密钥。

    此选项不会影响目的地 Cloud Storage 存储分区层级加密。如需为 Cloud Storage 存储桶启用 CMEK,请参阅将 CMEK 与 Cloud Storage 搭配使用

  11. 可选:如需使用 Spanner Data Boost 进行导出,请选中 Use Spanner Data Boost 复选框。如需了解详情,请参阅 Data Boost 概览

  12. 选中确认费用下的复选框,确认您了解除现有 Spanner 实例产生的费用外,还存在其他费用。

  13. 点击导出

    Google Cloud 控制台会显示数据库导入/导出页面,该页面现在会显示导入/导出作业列表中的导出作业的专列项,其中包括作业的已用时间:

    运行中作业的屏幕截图

作业完成或终止后,会在“导入/导出”列表中更新状态。如果作业成功,状态会显示为成功

导出作业成功消息

如果作业失败,则会显示失败状态:

导出作业失败消息

如需查看作业的 Dataflow 操作详细信息,请在 Dataflow 作业名称列中点击作业名称。

如果作业运行失败,请检查作业的 Dataflow 日志以获取关于错误的详细信息。

为避免失败的导出作业所创建的文件产生 Cloud Storage 费用,请删除该文件夹及其文件。请参阅查看您的 导出,以了解如何查找该文件夹。

关于导出生成的列和更改数据流的注意事项

存储的生成的列中的值不会导出。列定义会导出到 Avro 架构的 Null 类型记录字段,作为该字段的自定义属性。在新添加的生成列完成回填操作之前,该列将被忽略,就像架构中不存在该列一样。

以 Avro 文件形式导出的变更流仅包含 变更数据流,而不是任何数据变更记录。

关于导出序列的说明

序列(GoogleSQLPostgreSQL) 是用于生成唯一整数值的架构对象。 Spanner 会将每个架构对象作为记录字段导出到 Avro 架构,并将其序列类型、跳过的范围和计数器作为该字段的属性。请注意,为了防止序列被重置并生成 导入后出现重复的值,在架构导出期间, GET_INTERNAL_SEQUENCE_STATE()GoogleSQLPostgreSQL) 函数捕获序列计数器。Spanner 会将 1000 写入计数器,并将新的计数器值写入记录字段。这个 方法可避免导入后可能发生的重复值错误。 如果在数据导出期间有更多写入源数据库,您应使用 ALTER SEQUENCEGoogleSQLPostgreSQL)语句调整实际序列计数器。

导入时,序列从这个新计数器(而非计数器)开始 架构中。或者,您也可以使用 ALTER SEQUENCEGoogleSQLPostgreSQL)语句使用新的计数器更新序列。

查看 Cloud Storage 中的导出内容

要在 前往 Google Cloud 控制台,前往 Cloud Storage 浏览器 选择之前选择的存储桶:

前往 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 表名称参数位于 基于模板创建作业页面的可选参数部分。 可以采用逗号分隔格式指定多个表。

转到 Dataflow

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 参数是一个便捷的选择, 自动导出所有父表 所选的表中例如,在此包含表 SingersAlbumsSongs架构层次结构中,您只需指定 SongsshouldExportRelatedTables 选项还会导出 SingersAlbums,因为 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 作业的详细信息

如需查看过去一周内运行的任何导入或导出作业(包括当前正在运行的任何作业)的详细信息,请执行以下操作:

  1. 转到数据库的数据库概览页面。
  2. 点击左侧窗格中的导入/导出菜单项。数据库导入/导出页面会显示最近的作业列表。
  3. 在数据库导入/导出页面中,点击 Dataflow 作业名称列中的作业名称:

    运行中作业的状态消息

    Google Cloud 控制台会显示 Dataflow 的详细信息 作业。

如需查看超过一周前运行的作业,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 Dataflow 作业页面。

    转到作业

  2. 在列表中找到您的作业,然后点击其名称。

    Google Cloud 控制台会显示 Dataflow 作业的详细信息。

查看作业的 Dataflow 日志

如需查看 Dataflow 作业的日志,请转到该作业的详细信息 页面上,然后点击作业名称右侧的日志

如果作业失败,请查看日志了解错误。如果有错误,日志旁边会显示错误计数:

“日志”按钮旁边的错误计数示例

如需查看作业错误,请执行以下操作:

  1. 点击日志旁边的错误计数。

    Google Cloud 控制台会显示作业的日志。您可能需要向下滚动才能看到错误。

  2. 找到带错误图标 “错误”图标 的条目。

  3. 点击各个日志条目以展开其内容。

如需详细了解如何对 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 控制台,工作器数量上限 参数位于 基于模板创建作业页面。

转到 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%,则作业的运行速度会减慢。