检测数据库更改

时间:2013-06-26 20:35:29

标签: mysql

我有一个数据库密集型应用程序,需要每隔几个小时运行一次。有没有办法检测自上次运行此应用程序以来给定的表是否已更改?

6 个答案:

答案 0 :(得分:9)

检测更改的最有效方法是这样做。

CHECKSUM TABLE tableName

答案 1 :(得分:1)

几个问题:

  1. 你在做什么操作系统?
  2. 您使用的是哪个存储引擎?
  3. 命令[http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html](SHOW TABLE STATUS)可以显示一些信息,具体取决于存储引擎。

    它还取决于您的密集操作之间的间隔有多大。

    我认为最精确的方法是使用@Neuticle提到的触发器(AFTER INSERT / UPDATE),并将CURRENT_TIMESTAMP存储在表名旁边。

    CREATE TABLE table_versions(
      table_name VARCHAR(50) NOT NULL PRIMARY KEY, 
      version TIMESTAMP NOT NULL
    );
    
    CREATE TRIGGER table_1_version_insert AFTER INSERT
    ON table_1
    FOR EACH ROW
    BEGIN
      REPLACE INTO table_versions VALUES('table_1', CURRENT_TIMESTAMP);
    END
    

答案 2 :(得分:0)

您是否可以在要插入的表上设置触发器以添加到插入日志表中?如果这样可行,您只需要在每次运行时读取日志表。

答案 3 :(得分:0)

使用时间戳。根据您的需要,您可以将其设置为更新新行,或仅更改现有行。去这里看一个参考:

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

答案 4 :(得分:0)

在运行之间检测表更改的常用方法是使用如下查询:

SELECT COUNT(*),MAX(t) FROM table;

但为了实现这一点,对你的桌子必须做出一些假设:

  1. t列的默认值为NOW()
  2. 有一个在UPDATE上运行的触发器,并始终将t列设置为NOW()。
  3. 对表进行的任何正常更改都将导致上述查询的输出发生变化:

    有一些竞争条件可以使这种检查在某些情况下不起作用。

答案 5 :(得分:-1)

使用了CHECKSUM TABLE表名,这非常有效。

从AJAX请求调用它来检查表更新。如果发现更改,则执行屏幕刷新。

对于数据库“myMVC”和表“detail”,它返回一行,字段“table”和“Checksum”分别设置为“mymvc.detail”和“521719307”。