大家都知道在 Microsoft SQL Server 2005 有個 SQL Server Profiler 工具,可以將所有 AP 對 DB 下的 T-SQL 指令全部紀錄下來,供開發人員查詢除錯用,我個人之前也常用這個功能協助我瞭解 LINQ to SQL 真正在 DB 中所下的 T-SQL 為何。不過在 MySQL 中似乎沒這樣的工具,但卻有另一個較簡易的解決方案:設定 my.cnf 即可。
如果你是用 Ubuntu 的話, my.cnf 的路徑在 /etc/mysql/my.cnf,其他的 Linux dist. 也可能在 /etc/my.cnf,檔案內其中有一段設定預設被註解掉了:
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log = /var/log/mysql/mysql.log
你只要將 log = /var/log/mysql/mysql.log 這段最前面的 # 拿掉,並重新啟動 mysql 即可:
/etc/init.d/mysql restart
之後所有對 MySQL 做出的查詢「全部」都會紀錄在 /var/log/mysql/mysql.log 檔案裡了。
MySQL 還有提供另一組參數,可以僅監控「查詢時間過長」的 SQL 指令,用於找出 AP 中比較耗資源的查詢,進而修正程式優化查詢。
#
# Error logging goes to syslog. This is a Debian improvement :)
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
你可以設定 log_slow_queries 指令相關的 log 要儲存在哪個檔案,以及指定 long_query_time 指定「何謂長時間的查詢」,單位為「秒」。
注意:開啟 log 功能,會造成應用程式的效能大幅降低,若是在流量大的應用系統中,建議還是不要開啟這個選項。
相關連結