我有一个数据库,它总是在变化...更新,插入和删除。
出于统计原因,我们需要一些时间来“回到过去”(-:并像过去一样查询数据库。
例如:
我有一个名为user
的表,我昨天更新了一个用户,如下所示:
update user set status = 1 where user_id = 2656
旧的
status
为0,所以如果我可以“回到过去”回到昨天并查询到生病,请获取status
0,如果现在查询生病,请生病,请获取status
1。我知道做到这一点的一种方法是触发更新,插入和删除并将其记录到不同的表中,但是它不是那么干净,并且会使开发变得复杂。
希望您说对了,不要这么简单就不用讲英语。
编辑1
我们的应用程序中只有很少的算法,我们需要对其进行修复并始终进行升级,我们必须了解数据库的过去情况,这样我们才能使用算法,我们可以更改查询/接口来支持该算法(我是意识到这不是一个为期一周的项目,我们有足够的资源来解决这一问题)
谢谢
最佳答案
选项1启用二进制日志。
这将保护所有更新,插入和删除。
Binlog有查询工具。
看到:
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://www.mydigitallife.info/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/
选项2创建一个保存更改的触发器
触发器将数据保存到并行数据库中,该数据库的布局与原始数据库相同,但所有表都有两个额外的字段。名为log_id
的unidue ID和时间戳。每当字段更改时,您都会在日志中输入触发器日志。
您至少需要一个after_update和after_delete触发器,我也建议使用after_insert触发器。如果您愿意,可以在每个名为operation
的表中添加第三个字段,即ENUM('insert','delete','update')
。
DELIMITER $$
CREATE TRIGGER au_table1_each AFTER UPDATE ON table1 FOR EACH ROW
BEGIN
insert into back_to_the_past.table1_log (`timestamp`,operation,f1,f2,f3.f4)
values (now(), 'update', OLD.f1, OLD.f2, OLD.f3, OLD.f4);
END $$
DELIMITER ;
当然,如果在
table1_log
中创建一个额外的时间戳类型字段,则无需将其显式地添加到now()
中,数据库便会这样做。参见:http://dev.mysql.com/doc/refman/5.0/en/triggers.html
关于mysql - Mysql-如何查询过去(回到过去)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7360874/