【问题标题】:MySQL Log of invalid QueriesMySQL 无效查询日志
【发布时间】:2011-06-05 14:13:06
【问题描述】:

我没有从 PHP 运行命令!

我将 MySQL log_error 值设置为 /var/log/mysql/error.log

但是,当我连接到数据库并运行 SQL 命令时,错误不会出现在日志中。


SELECT * 
FROM some_table
where this_is_invalid_and_will_fail="Doesn't matter because column doesn't exist!";

有些命令从某种 Windows 应用程序运行。我只想知道它向 MySQL 服务器发送了哪些无效命令,以便我可以尝试解决它们。

【问题讨论】:

    标签: sql mysql view logging


    【解决方案1】:

    错误日志不会这样做: https://dev.mysql.com/doc/refman/8.0/en/error-log.html

    错误日志包含信息 指示 mysqld 的启动时间和 停止以及任何严重错误 服务器运行时发生的 正在运行。

    MySQL 不会在任何地方记录无效/失败的查询。


    如果是出于调试目的,您可以尝试设置一个 MySQL 代理,我认为它可以记录以下内容:

    http://dev.mysql.com/downloads/mysql-proxy/

    【讨论】:

    • 感谢文档的 sn-p。此外,MySQL 代理的东西看起来很整洁,可惜目前还没有得到更多的开发。
    • 感谢您的提示...终于有一个有用的答案...到目前为止我遇到的所有答案都是“无法完成”或“在您的应用程序中执行”。无论如何,上面的链接已经过时了,所以这是当前的,似乎:dev.mysql.com/downloads/mysql-proxy
    • @Rolf:感谢您的指出,我已经更新了答案中的链接。
    • 多么可疑的设计决定。使用 ORM 或映射器,这会带来不必要的麻烦
    【解决方案2】:

    从 mysql 版本 5.6.3(2011-10-03 发布)开始,有一个名为 log-raw 的变量允许您在常规查询日志中包含无效查询:

    https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_log-raw

    您需要使用general-loggeneral-log-file 打开通用查询日志,例如:

    [mysqld]
    general-log=1
    log-raw=1
    general-log-file=/var/log/mysql/general.log
    

    【讨论】:

    • “允许您在常规查询日志中包含无效查询”。这是不正确的 - 文档特别提到 log-raw 是为了显示被屏蔽的密码,仅此而已。
    • @MartinKonecny,使用log-raw 为我解决了这个问题——它对你不起作用吗?我相信它起作用的原因是mysql要屏蔽密码,它需要能够解析查询。因此,如果它无法解析查询,它不会记录任何内容,这使得通过查看 mysql 日志文件无法检测到此类查询。这就是log-raw 来救援的地方。
    • 不知道为什么根据文档,但确实,log_raw=1 general_log=1 general_log_file=c:/wamp/logs/mysql.query.log 在 MySQL 5.7.16 上也为我工作
    【解决方案3】:

    基本上有两种方式。

    1) 设置某种代理,它可以记录错误查询。原始 mysql 代理有很多分支(@Mchl 提到过)-https://github.com/search?utf8=%E2%9C%93&q=MySQL+Proxy 您也可以在这里找到原始 mysql 代理的最新版本https://github.com/mysql/mysql-proxy

    我不喜欢这种方式,因为它太复杂,无法快速调试

    2) 您可以在 mysql 中启用常规日志(这将记录所有查询)。 它会产生很大的开销并且不符合生产要求,但它可以快速简便地修复开发环境中的错误。

    只需登录到您的 mysql 并执行 SET GLOBAL general_log = 'ON'; SHOW GLOBAL VARIABLES LIKE 'general_log%';

    您将看到日志位置,例如 +------------------+------------------------+ | Variable_name | Value | +------------------+------------------------+ | general_log | OFF | | general_log_file | /mnt/ssd/mysql/s.log | +------------------+------------------------+

    之后执行 mysqladmin flush-logs -u root -p

    当您需要停止日志时 - 只需执行 SET GLOBAL general_log = 'OFF';

    【讨论】:

    • 第二个版本不会写出语法错误
    • 如此优雅的解决方案
    【解决方案4】:

    您可以启用General Query Log 吗?这应该告诉你你需要知道的一切。

    【讨论】:

    • 一般日志很有用。但它没有告诉我哪些命令没有成功运行。例如,我刚刚将 MySQL 从 windows 迁移到 linux,并且遇到了 windows 上没有出现的大小写问题。使用一般查询日志完全无法分辨的东西。 (当然,除非你能纠正我。)
    • 常规查询日志仅记录成功完成的查询。这个问题是关于那些没有的。
    • @muttonUp:这不是真的,General Query Log 记录了服务器在执行之前收到的每条语句。见dev.mysql.com/doc/refman/5.5/en/query-log.html
    • 不会在任何地方说“执行前”或任何关于记录错误的信息。我多年来一直使用 GQL 进行调试,但它从未编写过错误。尝试打开它并在客户端中输入一些随机字符串...什么都没有...
    • 我承认确实出现了一些无效的陈述。但是在选择数据库之前尝试 OPs 查询或尝试此“selectx * from any_table where field=1”。两者都不会显示。
    【解决方案5】:

    这不是那么简单。最好的方法是在您的应用程序中记录错误查询。没有内置方式。

    【讨论】:

    • 它不是我的应用程序。这是我无法访问的某种 Windows 应用程序。
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多