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 啟用之前的時刻。
如何修正
- 在來源資料表上啟用 PITR — 以
PointInTimeRecoveryEnabled: true呼叫UpdateContinuousBackups,或在主控台的「備份」中切換。 - 確認 PITR 已開啟 —
DescribeContinuousBackups應回報PointInTimeRecoveryStatus: ENABLED。(別和ContinuousBackupsStatus搞混,後者即使 PITR 關閉也永遠是ENABLED。)從那一刻起,視窗內的任何時間點都可匯出。 - 讓
ExportTime保持在視窗內 — 在你設定的還原期間內(最多 35 天),且不早於 PITR 啟用的時刻;超出範圍你會得到InvalidExportTimeException。省略它就會匯出目前的時間點。 - 確認 IAM 權限 — 呼叫端需要
dynamodb:ExportTableToPointInTime,以及對目的儲存貯體的s3:PutObject、s3:PutObjectAcl與s3:AbortMultipartUpload。 - 在匯出請求中指向正確的資料表 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 開啟後才會浮現。
相關錯誤
- BackupNotFoundException — 引用的隨需備份 ARN 不存在。
- ResourceNotFoundException — 資料表本身找不到。
- 學習:DynamoDB 備份與 PITR
參考資料
- ExportTableToPointInTime — Amazon DynamoDB API Reference
- Requesting a table export in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB data export to Amazon S3: how it works — Amazon DynamoDB Developer Guide
- Enable point-in-time recovery in DynamoDB — Amazon DynamoDB Developer Guide
- DescribeContinuousBackups — Amazon DynamoDB API Reference
最後於 2026-07-13 對照上方連結的官方 AWS 文件驗證。
已於 2026-07-26 透過 boto3 1.43.56 對照 us-east-1 的線上 DynamoDB 服務重現 — 上方輸出為逐字原文。