截断 DynamoDB 表超出 TTL 允许的范围

Truncating DynamoDB tables beyond what the TTL allows

我有一个 DynamoDB table,它有一个 created date/time 列,指示 record/item 何时插入 table。我在这个 table 中有大约 20 年的数据(记录是从以前的数据库迁移而来的),现在我想截断任何超过 6 个月的数据。

这里要做的显而易见的事情是在 table 上设置 6 个月的 TTL,但我的理解是 AWS TTL 只能追溯到一定年数(如果你知道请纠正我除此以外!)。所以我的理解是,如果我对 20 年的数据设置 6 个月的 TTL,我可能会删除从 6 个月开始的记录,可能会追溯到 3 - 5 年,但是会有很多 确实 遗留的旧数据,不受 TTL 的影响(如果您不了解,请再次纠正我!)。所以我想我正在寻找:

  1. 能够手动一次性删除超过 6 个月的数据;和
  2. 能够设置 6 个月的 TTL 向前发展

对于第一个,我需要执行一些 比如 DELETE FROM mytable WHERE created > '2018-06-25',但是我不知道如何从 AWS/DynamoDB管理控制台,有什么想法吗?

对于第二部分,当我转到 DynamoDB 控制台中的 管理 TTL 时:

我实际上并没有看到在哪里设置 6 个月的到期时间。是那个对话框最底部的 date/time 字段吗?!对我来说似乎很奇怪......如果是这样的话,那么 TTL 就不会是一个滚动的 6 个月 window,它只是一个硬编码的时间点,我需要不断手动更新,以便数据永远不会超过 6 个月...

你说的 TTL 回溯时间是正确的,实际上是 5 年。它的工作方式是将您的 TTL 属性值与当前时间戳进行比较。如果您的项目的时间戳早于当前时间戳,则计划在接下来的 48 小时内删除(不是立即删除)。因此,如果您使用创建项目的时间戳,所有内容都会在您插入后立即被安排删除,这不是您想要的。

您管理 6 个月到期政策的方式在您的应用程序中。创建项目时,将 TTL 属性设置为创建时间前 6 个月的时间戳,然后将其保留在那里。 Dynamo 将在 6 个月内将其删除。对于您的 "legacy" 数据,我看不到查询和循环遍历每个项目并手动为每个项目设置 TTL 的方法。

直接删除旧记录或更新它们的 TTL 以便稍后可以由 DynamoDB 删除它们都需要相同的写入容量。您需要逐条扫描/查询和删除记录。

假设您有 90% 的旧数据,最经济和最省时的删除方法是将剩余的 10% 移动到新的 table 并删除旧数据。

我看到的另一种非标准方法是选择一个可以牺牲的现有时间戳字段(例如,创建日期等审计字段),将其从新记录中删除并用作 TTL 以删除旧记录。它将允许您以更便宜的方式做您需要的事情,而无需切换到另一个 table,这可能需要在您的应用程序中进行多步更改,但需要该字段 (a) 未被使用,(b) 在过去并且 (c) 是一个 UNIX 时间戳。如果您不想永久删除它,您可以将其复制到另一个属性,并在删除所有旧记录并关闭该字段上的 TTL(或切换到另一个属性)后再复制回来。它不适用于 5 年前具有时间戳的记录。