於 MySQL / MariaDB 中啟用 SQL Query Log

要知道前端下了什麼SQL到DB,在SQL Server中你可以使用SQL Server Profiler這個工作來達成。
但是在MySQL / MariaDB中目前似乎沒有一個好用的介面可以使用,
Oracle MySQL Enterprise Monitor 應該可以做到,但是授權商業使用的就是要錢,而且還不便宜,
官方定價,要使用Oracle MySQL Enterprise Monitor 最低消費,請付 USD 5000,價格請見 http://www.mysql.com/products/
這價錢不是一般小公司玩的起的,所以只能先用比較陽春的方法來解決了。
要在 MySQL / MariaDB 中啟用SQL Query Log的功能,有以下2種方法:

  1. 把Log寫入檔案。
  2. 把Log寫入資料庫中的Table。


第1種方法最為簡單,使用編輯器編輯 /etc/mysql/my.cnf 這個檔案。
找到

#general_log_file = /var/log/mysql/mysql.log
#general_log = 1


把註解去掉,變成以下內容,存檔離開。

general_log_file = /var/log/mysql/mysql.log
general_log = 1


然後重新啟動mysql即可,指令為

/etc/init.d/mysql restart

 

 

然後你就可以到 /var/log/mysql/mysql.log 查看目前的Log了。
 
第2種存到Table方法雖然難了一點,但個人比較推薦使用。
一樣使用編輯器編輯 /etc/mysql/my.cnf 這個檔案。
找到

#general_log_file = /var/log/mysql/mysql.log
#general_log = 1


把 general_log 的註解去掉,並加上 log-output=TABLE
變成以下內容,存檔離開。

#general_log_file = /var/log/mysql/mysql.log
general_log = 1
log-output=TABLE


然後重新啟動mysql即可,指令為

/etc/init.d/mysql restart


這時候就可以到資料庫:mysql 中的 Table:general_log 查看 Log 資料了。

SELECT * FROM `mysql`.`general_log` ORDER BY event_time DESC LIMIT 0, 1000;


但是為了以防資料庫的Log無限制的增長,所以另外加了一個定時清Log的Event機制。
每天進行刪除Log,只保留24小時內的Log資料。

DELIMITER $$

CREATE EVENT `mysql`.`prune_general_log`

ON SCHEDULE
EVERY 1 DAY STARTS '2015-03-13'
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT 'This will trim the general_log table to contain only the past 24 hours of logs.'

DO
BEGIN
SET GLOBAL general_log = 'OFF';
RENAME TABLE mysql.general_log TO mysql.general_log2;
DELETE FROM mysql.general_log2 WHERE event_time <= NOW()-INTERVAL 24 HOUR;
OPTIMIZE TABLE general_log2;
RENAME TABLE mysql.general_log2 TO mysql.general_log;
SET GLOBAL general_log = 'ON';
END$$

DELIMITER ;


這樣子基本上,對於寫程式的Debug就可以滿足了,尤其在得了「寫程式沒有ORM就會死」的病後
在Debug時如何得知ORM下了什麼SQL指令到資料庫,變成非常重要的一件事。

新增評論

Loading