要知道前端下了什麼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種方法:
- 把Log寫入檔案。
- 把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指令到資料庫,變成非常重要的一件事。