如何在 mysql 中记录错误查询?

如何在 mysql 中记录错误查询?

我知道 general_log 会记录所有查询,但我想找出哪个查询有错误,并获取错误消息。我曾尝试故意运行错误查询,但它记录为正常查询,并没有报告错误。有什么想法吗?

答案1

简而言之,没有简单的答案。
但是,如果您别无选择,只能在服务器上而不是在客户端应用程序中记录错误,那么 [Luke] 可以使用源代码。
我给出的是说明而不是补丁,它可能对您的 mysqld 版本有不同的应用。在 mysql 源目录中,在文件 sql/sql_parce.cc 中,在函数 中的
void mysql_parse(THD *thd, const char *inBuf, uint length, const char ** found_semicolon)
语句之后的 子句中到以下语句中,看起来像bool err= parse_sql(thd, & parser_state, NULL);
elseif(!err)

      else
        {
          DBUG_ASSERT(thd->is_error());
          DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
                             thd->is_fatal_error));

          query_cache_abort(&thd->net);
        }

插入字符串,像DBUG_PRINT("info",("query was: %s",inBuf));
这样

      else
        {
          DBUG_ASSERT(thd->is_error());
          DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
                             thd->is_fatal_error));
          DBUG_PRINT("info",("Query was: %s",inBuf));
          query_cache_abort(&thd->net);
        }


然后,使用标志 --with-debug(以及您使用的其他标志)运行 ./configure,构建并像往常一样使用标志运行 mysqld 命令,但添加调试标志 -#d,info:f,mysql_parse,就像这样:

sudo -u mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 -#d,info:f,mysql_parse


then, what you've got in output looks like this:

100605  3:05:55  InnoDB: Started; log sequence number 2 2219911338
100605  3:05:56 [Note] Event Scheduler: Loaded 0 events
100605  3:05:56 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.1.37-1ubuntu5.1-debug-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
mysql_parse: info: Command aborted. Fatal_error: 0
mysql_parse: info: query was: aldjflsajlfjslfjlsfkjlsdjflsjfljsdlkfjsdf

Also, you may find useful these links:

http://dev.mysql.com/doc/refman/5.0/en/making-trace-files.html
http://dev.mysql.com/doc/refman/5.0/en/the-dbug-package.html


希望有所帮助。

答案2

据我所知不可能。你可以使用 MySQL Proxy 或 tcpdump/tshark 来破解一些东西。

相关内容