Linux

如何在mysql中記錄錯誤查詢?

  • June 5, 2010

我知道有記錄所有查詢的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

希望有幫助。

引用自:https://serverfault.com/questions/133997