我有一个需要每隔几个小时运行一次的数据库密集型应用程序。有没有办法检测给定的表自该应用程序上次运行以来是否发生了变化?
6 回答
检测更改的最有效方法是这样。
CHECKSUM TABLE tableName
几个问题:
- 您正在开发哪个操作系统?
- 您使用的是哪个存储引擎?
命令 [http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html](SHOW TABLE STATUS) 可以根据存储引擎显示一些信息。
它还取决于密集操作的运行间隔有多大。
我认为最精确的方法是使用@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
使用时间戳。根据您的需要,您可以将其设置为更新新行,或仅更改现有行。去这里看看参考:
http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
您能否在要跟踪的表上设置触发器以在插入时添加到日志表中?如果这样可行,您只需在每次运行时读取日志表。
在运行之间检测表更改的常用方法是使用如下查询:
SELECT COUNT(*),MAX(t) FROM table;
但要使其正常工作,您的表必须有一些假设是正确的:
- 该
t
列的默认值为 NOW() - 有一个触发器在 UPDATE 上运行并始终将
t
列设置为 NOW()。
对表所做的任何正常更改都会导致上述查询的输出发生更改:
有一些竞争条件可以使这种检查在某些情况下不起作用。
Have used CHECKSUM TABLE tablename and that works just splendid.
Am calling it from an AJAX request to check for table updates. If changes are found a screen refresh is performed.
For database "myMVC" and table "detail" it returns one row with fields "table" and "Checksum" set to "mymvc.detail" and "521719307" respectively.