任偉建 王子維 霍鳳財 于博文 朱 珊 孫 輝
(1.東北石油大學電氣信息工程學院,黑龍江 大慶 163318;2.大慶油田有限責任公司天然氣分公司,黑龍江 大慶 163000)
目前,油田服務器中含有大量應用系統(tǒng),而每個應用系統(tǒng)都要占用數(shù)據(jù)庫服務器資源。造成數(shù)據(jù)庫中數(shù)據(jù)結構復雜、混亂。如何針對每個應用系統(tǒng)的數(shù)據(jù)進行有效的監(jiān)控和管理是目前亟待解決的問題。
監(jiān)控數(shù)據(jù)庫比較主流的方法有兩種:一種是安裝Oracle自帶的Logminer工具包對數(shù)據(jù)庫的日志文件進行分析[1]。這種方法可以獲取到數(shù)據(jù)庫用戶的操作信息,如操作類型及操作時間等,但是存在以下不足:一是無法獲取到用戶的具體操作內(nèi)容;二是無法監(jiān)控到數(shù)據(jù)庫用戶的系統(tǒng)信息,如登錄時間、退出時間及IP地址等;三是大量占用數(shù)據(jù)庫存儲空間,影響數(shù)據(jù)庫性能,Logminer分析器將監(jiān)控產(chǎn)生的數(shù)據(jù)全部堆積到日志文件中,數(shù)據(jù)調用十分繁瑣,而且還會生成大量的冗余信息,對數(shù)據(jù)庫性能造成很大影響。第二種方法是創(chuàng)建數(shù)據(jù)庫觸發(fā)器,調用系統(tǒng)監(jiān)聽函數(shù)獲取用戶在數(shù)據(jù)庫中的行為[2],通過即時觸發(fā)的方式進行信息記錄[3]。這種監(jiān)控方式可以捕獲到數(shù)據(jù)庫用戶的IP地址[4]及在數(shù)據(jù)庫中的活動時間等系統(tǒng)信息,但由于系統(tǒng)函數(shù)存在的權限問題,無法獲取到與用戶操作有關的信息。由于油田數(shù)據(jù)庫要針對業(yè)務部門的各個應用系統(tǒng)的使用情況進行全方位的監(jiān)控,必須同時包含詳細的用戶操作信息內(nèi)容和系統(tǒng)信息,因此以上兩種傳統(tǒng)的數(shù)據(jù)庫監(jiān)控方法都有不足之處。
而Oracle數(shù)據(jù)庫特有的細粒度審計功能,可以解決一部分問題。細粒度審計功能可以記錄用戶具體操作的SQL語句和變量綁定值。基于這種情況,筆者利用Oracle的細粒度審計功能,提出一種基于Oracle數(shù)據(jù)庫細粒度審計技術與數(shù)據(jù)庫觸發(fā)器觸發(fā)監(jiān)控技術相結合的混合式監(jiān)控技術,開發(fā)了一種基于Oracle數(shù)據(jù)庫的數(shù)據(jù)庫監(jiān)控系統(tǒng)。系統(tǒng)通過對數(shù)據(jù)庫用戶的系統(tǒng)信息和操作行為的監(jiān)控,為數(shù)據(jù)庫管理員提供管理和維護數(shù)據(jù)庫的輔助分析工具,提高數(shù)據(jù)庫管理員的工作效率,確保業(yè)務部門應用系統(tǒng)的不間斷運行。
筆者所開發(fā)的監(jiān)控系統(tǒng)依托于Oracle10g數(shù)據(jù)庫,主要開發(fā)語言為SQL腳本代碼。網(wǎng)頁框架和頁面設計開發(fā)工具為Visual Studio 2010,主要編程語言為C#和JavaScript腳本語言。
數(shù)據(jù)庫監(jiān)控系統(tǒng)采用B/S模式的3層系統(tǒng)架構,即應用層、業(yè)務邏輯層和數(shù)據(jù)層。監(jiān)控服務器端與監(jiān)控數(shù)據(jù)庫之間的交互是雙向的,服務器端既可以從數(shù)據(jù)庫中讀取數(shù)據(jù),也可以將服務器實時監(jiān)控數(shù)據(jù)寫入數(shù)據(jù)庫中;客戶端與服務器端的交互是單向的,客戶端從服務器端讀取數(shù)據(jù)并進行數(shù)據(jù)的查詢、調用和分析。
數(shù)據(jù)庫監(jiān)控分為3個步驟:
a. 定義監(jiān)控策略。為了節(jié)省數(shù)據(jù)庫資源,通過自定義監(jiān)控方式,建立相應的監(jiān)控策略。
b. 開發(fā)監(jiān)控數(shù)據(jù)字典。為了使大量監(jiān)控數(shù)據(jù)結構化存儲,方便管理員有針對性地查詢分析,開發(fā)監(jiān)控體系所需要的數(shù)據(jù)字典。
c. 實施監(jiān)控查詢調用。在建立了監(jiān)控策略并構建了監(jiān)控數(shù)據(jù)字典之后,即可實現(xiàn)監(jiān)控的查詢調用,管理員可以從用戶的系統(tǒng)信息和具體操作內(nèi)容的角度進行數(shù)據(jù)分析,全方位了解業(yè)務部門的數(shù)據(jù)使用情況。
為了使監(jiān)控數(shù)據(jù)能夠更好地被查詢、調用和管理,首先需要定義一個監(jiān)控策略。監(jiān)控策略能夠針對每張不同的數(shù)據(jù)表進行自定義監(jiān)控方式,用以監(jiān)控不同數(shù)據(jù)表的不同操作。這樣既可以防止數(shù)據(jù)庫資源過多地被占用,又可以更加規(guī)范地管理監(jiān)控過程所產(chǎn)生的大量監(jiān)控數(shù)據(jù)。
監(jiān)控策略的定義位于最高權限SYS管理員用戶下的數(shù)據(jù)字典DBA_AUDIT_POLICIES視圖中。該策略視圖中包含監(jiān)控動態(tài)視圖中一些重要列的簡短描述。筆者通過開發(fā)審計策略處理器模塊,編寫程序腳本,在SYSTEM本地管理員用戶下執(zhí)行添加。這樣一來,管理員通過輸入不同的審計策略命令即可添加對不同數(shù)據(jù)表的監(jiān)控策略。在監(jiān)控策略表中,每一行數(shù)據(jù)代表一個監(jiān)控策略。PNAME字段下即審計策略名,STMT_TYPE為監(jiān)控策略的不同類型,可以任意監(jiān)控SELECT、INSERT、DELETE和UPDATE這4種操作方式的任意組合。
在Oracle數(shù)據(jù)庫中,對數(shù)據(jù)進行歸類整理后形成的數(shù)據(jù)集稱作數(shù)據(jù)字典。數(shù)據(jù)字典是Oracle數(shù)據(jù)庫存儲數(shù)據(jù)庫結構信息的地方[5],同時也是用來描述數(shù)據(jù)庫數(shù)據(jù)組織方式的,具體由數(shù)據(jù)表和視圖組成。數(shù)據(jù)字典具有維護數(shù)據(jù)庫系統(tǒng)穩(wěn)定性的重要作用,由于數(shù)據(jù)庫監(jiān)控過程中產(chǎn)生的監(jiān)控數(shù)據(jù)量巨大,如果不對監(jiān)控數(shù)據(jù)進行有效地管理則會大量占用數(shù)據(jù)庫資源,對數(shù)據(jù)庫性能產(chǎn)生影響。筆者通過執(zhí)行編寫好的Catalog.sql監(jiān)控數(shù)據(jù)字典腳本,構造數(shù)據(jù)庫監(jiān)控所必須的監(jiān)控數(shù)據(jù)表和動態(tài)性能視圖。對監(jiān)控數(shù)據(jù)字典的設計主要從以下幾個方面展開。
監(jiān)控視圖,即動態(tài)性能視圖配置。在進行數(shù)據(jù)庫監(jiān)控之前,需配置好標準結構的監(jiān)控數(shù)據(jù)動態(tài)性能視圖,動態(tài)性能視圖是一組反映數(shù)據(jù)庫當前活動信息的虛擬表,所有者為SYS,以v$或者gv$開頭,是管理員監(jiān)控和調優(yōu)數(shù)據(jù)庫的重要工具,如v$process、v$session及v$sqltest等視圖,這些視圖存儲監(jiān)控用戶的系統(tǒng)信息和具體操作SQL語句,為數(shù)據(jù)表查詢數(shù)據(jù)提供數(shù)據(jù)源。
監(jiān)控數(shù)據(jù)表,即表結構、表關系及屬性數(shù)據(jù)類型等。在進行數(shù)據(jù)庫監(jiān)控之前,必須建立起用于存儲不同類型監(jiān)控信息的數(shù)據(jù)表以及表間關系。其目的是為了使大量數(shù)據(jù)庫監(jiān)控信息結構化存儲,避免進入審計日志中。同時,依靠表關系可以讓各類監(jiān)控數(shù)據(jù)以有意義的方式聯(lián)系到一起,便于分析查詢。
監(jiān)控數(shù)據(jù)的存儲結構和存儲方法設計。提前構建存儲不同業(yè)務部門監(jiān)控數(shù)據(jù)的數(shù)據(jù)表和表結構,防止造成數(shù)據(jù)存儲混亂,致使查詢分析速度過慢。
監(jiān)控數(shù)據(jù)操作權限配置。在初始化數(shù)據(jù)字典代碼時,要定義數(shù)據(jù)字典的安全級別,本系統(tǒng)由于涉及監(jiān)控信息,程序設定數(shù)據(jù)字典為控制級,即在系統(tǒng)外無法對數(shù)據(jù)字典進行篡改。
數(shù)據(jù)字典是在監(jiān)控系統(tǒng)部署之前通過編寫好的Catalog.sql腳本直接生成的,杜絕了篡改數(shù)據(jù)字典的可能。保證了監(jiān)控數(shù)據(jù)的安全可靠。同時監(jiān)控數(shù)據(jù)字典提供不同接口,使不同業(yè)務部門的監(jiān)控數(shù)據(jù)存入指定的監(jiān)控數(shù)據(jù)表,充分發(fā)揮了數(shù)據(jù)字典的靈活性,使查詢代碼量大為減少,提高了管理員分析監(jiān)控數(shù)據(jù)的速率。監(jiān)控數(shù)據(jù)字典構建流程如圖1所示。

圖1 監(jiān)控數(shù)據(jù)字典構建流程
2.3.1用戶操作數(shù)據(jù)監(jiān)控
筆者所開發(fā)的數(shù)據(jù)庫監(jiān)控系統(tǒng)允許將單個的DML語句連同數(shù)據(jù)庫用戶提交的確切語句一起進行審計。除了簡單地跟蹤代碼之外,該技術還通過在每次用戶選擇特定的數(shù)據(jù)集時執(zhí)行數(shù)據(jù)庫內(nèi)部代碼。將監(jiān)控數(shù)據(jù)利用上文所提及的步驟自動添加到SYS最高管理員權限下名為FGA_LOG$的系統(tǒng)表中。其中記錄了監(jiān)控事件的時間戳、執(zhí)行操作的數(shù)據(jù)庫用戶ID、操作對象表的名稱和所有者,最后還有確切的DML語句SQL代碼。用戶操作數(shù)據(jù)監(jiān)控流程如圖2所示。

圖2 用戶操作數(shù)據(jù)監(jiān)控流程
2.3.2系統(tǒng)信息監(jiān)控
僅開發(fā)基于Oracle的細粒度審計數(shù)據(jù)監(jiān)控還不足以滿足油田數(shù)據(jù)庫監(jiān)控應用系統(tǒng)的要求。要全方位的獲取應用系統(tǒng)的使用情況還需要清楚數(shù)據(jù)庫用戶確切的系統(tǒng)信息,如IP地址、登錄數(shù)據(jù)庫時間及退出數(shù)據(jù)庫時間等。為了獲取數(shù)據(jù)庫用戶操作的系統(tǒng)信息,筆者構建了一個具有系統(tǒng)權限的觸發(fā)器。當觸發(fā)事件發(fā)生的時候,可以啟動該觸發(fā)器。通過調用系統(tǒng)事件函數(shù)(Event Attribute Functions)來獲取系統(tǒng)信息,利用數(shù)據(jù)庫自帶函數(shù)SYS_CONTEXT來追蹤系統(tǒng)事件。通過觸發(fā)器的即時監(jiān)控,用戶可以進行包括審計、把對象PIN入共享池及進行一些維護等操作。
Logon/Logoff觸發(fā)器。Logon/Logoff觸發(fā)器可以用來記錄用戶在數(shù)據(jù)庫中的活動時間。在使用系統(tǒng)級觸發(fā)器前,首先要確認系統(tǒng)參數(shù)_system_trig_enabled是否設置為TRUE。在用戶登錄和退出數(shù)據(jù)庫時,觸發(fā)系統(tǒng)監(jiān)聽函數(shù),通過數(shù)據(jù)庫底層腳本編寫觸發(fā)器并構建標準結構的用來記錄系統(tǒng)監(jiān)控信息的數(shù)據(jù)表。
關聯(lián)觸發(fā)器。由于Oracle數(shù)據(jù)庫是關系型數(shù)據(jù)庫,筆者通過構建關聯(lián)觸發(fā)器將數(shù)據(jù)字典中用戶操作監(jiān)控數(shù)據(jù)表與觸發(fā)器觸發(fā)監(jiān)控生成的系統(tǒng)信息監(jiān)控表相關聯(lián)。將用戶操作監(jiān)控數(shù)據(jù)表中的操作內(nèi)容SQL語句、數(shù)據(jù)表名、時間戳字段和系統(tǒng)信息監(jiān)控表的用戶名、IP地址字段分別提取出來關聯(lián)到一張數(shù)據(jù)表內(nèi)。具體操作步驟如下:
a. 在SYS用戶下構建AFTER觸發(fā)器,在用戶操作后執(zhí)行該觸發(fā)器代碼;
b. 聲明變量,用于存儲監(jiān)控信息內(nèi)容,數(shù)量和類型要與監(jiān)控表中字段類型一致;
c. 利用session_id、時間戳這兩張表中共有的字段作為相關查詢條件,將相同時間兩張表中需要的字段信息提取出來;
d. 將提取出來的字段信息賦給之前聲明的變量,利用SQL代碼統(tǒng)一插入到一張新的數(shù)據(jù)表中,作為相關業(yè)務部門的監(jiān)控數(shù)據(jù)表。
這樣就將兩張數(shù)據(jù)表中的不同字段信息通過觸發(fā)器統(tǒng)一關聯(lián)到一張新的數(shù)據(jù)表中了,在查詢分析時方便快捷,所需查詢時間很少。而直接在數(shù)據(jù)庫中通過嵌套查詢的復雜SQL語句關聯(lián)查詢多表也可以實現(xiàn)這個功能,但是計算量過大,所需時間以分鐘為單位,用戶體驗極差。
在獲取到用戶的操作信息和IP地址系統(tǒng)信息之后,筆者應用ASP.NET技術[6~8]編寫鏈接數(shù)據(jù)庫字符串,以B/S架構的方式將監(jiān)控信息可視化展現(xiàn)在瀏覽器端。設置時間段等智能查詢方式便于管理員有針對性地查詢。
筆者所開發(fā)的數(shù)據(jù)庫監(jiān)控系統(tǒng)是基于Oracle數(shù)據(jù)庫細粒度審計技術與數(shù)據(jù)庫觸發(fā)器觸發(fā)監(jiān)控技術相結合的混合式監(jiān)控技術。該技術已經(jīng)在油田數(shù)據(jù)庫中試運行了一段時間,通過實踐證明,該監(jiān)控系統(tǒng)能夠有效地監(jiān)控數(shù)據(jù)庫用戶在應用系統(tǒng)中對數(shù)據(jù)庫進行的一切操作和數(shù)據(jù)庫用戶在數(shù)據(jù)庫中的詳細系統(tǒng)信息。通過定義監(jiān)控策略及構建監(jiān)控數(shù)據(jù)字典等步驟將大量監(jiān)控數(shù)據(jù)結構化存儲,進行了有效的管理,便于管理員查看和調用。通過分析監(jiān)控數(shù)據(jù),管理員可以對數(shù)據(jù)庫中的所有被監(jiān)控用戶和應用系統(tǒng)的重點表進行全方位的掌控,從而避免某些應用系統(tǒng)數(shù)據(jù)維護不及時及冗余操作過多等現(xiàn)象發(fā)生,對數(shù)據(jù)庫的管理和性能調優(yōu)非常有必要。
[1] 張立奎,閆子熙.基于LogMiner的Oracle數(shù)據(jù)庫日志分析[J].計算機與網(wǎng)絡,2013,39(z1):145~147.
[2] 支馨悅.觸發(fā)器在實現(xiàn)數(shù)據(jù)庫安全方面的幾種應用[J].林區(qū)教學,2011,(5):95~96.
[3] 鐘亞妹.觸發(fā)器在SQL Server數(shù)據(jù)庫開發(fā)中的應用與研究[J].電腦知識與技術,2011,7(11):2492~2494.
[4] 韋晨艷,楊鍵鳴,姚斯立.SQL數(shù)據(jù)庫中存儲過程、觸發(fā)器的應用研究[J].中國信息界,2011,(6):59~60.
[5] 劉曉華.企業(yè)數(shù)據(jù)字典標準化管理平臺解決方案探討[J].武漢工程大學學報,2008,30(1):101~103.
[6] 尚肖飛.基于ASP.NET高職院校教務管理系統(tǒng)的設計與實現(xiàn)[D].哈爾濱:黑龍江大學,2011.
[7] Li T H,F(xiàn)eng W.Design and Implementation of Blood Management System Based on B/S[J].Journal of Capital Medical University,2010,31(6):821~823.
[8] 向才鳳,張岳衡.基于ASP.NET的企業(yè)進銷存管理信息系統(tǒng)的設計與實現(xiàn)[J].中國管理信息化,2011,14(3):35~36.