Linux
如何在mysql中記錄錯誤查詢?
我知道有記錄所有查詢的general_log,但我想找出哪個查詢有錯誤,並得到錯誤消息。我曾嘗試故意執行錯誤查詢,但它記錄為正常查詢並且不會報告錯誤。有任何想法嗎?
簡而言之,沒有簡單的答案。
但是,如果您別無選擇,那麼在伺服器上而不是在客戶端應用程序中記錄錯誤,您
$$ 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
然後,您在輸出中得到的內容如下所示:
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
希望有幫助。