我想从MySQL表中提取增量更新。有问题的表具有自动递增的ID字段,以及在每次更改(INSERT / UPDATE)时更新为当前时间戳的updated_at字段。记录永远不会从此表中删除。
自从上次运行脚本以来,我想从此表中提取所有新创建和更新的记录。我知道上次运行的最高updated_at值。因此,提取记录的主要查询将是:
SELECT * FROM table WHERE updated_at >= :last_seen_updated_at
实现这一目标的最佳方法是什么?我必须100%确定将提取所有新的和更新的记录。一些问题和疑虑:
updated_at >= :last_seen_updated_at - INTERVAL 1 MINUTE
)答案 0 :(得分:1)
这不是一个完整的答案,但它是避免重复的可靠方法。首先,当您运行更新脚本时,请不要为当前秒运行它。在超过5秒钟的所有内容中运行它。这样,你知道如果你有一个给定秒的记录,你就拥有了那一秒的所有记录。完成后,您应该能够使用updated_at > :last_seen_updated_at
并避免更新周期之间的重复。
此时,您可以随意提取批量或一个大型查询。至少在您描述该表时,您将要提取的数据在那时基本上是静态的 - 可能会有其他条目添加到表中,但是它们都会在您随意的任意之后最近的截止日期是,因此不会成为您查询的一部分。
关于slave / master问题,这可能有点令人担忧,但只要主服务器首先更新旧记录,它仍然很容易解决。设置更新截止时,在本地记录中查找最近的时间,并减去一秒。
在您提取时,您可能会再次更新在您注意的时间段中添加或更新的条目。严格防止这种情况的唯一方法是在解压缩时从服务器和缓冲区更改断开连接,但是在完成相对少量的添加和修改后,可以通过返回并再次运行脚本来显着降低发生率。在您提取较大的组时发生的情况。你可以多次重复这个,因为你觉得妄想症。或者,您可以计算提取前的行数,提取并计算提取的数量。如果有任何差异,您可以再次运行该过程,直到您获得相同的数字前后。