MySQL:保持“已更改”标志

时间:2014-03-22 14:43:07

标签: mysql

我的应用程序尝试在多个独立服务器之间同步数据库条目 因此,我需要知道自上次同步以来添加或修改了哪些条目。我的想法是为每个必须同步的表添加一个(BIT-)列,指示该行是否已更改。默认值为1,因此新插入的行标记为新行。在每次更新时,“已更改”标志应自动设置为1.我同步后,我想手动将标志重置为0。 我不想手动更新“已更改”标志,因为有很多地方可以插入或更新行。我已经查看了触发器,但据我所知,没有办法在不执行类似

的操作的情况下获取已更改的行
IF NEW.col_1 <> OLD.col_1 OR NEW.col_2 <> OLD.col_2 ...  

我想避免这种情况,因为数据库结构可能会发生变化 我知道您可以在每个UPDATE上更新一个时间戳列,但是您可以使用其他数据类型吗?

2 个答案:

答案 0 :(得分:1)

听起来你想要MySQL Replication

  

复制启用来自一个MySQL数据库服务器(主服务器)的数据   要复制到一个或多个MySQL数据库服务器(从属服务器)。   默认情况下,复制是异步的 - 从站无需连接   永久接收来自主服务器的更新。这意味着   更新可以通过长距离连接甚至结束   临时或间歇性连接,如拨号服务。   根据配置,您可以复制所有数据库,   选定的数据库,甚至数据库中的选定表。

这样做的一个优点是,如果MySQL本身处理复制,那么您不需要编写代码来处理同步。将其他从属服务器添加到复制集群也相对容易。

MySQL对如何设置replication有很好的描述。

答案 1 :(得分:1)

你可以开始摆弄触发器来做你想做的事。然而,设置和取消设置标志似乎令人不安。我假设您已经研究过提供此功能的MySQL Replication(请参阅here)等解决方案。

我建议为每个表添加ModifiedAt时间戳。在最近的MySQL版本中,这甚至不需要触发器(参见here)。然后,您的复制过程将执行以下操作:

  1. 遍历每个表并获取每个表的最大ModifiedAt时间戳。
  2. 从表格中获取上一个ModifiedAt和新记录之间的所有记录。
  3. 做任何你想对这些记录做的事情。
  4. 记录每张桌子的ModifiedAt
  5. 这应确保为复制正确处理更新。作为奖励,每条记录还将跟踪上次更改的时间。