[英]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事情的组合:
保存[临时?]行ID表,以检查新行。 如果您之前需要知道删除或修改过的行中的内容,则需要复制整个数据库,这样会非常混乱。
每行都有一个在更新时修改的日期戳; 获取更新后的日期戳比分析开始时更新的行。
在您的应用程序和数据库之间有一个层(如果您有类似经典的$db->query()
,它会使这很简单),发送日志查询,然后可以查看。
我想真正的问题是,如果你想知道对数据库执行了什么查询,或者你想知道他们正在运行的查询实际上在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.