从MySQL表中提取增量更新

时间:2012-03-23 19:17:41

标签: mysql extract records

我想从MySQL表中提取增量更新。有问题的表具有自动递增的ID字段,以及在每次更改(INSERT / UPDATE)时更新为当前时间戳的updated_at字段。记录永远不会从此表中删除。

自从上次运行脚本以来,我想从此表中提取所有新创建和更新的记录。我知道上次运行的最高updated_at值。因此,提取记录的主要查询将是:

SELECT * FROM table WHERE updated_at >= :last_seen_updated_at

实现这一目标的最佳方法是什么?我必须100%确定将提取所有新的和更新的记录。一些问题和疑虑:

  • 可以在同一秒内更新多个记录,其中一些记录可能已包含在先前的提取运行中,其中一些记录不包括在内。 (例如:提取器在第二半的前半部分运行,而记录可能在第二部分的后半部分更新。
  • 我应该使用一个大的SELECT查询,还是应该使用多个查询来提取批量的X记录?请注意,要提取的数据量可能很大。如果我使用批次,则可以在不同查询之间更新记录。
  • 最好不要提取重复记录,但这不是一个大问题。在最后一次看到更新之前开始X时间是否有意义,“只是为了安全”? (例如updated_at >= :last_seen_updated_at - INTERVAL 1 MINUTE
  • 我应该在哪些隔离模式下运行这些查询?可重复阅读? SERIALIZABLE?
  • MySQL数据库是一个复制的从属服务器,有时会稍微滞后于主数据库。这会对包含或不包含的行产生任何影响吗?

1 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但它是避免重复的可靠方法。首先,当您运行更新脚本时,请不要为当前秒运行它。在超过5秒钟的所有内容中运行它。这样,你知道如果你有一个给定秒的记录,你就拥有了那一秒的所有记录。完成后,您应该能够使用updated_at > :last_seen_updated_at并避免更新周期之间的重复。

此时,您可以随意提取批量或一个大型查询。至少在您描述该表时,您将要提取的数据在那时基本上是静态的 - 可能会有其他条目添加到表中,但是它们都会在您随意的任意之后最近的截止日期是,因此不会成为您查询的一部分。

关于slave / master问题,这可能有点令人担忧,但只要主服务器首先更新旧记录,它仍然很容易解决。设置更新截止时,在本地记录中查找最近的时间,并减去一秒。

在您提取时,您可能会再次更新在您注意的时间段中添加或更新的条目。严格防止这种情况的唯一方法是在解压缩时从服务器和缓冲区更改断开连接,但是在完成相对少量的添加和修改后,可以通过返回并再次运行脚本来显着降低发生率。在您提取较大的组时发生的情况。你可以多次重复这个,因为你觉得妄想症。或者,您可以计算提取前的行数,提取并计算提取的数量。如果有任何差异,您可以再次运行该过程,直到您获得相同的数字前后。