三月 13

要知道前端下了什麼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指令到資料庫,變成非常重要的一件事。

留下評論