﻿# 如何設定 MySQL 監控所有 AP 對資料庫的查詢

大家都知道在 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 功能，會造成應用程式的效能大幅降低，若是在流量大的應用系統中，建議還是不要開啟這個選項。

**相關連結**

-   [5.2. MySQL Server Logs](http://dev.mysql.com/doc/refman/5.0/en/log-files.html)
