入门阅读约 2 分钟

如何将 DynamoDB 表复制到另一个账户或区域

DynamoDB 没有一键"复制表"命令——AWS CLI 里没有,控制台里也没有。 跨账户或跨区域复制或迁移一张表,意味着要从四种方法中选一种, 每种在成本、停机时间和保真度上有不同的取舍。本指南 涵盖全部四种,外加在生产环境中会咬人的运维坑。

如何将 DynamoDB 表复制到另一个账户或区域?

没有原生的复制表命令。请从四种方法中选一种:用 Scan + BatchWriteItem 脚本进行小规模的一次性复制,用 S3 导出再导入处理大表,用 AWS Backup 复制 + 还原进行需要完整保真度的跨账户迁移,或用全局表进行持续的实时复制。每次还原或导入都会创建一张新表。

情况最佳方法
小表、一次性、完全掌控Scan + BatchWriteItem 脚本
大表、可接受快照S3 导出 → 导入(创建新表)
跨账户 / 跨区域并需还原AWS Backup 复制 + 还原
持续的实时复制(非一次性复制)全局表

没有哪种方法是普遍"正确"的——取决于表大小、你需要的是 某一时间点快照还是实时数据,以及目标是新表还是现有 表。

方法 1:Scan + BatchWriteItem(脚本)

最低技术门槛的选项:用 Scan 从源读取每个项,用 BatchWriteItem 写入目标。只要你的脚本持有双方的凭证(或在 目标账户中假定一个角色),就能跨账户和跨区域工作。

# 草图——读取源、写入目标(伪代码;实际中请用 SDK)
aws dynamodb scan --table-name SourceTable --region us-east-1 \
  > items.json
# 将 Items[] 转换为 BatchWriteItem RequestItems,然后:
aws dynamodb batch-write-item --request-items file://batch.json \
  --region eu-west-1

这些坑是真实存在且容易忽略的:

  • BatchWriteItem 每次调用上限为 25 个项或 16MB——你必须分块,且单次 调用可能返回你必须用指数退避重试的未处理项API 参考)。
  • 写入会消耗写容量。 在预置容量的目标上,你会很快撞上 ProvisionedThroughputExceededException;按需模式能吸收更多但仍有 每分区的软限制。在开始前,请根据目标的容量评估 写入负载。
  • Scan 会读取整张表并对每个项计量——这就是经典的 Query-vs-Scan 成本。一张大表还意味着要分页遍历 LastEvaluatedKey;参见分页
  • 它不是原子的。 在扫描进行中写入的项可能被漏掉——只有当 源处于静止状态时,你才能得到一致的快照。

最适合小表,或当你需要在复制过程中转换/过滤数据时。

方法 2:导出到 S3,然后导入到新表

对于大表,DynamoDB 托管的导出到 S3加上从 S3 导入完全 避免了猛烈消耗你的容量。

导出会把表快照到一个 S3 桶 (工作原理):

  • 要求源表启用时间点恢复(PITR)
  • 不消耗读容量,对表性能无影响—— 它从连续备份而非实时表中读取。
  • 输出 DynamoDB JSON 或 Amazon Ion 格式。( DynamoDB-JSON 线缆格式连同类型标签一起落到 S3。)
  • 可写入另一个账户拥有位于不同区域的 S3 桶。
  • 支持全量和增量导出(增量导出已正式发布,2023 年 9 月)。

导入随后从该 S3 数据构建一张全新的表 (工作原理):

  • 只能导入到全新的表——你无法导入到现有表。
  • 对新表不消耗写容量
  • 接受 CSV、DynamoDB JSON 或 Amazon Ion(可选 GZIP/ZSTD 压缩)。
  • 源 S3 桶可以位于另一个账户或另一个区域
  • 你可以在导入时定义辅助索引,导入一完成即可查询。

对于可接受某一时间点快照(而非实时数据)的大型跨账户/跨区域迁移, 这是最干净的路径。

方法 3:AWS Backup 复制 + 还原

如果你已经在用 AWS Backup,它能跨账户和跨区域复制恢复点 (跨账户迁移指南):

  1. 把源表备份到一个备份保管库。
  2. 将备份复制到目标账户/区域的保管库。
  3. 把它还原到目标中的一张新表。

关键约束:

  • 跨账户复制要求两个账户都在同一个 AWS 组织中。
  • 还原始终创建新表——你无法覆盖现有表来还原。
  • 默认保留全局辅助索引(可排除部分或全部以节省 还原时间/成本);你无法在还原时添加新索引。
  • 加密坑: 要在跨区域还原中保持相同的 KMS 密钥,你需要 多区域密钥;对于跨账户,你必须把密钥共享给目标 账户。AWS 拥有的和 AWS 托管的密钥无法共享或设为多区域 (还原加密说明)。

方法 4:全局表(实时复制,非一次性复制)

全局表跨区域复制表——现在还可选跨账户 (多账户已正式发布,2026 年 2 月)—— 持续地复制。任何副本都能服务读写(多主),采用异步、 后写者胜的复制 (全局表文档)。

不是一个"复制完就走"的工具——它是持续的复制。当你 希望目标区域无限期保持同步时(灾备、低延迟的本地读取)使用它, 而非用于干净的一次性迁移。向现有表添加一个区域,DynamoDB 会把现有数据回填到新副本中。

运维坑(所有方法)

  • GSI 重建并不免费。 scan+write 复制不携带索引——你要在目标上 定义它们,它们会回填(并产生成本),单独计费。请提前在目标上规划你的 GSI vs LSI 布局;LSI 只能在 建表时创建 (LSI 文档)。
  • 容量模式不会传递。 新表会以你设置的模式开始, 而非源的模式。在做 scan+write 复制前评估写入负载——用 项大小计算器估算一个 有代表性的项的大小,再乘以项数,来粗估 WCU。
  • TTL、流、自动扩缩和标签是表设置,不是数据——没有 哪种复制方法会携带它们全部。请在目标上重新应用它们。
  • DynamoDB JSON ≠ 普通 JSON。 导出和扫描会发出带类型标签的 DynamoDB-JSON;如果你在途中转换, DynamoDB JSON 转换器能处理整理工作。

常见问题

有没有用于复制 DynamoDB 表的 AWS CLI 命令? 没有。没有原生的 copy-table 命令。你需要组合 scan + batch-write-item, 或使用托管的导出/导入或 AWS Backup 功能。

如何把 DynamoDB 表复制到另一个账户? 三个选项:持有双方账户凭证的 scan+write 脚本、S3 导出/导入(桶可跨账户),或 AWS Backup 复制+还原(两个账户 必须在同一个 AWS 组织中)。

如何把 DynamoDB 表复制到另一个区域? S3 导出/导入和 AWS Backup 都支持跨区域。对于持续的跨区域 同步而非一次性复制,在目标区域添加一个全局表副本。

复制表会复制它的索引吗? S3 导入和 AWS Backup 还原让你可以保留/定义辅助索引;scan+write 脚本不会——你要在目标上自己创建索引,它们会单独回填。

我能导入到现有的 DynamoDB 表吗? 不能。DynamoDB 的 S3 导入和 AWS Backup 还原都会创建表。要合并 到现有表中,请使用 scan+write 脚本。


GUI 能让切换变得理智:并排浏览源和目标,在复制后核实 项数和几条样本记录,并执行临时检查而无需写 扫描脚本。下载 DynoTable,在迁移期间跨账户和 区域检查表。

更新于