DynamoDB备份与恢复 #

一、备份概述 #

1.1 备份类型 #

text
DynamoDB备份类型:
├── 按需备份(On-Demand Backup)
│   ├── 手动创建
│   ├── 完整备份
│   └── 长期保留
└── 时间点恢复(PITR)
    ├── 自动启用
    ├── 连续备份
    └── 35天内任意时间点恢复

1.2 备份特点 #

特性 按需备份 PITR
创建方式 手动 自动
保留时间 无限制 35天
恢复粒度 备份点 任意秒级
成本 按备份大小 按表大小

二、按需备份 #

2.1 创建备份 #

使用CLI:

bash
aws dynamodb create-backup \
  --table-name Users \
  --backup-name users-backup-2024-01-01

使用JavaScript SDK:

javascript
const { DynamoDBClient, CreateBackupCommand } = require('@aws-sdk/client-dynamodb');

const client = new DynamoDBClient({ region: 'us-east-1' });

const response = await client.send(new CreateBackupCommand({
  TableName: 'Users',
  BackupName: 'users-backup-2024-01-01'
}));

console.log('Backup ARN:', response.BackupDetails.BackupArn);

2.2 列出备份 #

bash
aws dynamodb list-backups \
  --table-name Users
bash
# 按时间范围筛选
aws dynamodb list-backups \
  --table-name Users \
  --time-range-lower-bound 2024-01-01T00:00:00Z \
  --time-range-upper-bound 2024-01-31T23:59:59Z

2.3 查看备份详情 #

bash
aws dynamodb describe-backup \
  --backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123

2.4 删除备份 #

bash
aws dynamodb delete-backup \
  --backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123

2.5 自动化备份脚本 #

javascript
const { DynamoDBClient, CreateBackupCommand, ListBackupsCommand, DeleteBackupCommand } = require('@aws-sdk/client-dynamodb');

const client = new DynamoDBClient({ region: 'us-east-1' });

async function createDailyBackup(tableName) {
  const backupName = `${tableName}-backup-${new Date().toISOString().split('T')[0]}`;
  
  const response = await client.send(new CreateBackupCommand({
    TableName: tableName,
    BackupName: backupName
  }));
  
  console.log(`Created backup: ${backupName}`);
  return response.BackupDetails;
}

async function cleanupOldBackups(tableName, retentionDays = 30) {
  const cutoffDate = new Date();
  cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
  
  const response = await client.send(new ListBackupsCommand({
    TableName: tableName
  }));
  
  for (const backup of response.BackupSummaries) {
    const backupDate = new Date(backup.BackupCreationDateTime);
    
    if (backupDate < cutoffDate) {
      await client.send(new DeleteBackupCommand({
        BackupArn: backup.BackupArn
      }));
      console.log(`Deleted old backup: ${backup.BackupName}`);
    }
  }
}

// 使用示例
async function backupJob() {
  const tables = ['Users', 'Orders', 'Products'];
  
  for (const table of tables) {
    await createDailyBackup(table);
    await cleanupOldBackups(table, 30);
  }
}

三、时间点恢复(PITR) #

3.1 启用PITR #

使用CLI:

bash
aws dynamodb update-continuous-backups \
  --table-name Users \
  --point-in-time-recovery-specification \
    PointInTimeRecoveryEnabled=true

使用JavaScript SDK:

javascript
const { UpdateContinuousBackupsCommand } = require('@aws-sdk/client-dynamodb');

await client.send(new UpdateContinuousBackupsCommand({
  TableName: 'Users',
  PointInTimeRecoverySpecification: {
    PointInTimeRecoveryEnabled: true
  }
}));

3.2 查看PITR状态 #

bash
aws dynamodb describe-continuous-backups \
  --table-name Users
json
{
  "ContinuousBackupsDescription": {
    "ContinuousBackupsStatus": "ENABLED",
    "PointInTimeRecoveryDescription": {
      "PointInTimeRecoveryStatus": "ENABLED",
      "EarliestRestorableDateTime": "2024-01-01T00:00:00Z",
      "LatestRestorableDateTime": "2024-01-27T10:00:00Z"
    }
  }
}

3.3 恢复到指定时间点 #

bash
aws dynamodb restore-table-to-point-in-time \
  --source-table-name Users \
  --target-table-name Users-Restored \
  --restore-date-time 2024-01-15T12:00:00Z
javascript
const { RestoreTableToPointInTimeCommand } = require('@aws-sdk/client-dynamodb');

await client.send(new RestoreTableToPointInTimeCommand({
  SourceTableName: 'Users',
  TargetTableName: 'Users-Restored',
  RestoreDateTime: new Date('2024-01-15T12:00:00Z')
}));

3.4 恢复到最新时间点 #

bash
aws dynamodb restore-table-to-point-in-time \
  --source-table-name Users \
  --target-table-name Users-Restored \
  --use-latest-restorable-time

四、从备份恢复 #

4.1 从按需备份恢复 #

bash
aws dynamodb restore-table-from-backup \
  --target-table-name Users-Restored \
  --backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123
javascript
const { RestoreTableFromBackupCommand } = require('@aws-sdk/client-dynamodb');

await client.send(new RestoreTableFromBackupCommand({
  TargetTableName: 'Users-Restored',
  BackupArn: 'arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123'
}));

4.2 恢复时自定义设置 #

bash
aws dynamodb restore-table-from-backup \
  --target-table-name Users-Restored \
  --backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/01234567890123 \
  --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=alias/my-key \
  --billing-mode PAY_PER_REQUEST

五、恢复注意事项 #

5.1 恢复限制 #

text
恢复限制:
├── 恢复创建新表
├── 不能覆盖现有表
├── 恢复时间取决于表大小
├── 恢复过程中表状态为CREATING
└── 索引会自动恢复

5.2 恢复后操作 #

javascript
async function afterRestore(sourceTable, restoredTable) {
  // 等待恢复完成
  await waitForTableActive(restoredTable);
  
  // 验证数据
  const sourceCount = await getItemCount(sourceTable);
  const restoredCount = await getItemCount(restoredTable);
  
  if (sourceCount !== restoredCount) {
    console.warn('Item count mismatch!');
  }
  
  // 更新应用配置
  await updateAppConfig(restoredTable);
  
  // 切换流量
  await switchTraffic(restoredTable);
}

async function waitForTableActive(tableName) {
  while (true) {
    const response = await client.send(new DescribeTableCommand({
      TableName: tableName
    }));
    
    if (response.Table.TableStatus === 'ACTIVE') {
      return;
    }
    
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

六、备份成本 #

6.1 按需备份成本 #

text
成本计算:
├── 备份存储:$0.10/GB/月
├── 无数据传输费用
└── 恢复不额外收费

6.2 PITR成本 #

text
成本计算:
├── PITR存储:$0.20/GB/月
├── 按表大小计费
└── 恢复不额外收费

6.3 成本优化 #

text
优化建议:
├── 定期清理旧备份
├── 合理设置保留策略
├── 评估是否需要PITR
└── 监控备份存储使用

七、备份策略 #

7.1 推荐备份策略 #

text
备份策略:
├── 启用PITR(所有生产表)
├── 定期按需备份
│   ├── 每日备份
│   ├── 保留30天
│   └── 重要变更前备份
└── 跨区域备份(灾难恢复)

7.2 备份自动化 #

javascript
// AWS Lambda定时备份
exports.handler = async (event) => {
  const tables = process.env.TABLES.split(',');
  const retentionDays = parseInt(process.env.RETENTION_DAYS || '30');
  
  for (const tableName of tables) {
    // 创建备份
    await createDailyBackup(tableName);
    
    // 清理旧备份
    await cleanupOldBackups(tableName, retentionDays);
  }
  
  return { status: 'success' };
};

7.3 跨区域备份 #

javascript
const { DynamoDBClient, CreateBackupCommand } = require('@aws-sdk/client-dynamodb');
const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');

async function exportToS3(tableName, bucketName) {
  // 使用DynamoDB导出到S3
  const { DynamoDBClient, ExportTableToPointInTimeCommand } = require('@aws-sdk/client-dynamodb');
  
  const client = new DynamoDBClient({ region: 'us-east-1' });
  
  await client.send(new ExportTableToPointInTimeCommand({
    TableArn: `arn:aws:dynamodb:us-east-1:123456789012:table/${tableName}`,
    S3Bucket: bucketName,
    S3Prefix: `backups/${tableName}/`,
    ExportFormat: 'DYNAMODB_JSON'
  }));
}

八、最佳实践 #

8.1 备份最佳实践 #

text
最佳实践:
├── 启用PITR
├── 定期测试恢复
├── 自动化备份流程
├── 监控备份状态
├── 制定恢复计划
└── 文档化备份策略

8.2 恢复最佳实践 #

text
恢复最佳实践:
├── 验证恢复数据完整性
├── 在非生产环境测试
├── 记录恢复步骤
├── 定期演练
└── 监控恢复时间

九、总结 #

备份与恢复要点:

特性 按需备份 PITR
创建 手动 自动
保留 无限制 35天
恢复 备份点 任意时间点
成本 $0.10/GB/月 $0.20/GB/月

下一步,让我们学习容量模式!

最后更新:2026-03-27