程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL數據庫Audit插件的使用技巧總結

MySQL數據庫Audit插件的使用技巧總結

編輯:MySQL綜合教程

MySQL數據庫中5.5版本),增加了一個新的插件:Audit plugin,用於對數據庫連接和數據庫操作進行審計。接下來我們詳細介紹Audit插件的使用。

相關代碼如下:

  1. sql/sql_audit.cc 

該文件定義了audit插件的接口函數。

  1. sql/sql_audit.h 

申明函數,並定義了函數mysql_audit_general_log,在觸發audit時,首先調用的就是該函數。

  1. plugin/audit_null/audit_null.c 

這是一個模板程序,給出了一個最基本的audit插件所需要定義的接口。

為了實現一個完整的audit程序,需要包括插件初始化、主要函數、卸載插件後的調用函數。這裡我們以audit_null.c為例:

  1. static int audit_null_plugin_init(void *arg __attribute__((unused))) 

在安裝插件時,會調用該函數,主要用於做一些初始化的工作,比如初始化全局變量等。

  1. static void audit_null_notify(MYSQL_THD thd, unsigned int event_class, constvoid *event) 

這是audit插件的主要函數,在相應的事件被觸發時,將會調用到該函數,參數包括:

thd:觸發該函數的線程,在結構體THD中包含了相當豐富的信息,可以借此實現很多有趣的功能

event_class/event:前者表示事件的類型,用於決定第三個參數event結構體的類型,使用宏定義,值為MYSQL_AUDIT_GENERAL_CLASS時表示由操作數據庫的行為所觸發,值為MYSQL_AUDIT_CONNECTION_CLASS時表示由發起數據庫連接所觸發,而針對不同的類型,也會調用不同的接口函數來觸發audit。

  1. staticaudit_handler_t audit_handlers[] =  
  2.  
  3. {  
  4.  
  5. general_class_handler,connection_class_handler  
  6.  
  7. }; 

對上述兩種情況下,又會細分到多個事件類型,在文件plugin_audit.h中進行了定義

1. 發起連接時

  1. #defineMYSQL_AUDIT_CONNECTION_CONNECT 0 

完成認證後觸發

  1. #define MYSQL_AUDIT_CONNECTION_DISCONNECT 1 

連接被中斷時觸發

  1. #define MYSQL_AUDIT_CONNECTION_CHANGE_USER 2 

在執行COM_CHANGE_USER命令後觸發。

event參數的結構為:mysql_event_connection。

2.操作數據庫時

  1. #defineMYSQL_AUDIT_GENERAL_LOG 0   

在提交給general query log之前被觸發

  1. #define MYSQL_AUDIT_GENERAL_ERROR 1 

在發送給用戶錯誤之前觸發

  1. #define MYSQL_AUDIT_GENERAL_RESULT 2 

當將結果集合發送給用戶後觸發

  1. #defineMYSQL_AUDIT_GENERAL_STATUS 3 

當發送一個結果集或發生錯誤時被觸發。event參數的結構體為:mysql_event_general。

不管event的結構體是哪一個,都在其中記錄了上述七種事件類型,我們就可以根據不同的事件類型,有針對性的進行插件代碼的編寫。

3. static int audit_null_plugin_deinit(void*arg __attribute__((unused)))

當卸載插件時,會調用該函數,可以用來執行一些釋放資源、關閉文件等操作

4. 定義插件的描述符結構體:

  1. struct st_mysql_audit    
  2.  
  3. {    
  4.  
  5. int interface_version;    
  6.  
  7. void (*release_thd)(MYSQL_THD);    
  8.  
  9. void (*event_notify)(MYSQL_THD, unsigned int, const void *);    
  10.  
  11. unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];    
  12.  
  13. };   

Version,值一般為MYSQL_AUDIT_INTERFACE_VERSION。

release_thd,一般設置為NULL。

event_notify,主要的處理函數,當發生某些事件時被調用(audit_null_notify)。

class_mask,掩碼。

release_thd和event_notify可以結合起來用,當事件觸發event_notify時,這時候插件是不可以uninstall的,當完成調用後,服務器會通知release_thd函數。這樣,我們可以在event_notify中分配資源,並在release_thd中統一的進行釋放。

5.定義statues變量,用於指定在調用SHOWSTATIS時,顯示哪些值

  1. static struct st_mysql_show_var audit_null_status[] 

6. 插件的庫描述符

  1. mysql_declare_plugin(audit_null)            
  2.  
  3. {                                               
  4.  
  5. MYSQL_AUDIT_PLUGIN,         /* type                            */    
  6.  
  7. &audit_null_descriptor,     /* descriptor                            */    
  8.  
  9. "NULL_AUDIT",               /* name                            */    
  10.  
  11. "Oracle Corp",              /* author                             */    
  12.  
  13. "Simple NULL Audit",        /* description                          */    
  14.  
  15. PLUGIN_LICENSE_GPL,    
  16.  
  17. audit_null_plugin_init,     /* init function (when loaded)               */    
  18.  
  19. audit_null_plugin_deinit,   /* deinit function (when unloaded)             */   

其中 第三個字段 “NULL_AUDIT”就是在執行INSTALLPLUGIN時的插件名,如果不一致,不報無法找到在庫文件中找到符號的錯誤。

總結:

Audit插件可以被多種事件所觸發,因此,當服務器繁忙時,需要小心謹慎的編寫代碼,防止產生太多的額外開銷,以影響服務器的整體性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved