如何在MySQL中仅记录原始查询?

3
我已经让日志文件正常工作了,但是每一行都会有额外的信息,比如“29 Query”,我无法确定,但看起来记录的查询是MySQL内部处理每个查询的解释。是否有一种方法可以自动记录每个查询,就像应用程序执行它们一样,而不需要MySQL在日志中添加任何其他信息?谢谢!
编辑:
作为提供赏金的一部分,让我解释一下我的情况。我们正在使用Magento Commerce,它具有EAV数据库架构。跟踪任何东西以及它存储在哪里是一场绝对的噩梦。我的想法是在应用程序中插入一个产品,然后记录在该过程中执行的每个查询。这很有效,但是日志中有大量其他废话。我真的只想要这样的东西:
1.) SELECT * FROM <TABLE>;
2.) UPDATE <TABLE> SET <VALUE> = <VALUE>;
3.) ...
4.) ...

有些简单的东西可以告诉我执行了什么,这样我就不必去查找控制器和模型来获取所有这些信息。我不需要日期、时间、行号或任何额外的内容。


我在Magento方面有相当多的工作经验。如果您有更具体的问题,我可以尝试指出数据所在的位置! - benlumley
1
你在使用哪个版本的MySQL?有一个很棒的方法只适用于5.1及以上版本,如果你被卡在了5.0或更早的版本,我宁愿避免写出来,因为它对你没有任何帮助。 - Alex Martelli
https://dev59.com/yEbRa4cB1Zd3GeqP0XPP - joe
4个回答

9
要启用完整的日志查询,需要在my.cnf文件中添加以下内容:
log=/var/log/mysqldquery.log

上述内容将所有查询记录到日志文件中。
在对my.cnf文件进行更改后,不要忘记重新启动mysql服务。
SequelPro(Mac客户端)的操作示例输出:
090721 11:06:45      51 Query       ALTER TABLE `test` ADD `name` varchar(10) DEFAULT NULL
                     51 Query       SHOW COLUMNS FROM `test`
                     51 Query       SHOW INDEX FROM `test`
090721 11:06:57      51 Query       SHOW COLUMNS FROM `test`
                     51 Query       UPDATE `test` SET `id`='1', `name`='test' WHERE `id` = '1' AND `name` IS NULL LIMIT 1
                     51 Query       SELECT * FROM `test` LIMIT 0,100
                     51 Query       SELECT COUNT(1) FROM `test`   
090721 11:07:00      51 Query       UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1
                     51 Query       SELECT * FROM `test` LIMIT 0,100
                     51 Query       SELECT COUNT(1) FROM `test`

在基于*NIX的系统上,您可以使用grep来启动。
grep 'SELECT\|INSERT\|UPDATE' querylog.log

或者更加复杂的操作,开始执行以下任务:

grep 'SELECT\|INSERT\|UPDATE' querylog.log | awk '{$1="";$2="";print}'

这将会给你一个类似这样的东西,虽然不完美但更接近:
  51 Query UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1
  SELECT * FROM `test` LIMIT 0,100
  SELECT COUNT(1) FROM `test`
  51 Query INSERT INTO `test` (`id`,`name`) VALUES ('3','testing')
  SELECT * FROM `test` LIMIT 0,100
  SELECT COUNT(1) FROM `test`

我宁愿替换grep之后的前x个字符:sed 's/^.{x}//' - soulmerge

4
您可以使用MySQL查询日志文件。在启动MySQL时添加此参数:
--log=/var/log/mysqld.log

1

1
如果您在提到二进制日志,需要使用mysqlbinlog来传递它以获取有意义的输出。
cat log100.log | mysqlbinlog 

即使使用mysqlbinlog和--short-form选项,我仍然会得到一堆垃圾。 - user4903
没有选择被记录在二进制日志中(除非是插入...选择)。 - David Rabinowitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接