DynamoDB更改范围键列

arv*_*ill 17 amazon-dynamodb

是否可以在创建表后修改Rangekey列.例如添加新列/属性并为表分配RangeKey.尝试搜索但无法找到有关更改范围或哈希键的任何文章

rpm*_*rtz 25

不,遗憾的是,在DynamoDB中创建表后,无法更改散列键,范围键或索引.DynamoDB UpdateItemAPI文档清楚地表明无法修改索引.我无法在文档中的任何位置找到明确指出表键无法修改的引用,但目前它们无法更改.

请注意,除了散列和范围键之外,DynamoDB是无模式的,您可以将其他属性添加到新项目中而不会出现任何问题.不幸的是,如果您需要修改哈希键或范围键,则必须创建一个新表并迁移数据.

编辑(2014年1月):DynamoDB现在支持动态全局二级索引

  • @Vadorequest是正确的 - 如果您需要修改,则需要创建新表并迁移数据. (3认同)

Abh*_*han 10

要更改或创建额外的排序键,您需要创建一个新表并迁移到该表,因为这两项操作都无法在现有表上完成。

DynamoDB 流使我们能够在不停机的情况下迁移表。我这样做非常有效,我遵循的步骤是:

  1. 使用所需的密钥结构、LSI、GSI 创建一个新表(我们称之为 NewTable)。
  2. 在原始表上启用 DynamoDB Streams
  3. 将 Lambda 关联到流,从而将记录推送到 NewTable。(此 Lambda 应在步骤 5 中删除迁移标志)
  4. [可选] 在原始表上创建 GSI 以加快扫描项目。确保此 GSI 只有属性:主键和已迁移(请参阅步骤 5)。
  5. 扫描在上一步中创建的 GSI(或整个表)并使用以下过滤器:

    FilterExpression = "attribute_not_exists(Migrated)"

使用迁移标志更新表中的每个项目(即:“迁移”:{“S”:“0”},将其发送到 DynamoDB 流(使用 UpdateItem API,以确保不会发生数据丢失)。

注意:您可能希望在更新期间增加表上的写入容量单位。

  1. Lambda 将拾取所有项目,修剪已迁移标志并将其推入 NewTable。
  2. 迁移所有项目后,将代码重新指向新表
  3. 去掉原来的表,Lambda 函数一旦开心就好了。

遵循这些步骤应确保您没有数据丢失和停机时间。

我已经在我的博客上记录了这一点,并附有帮助代码:https : //www.abhayachauhan.com/2018/01/dynamodb-changed-table-schema/

  • Abhay,您提供的链接不再有效。 (4认同)