DynamoDB 匯出 — 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 — 以 PointInTimeRecoveryEnabled: true 呼叫 UpdateContinuousBackups,或在主控台的「備份」中切換。
  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 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。