如何将 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,它能跨账户和跨区域复制恢复点 (跨账户迁移指南):
- 把源表备份到一个备份保管库。
- 将备份复制到目标账户/区域的保管库。
- 把它还原到目标中的一张新表。
关键约束:
- 跨账户复制要求两个账户都在同一个 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,在迁移期间跨账户和 区域检查表。