這裡將把Log資料儲存至遠端資料庫上並利用MySQL中Trigger的機制,在無須撰寫任何程式碼的前提下,完成一項可直接從資料庫層面自動回報Log紀錄中異常情況的功能。
觸發器將觸發的時機點定義為之前(Before,在資料庫動作之前觸發)與之後(After,在資料庫動作之後觸發),並定義New(資料庫更新後的資料)及Old(資料庫更新前的資料)來表示新舊的資料庫。以下為建立觸發的語法:
在說明MySQL的觸發器機制後,繼續說明本文會使用到的MySQL外掛程式(UDF)。
什麼是UDF
為了讓更多人能參與增進MySQL功能的工作,MySQL提出了UDF(使用者自定函數,User Define Function)的架構,只要撰寫程式的內容符合此架構的規範,即可撰寫MySQL定義的函數來提升MySQL的功能。在「http://www.mysqludf.org/」網站中有相當多的UDF函數,值得一看。表6為常用的UDF函數說明。
表6 常用的UDF函數
接下來,說明本文所使用的UDF函數。
lib_mysqludf_sys簡介
或許是因為考量資訊安全的關係,MySQL並不像其他的商業化資料庫軟體如微軟的MSSQL,有提供直接呼叫系統指令的功能。不過,從使用者的便利性來看,提供可直接從MySQL執行系統指令的功能,在某些情況下是相當便利的,而lib_mysqludf_sys就是用來直接從資料庫呼叫外部程式的功能。本文將利用此程式庫所提供的功能呼叫外部程式來寄發電子郵件。
要特別注意的是,在lib_mysqludf_sys的說明文件中,有特別說明此程式庫尚在實驗的階段,亦即尚未完全穩定,在使用上可能會有一些不可預期的結果出現。依照筆者的測試,簡單的系統指令(如ls cat等指令)可以正常的運作,但若執行自定義的程式(例如自行撰寫的程式),有時候會造成資料庫重新啟動的現象。以下就來說明如何安裝lib_mysqludf_sys程式庫,安裝步驟如下:
先下載lib_mysqludf_sys,並解壓縮原始碼:
然後,將lib_mysqludf_sys.so複製至MySQL的Plugin目錄(通常為MySQL的「lib」目錄下的「plugin」目錄),在此為「/usr/local/mysql5/lib/plugin/」。
登入MySQL後,以「mysql -u root -p[資料庫密碼]」登入,接著以下列指令新建函數(其中mysql>為提示字元):
lib_mysqludf_sys的相關函數功能,以下分別加以說明:
·sys_get:取得系統變數例如PATH(系統路徑)的變數內容,如圖4所示。
|
▲圖4 取得PATH(系統路徑)的變數內容。 |
·sys_set:設定系統變數的內容,如圖5所示為設定系統變數(MYPATH)的內容。
|
▲圖5 設定系統變數(MYPATH)的內容。 |
·sys_eval:執行指令並取得回覆的資訊,如圖6所示為顯示passwd的檔案名稱,與sys_exec不同的是,此指令回覆的資訊為執行的結果,而sys_exec指令回覆的是此指令是否成功的執行,也就是回傳代碼(如1或255)。
|
▲圖6 顯示passwd的檔案名稱。 |
·sys_exec:執行指令並取得執行後的回傳代碼(僅傳回零值與非零值來代表指令是否有正常的執行)。
lib_mysqludf_preg簡介
lib_mysqludf_preg程式庫主要是提供MySQL更進階的正規化表示法的功能,本文利用此程式庫所提供的正規化表示功能來取得相關Log的樣式,安裝步驟如下: