DynamoDB export — Point in time recovery is not enabled

TL;DR — Export to Amazon S3 (ExportTableToPointInTime) requires Point-in-Time Recovery (PITR) on the source table. If PITR is off you get PointInTimeRecoveryUnavailableException: Point in time recovery is not enabled for table '<name>'. Enable PITR, confirm it reports ENABLED, then request the export.

What it means

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

DynamoDB's full and incremental export to S3 feature reads from the table's PITR continuous backups, not from live table capacity. That's why it never consumes RCUs and can export a table's state at any point in the recovery window — but it only works when PITR is enabled. No PITR, no export.

Why it happens

  • PITR was never turned on for the table — PointInTimeRecoveryStatus is DISABLED by default on every new table.
  • Wrong table or region — the export's TableArn points at a table (or a replica in another Region) that doesn't have PITR configured.
  • Looks similar, different error — an ExportTime outside the PITR window doesn't raise this exception; it fails with InvalidExportTimeException. The window covers your configured recovery period (RecoveryPeriodInDays, 1–35 days) and never reaches back before the moment PITR was enabled.

How to fix it

  1. Enable PITR on the source table — UpdateContinuousBackups with PointInTimeRecoveryEnabled: true, or toggle it in the console under Backups.
  2. Confirm PITR is onDescribeContinuousBackups should report PointInTimeRecoveryStatus: ENABLED. (Don't confuse it with ContinuousBackupsStatus, which is always ENABLED even when PITR is off.) From that moment on, any point in the window is exportable.
  3. Keep ExportTime inside the window — within your configured recovery period (up to 35 days) and at or after the moment PITR was enabled; outside it you'll get InvalidExportTimeException. Omit it to export the current point in time.
  4. Confirm the IAM permissions — the caller needs dynamodb:ExportTableToPointInTime plus s3:PutObject, s3:PutObjectAcl, and s3:AbortMultipartUpload on the destination bucket.
  5. Target the right table ARN and region in the export request.

Need to verify what actually landed in S3? The DynoTable desktop app browses the source table and exports the same items as CSV, JSON or NDJSON, so you have something to diff the S3 objects against.

Reproduce it

Create a table, leave PITR off, and ask for an export. The bucket need not exist — the PITR check runs first:

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')

Real output:

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

Two details worth carrying into your error handling. The raw SDK message is just the sentence above — the longer An error occurred (PointInTimeRecoveryUnavailableException) when calling the ExportTableToPointInTime operation: … form is the AWS CLI and botocore wrapper adding context, so which one you see depends on how you called it. And the request never reached S3: the bucket in this run does not exist, yet the failure is about PITR, so a bucket typo will not surface until PITR is on.

References

Last verified 2026-07-13 against the official AWS documentation linked above.

Reproduced 2026-07-26 against the live DynamoDB service in us-east-1 via boto3 1.43.56 — the output above is verbatim.

Work with DynamoDB without the Console

A fast DynamoDB desktop client that runs the real SQL DynamoDB can’t — JOINs, GROUP BY, aggregates — with visual editing and an AI agent on your own Bedrock keys.

Free 30-day trial, no credit card — then the Free plan with no time limit.