MySQL伺服器雖然提供多樣化的系統日誌,但在稽核日誌上的表現卻差強人意。對此,本文介紹audit_login、mysql_audit這兩個MySQL UDF程式來彌補MySQL資料庫在稽核日誌支援上的不足。
有經驗的管理者遇到系統出問題的第一個動作就是去查看該系統上的日誌(Log)資料,以判別問題的成因。資料庫管理員當然也不例外,當資料庫伺服器出現問題時,也會先去檢視資料庫日誌來研判問題所在。因此,了解資料庫所提供的日誌機制,對一個資料庫管理者在日常維運上是有相當大的幫助。
本文將介紹開源碼社群中最富盛名的MySQL資料庫日誌機制,並且介紹兩個運用MySQL UDF(User Define Function,使用者自訂函數)機制的架構,只要撰寫程式的內容符合此架構的規範,即可撰寫自定義的函數來新增MySQL伺服器的功能)的稽核模組,藉此提升MySQL伺服器的日誌功能。
本次實作所需的套件,如表1所示。
表1 實作所需的套件
MySQL Log種類
在一般的資料庫伺服器內,都會提供記錄各種不同事件的日誌(Log)來幫助資料庫管理員追蹤曾經發生過的各種事件,MySQL資料庫當然也不例外。MySQL資料庫提供了不同記錄事件類型日誌,以供資料庫管理者追蹤相關事件。如圖1所示為MySQL伺服器所提供的日誌類型。接下來,將說明相關日誌的用途。
|
▲圖1 MySQL伺服器所提供的日誌類型。 |
錯誤日誌
MySQL伺服器在啟動或停止以及運作過程中,若發生任何嚴重錯誤的事件,此類型的日誌就會將該事件資訊記錄在檔案內。一旦資料庫發生異常而無法運作,資料庫管理員可先從此檔案取得錯誤的相關資訊,以判定可能異常的原因。
在未設定儲存錯誤日誌檔名的情況下,MySQL伺服器預設會將儲存錯誤日誌的檔案名稱設定成HOST_NAME.err(其中HOST_NAME為主機名稱),並將該檔案置於與資料庫相同位置的目錄內,亦即DATADIR(資料庫所在目錄)。倘若想要自訂錯誤日誌存放位置,則須設定my.cnf(MySQL伺服器的組態檔)內的log-error參數,設定內容如圖2所示。
|
▲圖2 設定my.cnf檔案內的log-error參數。 |
二進位日誌
此類型的日誌是用於記錄MySQL伺服器操作過程中所有的更動動作,包括DDL(資料定義語言,例如CREATE TABLE、ALTER TABLE等操作)以及DML(資料操作語言,例如Update及Insert等操作),但是此類型日誌所記錄的資訊並不包括查詢(SELECT)動作。
依據記錄的範圍不同,二進位日誌的記錄型式包含下列格式:
·Statement:在此種記錄型式下,日誌僅會記錄實際對資料庫中的資料造成修改的SQL語句。例如「update worker set name='abc'」,假設worker資料庫表格(Table)中有1萬筆紀錄,而上述的SQL指令實際僅更改其中的500筆紀錄,日誌即僅會記錄實際被更動的500筆紀錄。此種格式優點在於可節省儲存空間。
·Row:在此種格式下,會記錄每一筆紀錄的變動,以上述SQL指令「update worker set name='abc'」為例,由於此指令會更新整個的資料庫表格(雖然實際僅更動500筆的記錄),如果採用此種方式,就會記錄整個資料庫表格1萬筆的SQL指令,而相對地,日誌量就會大幅地增加,此種格式的優點是可詳細地記錄所有的變動情況。但是,另一方面也將會大大地增加所需的磁碟空間,並且有頻繁寫入磁碟的動作,會拖慢系統的效能。
·mixed:混合上面兩種的記錄格式(這也是MySQL伺服器預設的格式),在一般的情況下會利用Statement格式來記錄,但碰到特殊情況時則改採Row格式來記錄。