【问题标题】:Mysql - How can I query about the past (go back in time)?Mysql - 我如何查询过去(回到过去)?
【发布时间】:2011-11-13 17:21:05
【问题描述】:

我有一个数据库,它总是在变化……更新、插入和删除。 出于统计原因,我们需要某个时间“回到过去”(-: 并像过去一样查询数据库。

例如: 我有一个名为user 的表,我昨天更新了其中一个用户,如下所示:

update user set status = 1 where user_id = 2656

旧的status 是 0,所以如果我可以“回到过去”到昨天并查询它会得到status 0,如果现在查询它会得到status 1。
我知道这样做的一种方法是触发更新,插入和删除并将其记录到不同的表中,但它不是那么干净,并且会使开发变得复杂。

我希望你说得对,对于不会说英语的人来说,解释起来并不是那么简单......

Edit-1
我们在应用程序中几乎没有算法,我们总是修复它们并升级它们,我们必须知道数据库过去的情况,以便我们可以处理算法,我们有可以更改的查询/接口以支持它(我是意识到这不是一个为期一周的项目,我们有资源)

谢谢

【问题讨论】:

  • 展示您的表格,以及到目前为止您尝试过的内容?
  • 我个人认为这是一个相当糟糕的主意。如果您需要更改大量数据,则需要某种接口。此外,如果您将0 更改为1,则将1 更改为0 同样容易。我不明白您为什么需要类似“时间机器”的功能。
  • @JamWaffles,@DhruvPathak,@Robin Castlin - 我编辑问题(见 Edit-1)谢谢
  • 没有办法在 MySQL(或据我所知的任何其他 SQL 服务器)中“查询过去”。您唯一的选择是实施某种备份或审计跟踪系统。一旦你接受了这一点,你就有很多选择......
  • @Ivar,你显然没听说过二进制日志,不然你就知道你说的是废话。

标签: mysql audit


【解决方案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 的 unqiue 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

【讨论】:

  • 我真的可以得到binlog并转换成数据库,这样我就可以正常查询了吗?谢谢
  • 选项 0:使用存储多个版本的架构(选项 2 是如何在这种架构中维护数据的特定实例 - 但不是唯一的方式)
  • @symcbean,你有这个架构的名称和超链接吗?
【解决方案2】:

实际上,OLTP 数据库的“时间机器”通常使用数据仓库来实现。

您的OLTP (Online transaction processing) database 只需包含最新数据,您的应用程序就可以运行。用历史数据填充它确实会污染架构,减慢它的速度,让它变得更复杂等等。

您的Datawarehouse 将包含大量数据,但不需要接受频繁写入。相反,您使用它来生成报告、分析趋势、做出预测。它是读取优化的,OLAP (On-Line Analytical Processing) 系统。

【讨论】:

    【解决方案3】:

    如果你有你说的资源,我建议你给自己买一个 SAN,把你的 MySQL 数据文件放在一个虚拟磁盘上。以您想要的任何间隔设置该磁盘的增量快照。

    当您需要查找一些历史数据时,您可以根据其中一个快照创建一个新的虚拟磁盘。用另一个 MySQL 服务器挂载新磁盘,然后......玩它。

    这种方法不会给你一个连续的时间表,所以如果需要你应该忽略这个建议......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多