【问题标题】:How do I log just the raw queries in MySQL?如何在 MySQL 中只记录原始查询?
【发布时间】:2009-07-03 01:26:42
【问题描述】:

我的日志文件正常工作,但我在每一行都得到了无关信息,例如“29 Query”,我无法分辨,但看起来记录的查询是 MySQL 如何在内部处理每个查询的解释。有没有一种方法可以在应用程序执行时自动记录每个查询,而 MySQL 不会向日志中添加任何其他信息?谢谢!

编辑:

作为提供赏金的一部分,让我解释一下我的情况。我们正在使用 Magento Commerce,它具有 EAV 数据库架构。追踪任何东西以及它的存储位置绝对是一场噩梦。我的想法是在应用程序的数据库中插入一个产品,然后记录在该过程中执行的每个查询。这工作得很好,但是日志在查询周围还有很多其他的东西。我真的只是想要这样的东西:

1.) SELECT * FROM <TABLE>;
2.) UPDATE <TABLE> SET <VALUE> = <VALUE>;
3.) ...
4.) ...

一些简单的东西告诉我执行了什么,这样我就不必去筛选控制器和模型来尝试得到所有这些。我不需要日期、时间、行号或任何其他内容。

【问题讨论】:

  • 我用 magento 做了很多工作。如果您有更具体的问题,我可以尝试向您指出数据在哪里!
  • 您使用的是什么版本的 MySQL?有一种巧妙的方法仅适用于 5.1 及更高版本,如果您坚持使用 5.0 或更早版本,我宁愿避免花时间编写它,这样它就帮不上您了。

标签: mysql logging


【解决方案1】:

要启用完整的日志查询,请将以下内容添加到您的 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}//'
【解决方案2】:

您可以使用 mysql 查询日志文件。启动mysql时添加这个参数:

--log=/var/log/mysqld.log

【讨论】:

    【解决方案3】:

    如果你指的是二进制日志,你需要使用mysqlbinlog传递它以获得有意义的输出。

    cat log100.log | mysqlbinlog 
    

    【讨论】:

    • 即使使用 mysqlbinlog 和 --short-form 选项我仍然会得到一堆垃圾。
    • 没有选择记录在 bin 日志中(除​​非它是 insert...select)
    【解决方案4】:

    这对你有帮助吗?

    http://www.bigdbahead.com/?p=99

    那里有两种解决方案 - 一种更简单,但需要 mysql 5.1+。

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2017-03-27
      • 2019-08-08
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多