2013-06-26 41 views
1

我有一个数据库密集型应用程序,需要每隔几个小时运行一次。有没有办法检测自上次运行该应用程序以来某个表是否发生了变化?MySQL:检测数据库更改

+0

你有没有可以用作触发器的'DATETIME'列? – tadman

回答

0

您可以在要追踪的表上设置触发器,以便将其添加到插入的日志表中?如果这可行,您只需在每次运行中阅读日志表。

+0

这些触发器是否可用于MySQL?你知道我在哪里可以读到他们吗? – averageman

1

几个问题:

  1. 哪个操作系统是你的工作吗?
  2. 您正在使用哪种存储引擎?

虽然命令[http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html](SHOW TABLE STATUS)可以根据存储引擎显示一些信息。

这也取决于密集操作的运行间隔有多大。

我相信最精确的方法是使用触发器(AFTER INSERT/UPDATE)作为@Neuticle提到的,只是将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 
0

检测改变运行之间的一个餐桌上常见的方法是使用这样的查询:

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

但对于这个工作,一些假设必须是真实的餐桌:

  1. t列有一个缺省值NOW()
  2. 存在对UPDATE运行,并始终触发设置t列NOW()。然后

表中所做的任何正常变化会导致上述查询的输出改变:

有一些竞争条件,可以使这种检查在某些情况下无法正常工作。

6

检测变化的最有效方法是这样的。

CHECKSUM TABLE tableName 
0

已经使用了CHECKSUM TABLE表名并且工作得非常出色。

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

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