我知道 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);
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);
}
插入字符串,像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 来破解一些东西。