繁体   English   中英

获得MySQL数据库的差异

[英]Getting a MySQL database difference

我有一个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数据库。

您可能最好使用触发器,而不是复制整个数据库以保存稍后差异的状态:

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

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

当然,触发不限于您的应用程序所做的更改,这也将登录其他应用程序进行更新。 但是,如果您使用新版本的数据库区分旧版本的数据库,情况也是如此。

我认为通常你的应用程序会记录任何有趣的变化。 或者您可以使用日期时间为所有内容设置历史记录表。

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

如果您只是偶尔在受控环境中进行测试某些您不确定的查询,则可以在命令行上进行转储和差异。

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

我唯一能想到的就是做一些有点hackey事情的组合:

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

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

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

我想真正的问题是,如果你想知道对数据库执行了什么查询,或者你想知道他们正在运行的查询实际上在做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM