DynamoDB export — Point in time recovery is not enabled

TL;DR — 导出到 Amazon S3(ExportTableToPointInTime)要求源表上启用了时间点恢复(PITR)。如果 PITR 是关闭的,你会得到 PointInTimeRecoveryUnavailableException: Point in time recovery is not enabled for table '<name>'。启用 PITR,确认它报告为 ENABLED,然后再请求导出。

含义

An error occurred (PointInTimeRecoveryUnavailableException) when calling the
ExportTableToPointInTime operation: Point in time recovery is not enabled for
table 'my-dynamodb-table'

DynamoDB 的全量与增量导出到 S3功能读取的是表的 PITR 连续备份,而不是表的实时容量。这正是它从不消耗 RCU、并且能导出恢复窗口内任意时刻表状态的原因——但它只有在 PITR 启用时才能工作。没有 PITR,就没有导出。

为什么会发生

  • 这张表从来没有打开过 PITR——每张新表的 PointInTimeRecoveryStatus 默认都是 DISABLED
  • 表或区域搞错了——导出的 TableArn 指向了一张没有配置 PITR 的表(或另一个区域中的副本)。
  • 看着像、其实是另一个错误——ExportTime 落在 PITR 窗口之外不会抛出这个异常;那会以 InvalidExportTimeException 失败。窗口覆盖的是你配置的恢复期(RecoveryPeriodInDays,1–35 天),并且永远不会回溯到 PITR 被启用的那一刻之前。

如何修复

  1. 在源表上启用 PITR——用 UpdateContinuousBackups 并设置 PointInTimeRecoveryEnabled: true,或者在控制台的 Backups 下切换开关。
  2. 确认 PITR 已打开——DescribeContinuousBackups 应当报告 PointInTimeRecoveryStatus: ENABLED。(别把它和 ContinuousBackupsStatus 搞混,后者即使 PITR 关闭也一直是 ENABLED。)从那一刻起,窗口内的任意时间点都可以导出。
  3. ExportTime 落在窗口内——处于你配置的恢复期内(最多 35 天),且不早于 PITR 被启用的那一刻;超出范围你会得到 InvalidExportTimeException。省略它则导出当前时间点。
  4. 确认 IAM 权限——调用方需要 dynamodb:ExportTableToPointInTime,外加目标桶上的 s3:PutObjects3:PutObjectAcls3:AbortMultipartUpload
  5. 在导出请求中指向正确的表 ARN 和区域

需要核实 S3 里实际落了什么?DynoTable 桌面应用可以浏览源表,并把同样的项目导出为 CSV、JSON 或 NDJSON,这样你就有东西可以拿来和 S3 对象做比对。

复现方法

创建一张表,让 PITR 保持关闭,然后请求导出。桶不必存在——PITR 检查会先跑:

import boto3
ddb = boto3.client('dynamodb', region_name='us-east-1')
arn = ddb.describe_table(TableName='my-table')['Table']['TableArn']
ddb.export_table_to_point_in_time(TableArn=arn, S3Bucket='any-bucket-name')

实际输出:

PointInTimeRecoveryUnavailableException: Point in time recovery is not enabled for table 'my-table'
HTTP 400

有两个细节值得带进你的错误处理。原始 SDK 消息就只是上面那一句——更长的 An error occurred (PointInTimeRecoveryUnavailableException) when calling the ExportTableToPointInTime operation: … 形式是 AWS CLI 和 botocore 包装时加上的上下文,所以你看到哪一种取决于你是怎么调用的。另外,这个请求从来没有到达 S3:本次运行里那个桶并不存在,可失败说的却是 PITR,所以桶名拼错要等到 PITR 打开之后才会浮出水面。

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

2026-07-26 通过 boto3 1.43.56 针对 us-east-1 的实时 DynamoDB 服务复现——上方输出为原样照录。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。