代码之家  ›  专栏  ›  技术社区  ›  Cam

获取MySQL数据库差异

  •  3
  • Cam  · 技术社区  · 14 年前

    我有一个MySQL数据库。我想做的是对它执行一个任意的操作,然后找出发生了什么变化。像这样:

    //assume connection to db already established
    
    before();//saves db state
    perform_action();//does stuff to db
    diff();//prints what happened
    

    我希望它输出如下内容:

    Row added in table_0 ]details]
    Row added in table_1 [details]
    Row modified in table_5 [details]
    Row deleted in table_2 [details]
    

    有什么想法吗?


    要进一步澄清:您知道StackOverflow上如何操作,如果您检查一篇文章的编辑,您可以看到指示更改内容的红线/绿色突出显示?我想要类似的东西,但是对于MySQL数据库。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Scott Saunders    14 年前

    我认为通常情况下,您的应用程序会记录任何有趣的更改。或者您可以为所有具有日期时间的内容设置历史记录表。

    要按照您描述的方式进行,您可以在操作前后将数据库的内容转储到一个文件中,并对这两个文件进行比较。在PHP中,您可以查看xdiff: http://us.php.net/manual/en/book.xdiff.php

    如果您只是偶尔在受控环境中测试一些您不确定的查询,那么可以在命令行上转储和diff。

        2
  •  4
  •   titanoboa    14 年前

    与其复制整个数据库以保存状态以便稍后进行比较,不如使用触发器:

    http://dev.mysql.com/doc/refman/5.0/en/triggers.html

    当您设置适当的触发器时,您可以将更改记录到表中—例如,您可以设置一个触发器,自动记录每次更新的旧值和新值。要查看更改,请查询由触发器填充的表。

    当然,触发器不限于 你的 应用程序,它还将记录其他应用程序完成的更新。但如果将数据库的旧版本与新版本进行比较,也会出现这种情况。

        3
  •  0
  •   Zepplock    14 年前

    一种方法是解析日志文件,这将为您提供在数据库中执行的准确SQL语句。我不确定如何将应用程序所做的SQL语句与其他应用程序分开(如果是这样的话)

        4
  •  0
  •   zebediah49    14 年前

    我能想到的唯一一件事就是结合一些有点老套的事情:

    1. 保存[临时?]行ID表,用于检查新行。如果您需要知道之前删除或修改过的行中有哪些内容,那么您需要复制整个数据库,这将非常混乱。

    2. 让每一行都有一个更新时修改的日期戳;抓取更新日期戳比分析开始时更新的行。

    3. 在应用程序和数据库之间有一个层(如果您有类似经典的 $db->query() ,这将使这很容易),日志查询发送,然后可以查看。

    我想真正的问题是,您是想知道正在对数据库执行什么查询,还是想知道正在运行的查询实际上在做什么。