DynamoDB: Table already exists

TL;DR — 该操作想_创建_它的目标表,而在这个账户 + 区域中名称已被占用。恢复(RestoreTableFromBackup / RestoreTableToPointInTime)抛出 TableAlreadyExistsExceptionCreateTableImportTable 把同样的情况报告为 ResourceInUseException。选一个新的目标名称——恢复和导入永远无法写入一张已有的表。

含义

TableAlreadyExistsException: A target table with the specified name already exists
ResourceInUseException: Table already exists: my-table

恢复和导入操作总是创建一张全新的表——它们无法合并进或覆盖一张活动的表。如果目标名称在同一个账户和区域中解析到任何已有的表(无论其状态如何),请求都会一开始就失败。你看到哪个异常取决于 API:恢复家族有它自己的 TableAlreadyExistsException,而 CreateTableImportTable 呈现通用的 ResourceInUseException

为什么会发生

  • 把一个备份恢复到原来的名称——自然的本能("把我的表放回去")与仍然存在的表冲突。
  • 重新运行一次导入或 IaC 部署——一个重试的 ImportTable,或一个试图创建一张已在栈状态之外存在的表的 CloudFormation/Terraform/CDK 栈。
  • 一次创建后重试的竞速——第一个 CreateTable 成功了(或仍处于 CREATING),而重试发现名称被占用了。
  • 环境冲突——两个阶段/环境共享一个账户,且都想要那个无前缀的名称。

如何修复

  1. 恢复到一个新名称,然后切换——恢复为 my-table-restored,核实数据,把应用重新指向它(或者删除旧表并在它消失后以原来的名称再次恢复):

    aws dynamodb restore-table-from-backup \
      --target-table-name my-table-restored \
      --backup-arn arn:aws:dynamodb:...:table/my-table/backup/...
  2. 如果你打算替换这张表,就先删除已有的那张并等到删除完成——当表处于 DELETING 状态时名称仍被占用(此时尝试的恢复会以 TableInUseException 失败;CreateTable参见 ResourceInUseException)。

  3. 对于导入,选择一个未使用的目标名称——ImportTable 只创建新表。要把数据加载进一张已有的表,改用 BatchWriteItem/PutItem 写入。

  4. 对于 IaC 重试,把已有的表导入栈的状态(或重命名),而不是与创建搏斗。

  5. 检查实际存在什么——在同一区域/账户中 aws dynamodb list-tables 能确定名称是否真的空闲。

在切换前核实一张恢复出来的表是人们跳过的安全步骤——DynoTable 桌面应用把恢复的和原来的表并排放在一起,让你先对比模式并抽查项目。而如果你在估算恢复出来的表运行成本,DynamoDB 定价计算器覆盖两种容量模式。

相关错误

References

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。