【问题标题】:DynamoDB Change Range Key ColumnDynamoDB 更改范围键列
【发布时间】:2019-04-21 05:23:17
【问题描述】:

是否可以在创建表后修改 Rangekey 列。例如添加新的列/属性并分配为表格的 RangeKey。尝试搜索但找不到任何关于更改 Range 或 Hash 键的文章

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    不,很遗憾,在 DynamoDB 中创建表后,无法更改哈希键、范围键或索引。 DynamoDB UpdateItem API Documentation 清楚地表明了索引不能被修改的事实。我在文档中找不到任何明确声明表键无法修改但目前无法更改的引用。

    请注意,除了哈希和范围键之外,DynamoDB 没有架构,您可以毫无问题地将其他属性添加到新项目。不幸的是,如果您需要修改散列键或范围键,则必须创建一个新表并迁移数据。

    编辑(2014 年 1 月):DynamoDB 现在支持on the fly global secondary indexes

    【讨论】:

    • 那么,分区键(主键)和排序键都不能修改?
    • @Vadorequest 没错 - 如果您需要修改它,您需要创建一个新表并迁移您的数据。
    • 那我想最安全的方法就是默认不使用hash key,需要的时候再添加额外的索引。在创建表本身时,哈希应该是什么并不总是很明显,如果这是一个错误的选择,那么强制所有请求提供哈希值来检索项目可能是一个很大的问题。
    【解决方案2】:

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

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

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

      FilterExpression = "attribute_not_exists(已迁移)"

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

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

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

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

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

    【讨论】:

    • Abhay,您提供的链接已失效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多