我知道有general_loglogging所有的查询,但我想找出哪个查询有错误,并得到错误消息。 我试图运行一个错误查询的目的,但它作为一个普通的查询日志,并没有报告错误。 有任何想法吗?
总之,没有简单的答案。
但是,如果你没有其他select,那么在服务器上logging错误,而不是在客户端应用程序中,你[卢克]可以使用源。
我给出的方向,然后补丁,它可能会不同地适用于你的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);
在else子句中跟随if(!err)语句,看起来像
else { DBUG_ASSERT(thd->is_error()); DBUG_PRINT("info",("Command aborted. Fatal_error: %d", thd->is_fatal_error)); query_cache_abort(&thd->net); }
插入string像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); }
然后,运行./configure标志–with-debug(以及其他你使用的),编译和运行带有标志的mysqld命令,但是添加debugging标志 – #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
那么,你在输出中看起来像这样:
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
另外,你可能会发现有用的这些链接:
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
希望有所帮助。
不可能AFAIK。 你可以使用MySQL Proxy或tcpdump / tshark一起破解一些东西。