任偉建 王子維 霍鳳財 于博文 朱 珊 孫 輝
(1.東北石油大學(xué)電氣信息工程學(xué)院,黑龍江 大慶 163318;2.大慶油田有限責(zé)任公司天然氣分公司,黑龍江 大慶 163000)
目前,油田服務(wù)器中含有大量應(yīng)用系統(tǒng),而每個應(yīng)用系統(tǒng)都要占用數(shù)據(jù)庫服務(wù)器資源。造成數(shù)據(jù)庫中數(shù)據(jù)結(jié)構(gòu)復(fù)雜、混亂。如何針對每個應(yīng)用系統(tǒng)的數(shù)據(jù)進(jìn)行有效的監(jiān)控和管理是目前亟待解決的問題。
監(jiān)控數(shù)據(jù)庫比較主流的方法有兩種:一種是安裝Oracle自帶的Logminer工具包對數(shù)據(jù)庫的日志文件進(jìn)行分析[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ù)調(diào)用十分繁瑣,而且還會生成大量的冗余信息,對數(shù)據(jù)庫性能造成很大影響。第二種方法是創(chuàng)建數(shù)據(jù)庫觸發(fā)器,調(diào)用系統(tǒng)監(jiān)聽函數(shù)獲取用戶在數(shù)據(jù)庫中的行為[2],通過即時觸發(fā)的方式進(jìn)行信息記錄[3]。這種監(jiān)控方式可以捕獲到數(shù)據(jù)庫用戶的IP地址[4]及在數(shù)據(jù)庫中的活動時間等系統(tǒng)信息,但由于系統(tǒng)函數(shù)存在的權(quán)限問題,無法獲取到與用戶操作有關(guān)的信息。由于油田數(shù)據(jù)庫要針對業(yè)務(wù)部門的各個應(yīng)用系統(tǒng)的使用情況進(jìn)行全方位的監(jiān)控,必須同時包含詳細(xì)的用戶操作信息內(nèi)容和系統(tǒng)信息,因此以上兩種傳統(tǒng)的數(shù)據(jù)庫監(jiān)控方法都有不足之處。
而Oracle數(shù)據(jù)庫特有的細(xì)粒度審計功能,可以解決一部分問題。細(xì)粒度審計功能可以記錄用戶具體操作的SQL語句和變量綁定值。基于這種情況,筆者利用Oracle的細(xì)粒度審計功能,提出一種基于Oracle數(shù)據(jù)庫細(xì)粒度審計技術(shù)與數(shù)據(jù)庫觸發(fā)器觸發(fā)監(jiān)控技術(shù)相結(jié)合的混合式監(jiān)控技術(shù),開發(fā)了一種基于Oracle數(shù)據(jù)庫的數(shù)據(jù)庫監(jiān)控系統(tǒng)。系統(tǒng)通過對數(shù)據(jù)庫用戶的系統(tǒng)信息和操作行為的監(jiān)控,為數(shù)據(jù)庫管理員提供管理和維護(hù)數(shù)據(jù)庫的輔助分析工具,提高數(shù)據(jù)庫管理員的工作效率,確保業(yè)務(wù)部門應(yīng)用系統(tǒng)的不間斷運(yùn)行。
筆者所開發(fā)的監(jiān)控系統(tǒng)依托于Oracle10g數(shù)據(jù)庫,主要開發(fā)語言為SQL腳本代碼。網(wǎng)頁框架和頁面設(shè)計開發(fā)工具為Visual Studio 2010,主要編程語言為C#和JavaScript腳本語言。
數(shù)據(jù)庫監(jiān)控系統(tǒng)采用B/S模式的3層系統(tǒng)架構(gòu),即應(yīng)用層、業(yè)務(wù)邏輯層和數(shù)據(jù)層。監(jiān)控服務(wù)器端與監(jiān)控數(shù)據(jù)庫之間的交互是雙向的,服務(wù)器端既可以從數(shù)據(jù)庫中讀取數(shù)據(jù),也可以將服務(wù)器實(shí)時監(jiān)控數(shù)據(jù)寫入數(shù)據(jù)庫中;客戶端與服務(wù)器端的交互是單向的,客戶端從服務(wù)器端讀取數(shù)據(jù)并進(jìn)行數(shù)據(jù)的查詢、調(diào)用和分析。
數(shù)據(jù)庫監(jiān)控分為3個步驟:
a. 定義監(jiān)控策略。為了節(jié)省數(shù)據(jù)庫資源,通過自定義監(jiān)控方式,建立相應(yīng)的監(jiān)控策略。
b. 開發(fā)監(jiān)控數(shù)據(jù)字典。為了使大量監(jiān)控數(shù)據(jù)結(jié)構(gòu)化存儲,方便管理員有針對性地查詢分析,開發(fā)監(jiān)控體系所需要的數(shù)據(jù)字典。
c. 實(shí)施監(jiān)控查詢調(diào)用。在建立了監(jiān)控策略并構(gòu)建了監(jiān)控數(shù)據(jù)字典之后,即可實(shí)現(xiàn)監(jiān)控的查詢調(diào)用,管理員可以從用戶的系統(tǒng)信息和具體操作內(nèi)容的角度進(jìn)行數(shù)據(jù)分析,全方位了解業(yè)務(wù)部門的數(shù)據(jù)使用情況。
為了使監(jiān)控數(shù)據(jù)能夠更好地被查詢、調(diào)用和管理,首先需要定義一個監(jiān)控策略。監(jiān)控策略能夠針對每張不同的數(shù)據(jù)表進(jìn)行自定義監(jiān)控方式,用以監(jiān)控不同數(shù)據(jù)表的不同操作。這樣既可以防止數(shù)據(jù)庫資源過多地被占用,又可以更加規(guī)范地管理監(jiān)控過程所產(chǎn)生的大量監(jiān)控數(shù)據(jù)。
監(jiān)控策略的定義位于最高權(quá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ù)進(jìn)行歸類整理后形成的數(shù)據(jù)集稱作數(shù)據(jù)字典。數(shù)據(jù)字典是Oracle數(shù)據(jù)庫存儲數(shù)據(jù)庫結(jié)構(gòu)信息的地方[5],同時也是用來描述數(shù)據(jù)庫數(shù)據(jù)組織方式的,具體由數(shù)據(jù)表和視圖組成。數(shù)據(jù)字典具有維護(hù)數(shù)據(jù)庫系統(tǒng)穩(wěn)定性的重要作用,由于數(shù)據(jù)庫監(jiān)控過程中產(chǎn)生的監(jiān)控數(shù)據(jù)量巨大,如果不對監(jiān)控數(shù)據(jù)進(jìn)行有效地管理則會大量占用數(shù)據(jù)庫資源,對數(shù)據(jù)庫性能產(chǎn)生影響。筆者通過執(zhí)行編寫好的Catalog.sql監(jiān)控數(shù)據(jù)字典腳本,構(gòu)造數(shù)據(jù)庫監(jiān)控所必須的監(jiān)控數(shù)據(jù)表和動態(tài)性能視圖。對監(jiān)控數(shù)據(jù)字典的設(shè)計主要從以下幾個方面展開。
監(jiān)控視圖,即動態(tài)性能視圖配置。在進(jìn)行數(shù)據(jù)庫監(jiān)控之前,需配置好標(biāo)準(zhǔn)結(jié)構(gòu)的監(jiān)控數(shù)據(jù)動態(tài)性能視圖,動態(tài)性能視圖是一組反映數(shù)據(jù)庫當(dāng)前活動信息的虛擬表,所有者為SYS,以v$或者gv$開頭,是管理員監(jiān)控和調(diào)優(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ù)表,即表結(jié)構(gòu)、表關(guān)系及屬性數(shù)據(jù)類型等。在進(jìn)行數(shù)據(jù)庫監(jiān)控之前,必須建立起用于存儲不同類型監(jiān)控信息的數(shù)據(jù)表以及表間關(guān)系。其目的是為了使大量數(shù)據(jù)庫監(jiān)控信息結(jié)構(gòu)化存儲,避免進(jìn)入審計日志中。同時,依靠表關(guān)系可以讓各類監(jiān)控數(shù)據(jù)以有意義的方式聯(lián)系到一起,便于分析查詢。
監(jiān)控數(shù)據(jù)的存儲結(jié)構(gòu)和存儲方法設(shè)計。提前構(gòu)建存儲不同業(yè)務(wù)部門監(jiān)控數(shù)據(jù)的數(shù)據(jù)表和表結(jié)構(gòu),防止造成數(shù)據(jù)存儲混亂,致使查詢分析速度過慢。
監(jiān)控數(shù)據(jù)操作權(quán)限配置。在初始化數(shù)據(jù)字典代碼時,要定義數(shù)據(jù)字典的安全級別,本系統(tǒng)由于涉及監(jiān)控信息,程序設(shè)定數(shù)據(jù)字典為控制級,即在系統(tǒng)外無法對數(shù)據(jù)字典進(jìn)行篡改。
數(shù)據(jù)字典是在監(jiān)控系統(tǒng)部署之前通過編寫好的Catalog.sql腳本直接生成的,杜絕了篡改數(shù)據(jù)字典的可能。保證了監(jiān)控數(shù)據(jù)的安全可靠。同時監(jiān)控數(shù)據(jù)字典提供不同接口,使不同業(yè)務(wù)部門的監(jiān)控數(shù)據(jù)存入指定的監(jiān)控數(shù)據(jù)表,充分發(fā)揮了數(shù)據(jù)字典的靈活性,使查詢代碼量大為減少,提高了管理員分析監(jiān)控數(shù)據(jù)的速率。監(jiān)控數(shù)據(jù)字典構(gòu)建流程如圖1所示。
圖1 監(jiān)控數(shù)據(jù)字典構(gòu)建流程
2.3.1用戶操作數(shù)據(jù)監(jiān)控
筆者所開發(fā)的數(shù)據(jù)庫監(jiān)控系統(tǒng)允許將單個的DML語句連同數(shù)據(jù)庫用戶提交的確切語句一起進(jìn)行審計。除了簡單地跟蹤代碼之外,該技術(shù)還通過在每次用戶選擇特定的數(shù)據(jù)集時執(zhí)行數(shù)據(jù)庫內(nèi)部代碼。將監(jiān)控數(shù)據(jù)利用上文所提及的步驟自動添加到SYS最高管理員權(quán)限下名為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的細(xì)粒度審計數(shù)據(jù)監(jiān)控還不足以滿足油田數(shù)據(jù)庫監(jiān)控應(yīng)用系統(tǒng)的要求。要全方位的獲取應(yīng)用系統(tǒng)的使用情況還需要清楚數(shù)據(jù)庫用戶確切的系統(tǒng)信息,如IP地址、登錄數(shù)據(jù)庫時間及退出數(shù)據(jù)庫時間等。為了獲取數(shù)據(jù)庫用戶操作的系統(tǒng)信息,筆者構(gòu)建了一個具有系統(tǒng)權(quán)限的觸發(fā)器。當(dāng)觸發(fā)事件發(fā)生的時候,可以啟動該觸發(fā)器。通過調(diào)用系統(tǒng)事件函數(shù)(Event Attribute Functions)來獲取系統(tǒng)信息,利用數(shù)據(jù)庫自帶函數(shù)SYS_CONTEXT來追蹤系統(tǒng)事件。通過觸發(fā)器的即時監(jiān)控,用戶可以進(jìn)行包括審計、把對象PIN入共享池及進(jìn)行一些維護(hù)等操作。
Logon/Logoff觸發(fā)器。Logon/Logoff觸發(fā)器可以用來記錄用戶在數(shù)據(jù)庫中的活動時間。在使用系統(tǒng)級觸發(fā)器前,首先要確認(rèn)系統(tǒng)參數(shù)_system_trig_enabled是否設(shè)置為TRUE。在用戶登錄和退出數(shù)據(jù)庫時,觸發(fā)系統(tǒng)監(jiān)聽函數(shù),通過數(shù)據(jù)庫底層腳本編寫觸發(fā)器并構(gòu)建標(biāo)準(zhǔn)結(jié)構(gòu)的用來記錄系統(tǒng)監(jiān)控信息的數(shù)據(jù)表。
關(guān)聯(lián)觸發(fā)器。由于Oracle數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,筆者通過構(gòu)建關(guān)聯(lián)觸發(fā)器將數(shù)據(jù)字典中用戶操作監(jiān)控數(shù)據(jù)表與觸發(fā)器觸發(fā)監(jiān)控生成的系統(tǒng)信息監(jiān)控表相關(guān)聯(lián)。將用戶操作監(jiān)控數(shù)據(jù)表中的操作內(nèi)容SQL語句、數(shù)據(jù)表名、時間戳字段和系統(tǒng)信息監(jiān)控表的用戶名、IP地址字段分別提取出來關(guān)聯(lián)到一張數(shù)據(jù)表內(nèi)。具體操作步驟如下:
a. 在SYS用戶下構(gòu)建AFTER觸發(fā)器,在用戶操作后執(zhí)行該觸發(fā)器代碼;
b. 聲明變量,用于存儲監(jiān)控信息內(nèi)容,數(shù)量和類型要與監(jiān)控表中字段類型一致;
c. 利用session_id、時間戳這兩張表中共有的字段作為相關(guān)查詢條件,將相同時間兩張表中需要的字段信息提取出來;
d. 將提取出來的字段信息賦給之前聲明的變量,利用SQL代碼統(tǒng)一插入到一張新的數(shù)據(jù)表中,作為相關(guān)業(yè)務(wù)部門的監(jiān)控數(shù)據(jù)表。
這樣就將兩張數(shù)據(jù)表中的不同字段信息通過觸發(fā)器統(tǒng)一關(guān)聯(lián)到一張新的數(shù)據(jù)表中了,在查詢分析時方便快捷,所需查詢時間很少。而直接在數(shù)據(jù)庫中通過嵌套查詢的復(fù)雜SQL語句關(guān)聯(lián)查詢多表也可以實(shí)現(xiàn)這個功能,但是計算量過大,所需時間以分鐘為單位,用戶體驗極差。
在獲取到用戶的操作信息和IP地址系統(tǒng)信息之后,筆者應(yīng)用ASP.NET技術(shù)[6~8]編寫鏈接數(shù)據(jù)庫字符串,以B/S架構(gòu)的方式將監(jiān)控信息可視化展現(xiàn)在瀏覽器端。設(shè)置時間段等智能查詢方式便于管理員有針對性地查詢。
筆者所開發(fā)的數(shù)據(jù)庫監(jiān)控系統(tǒng)是基于Oracle數(shù)據(jù)庫細(xì)粒度審計技術(shù)與數(shù)據(jù)庫觸發(fā)器觸發(fā)監(jiān)控技術(shù)相結(jié)合的混合式監(jiān)控技術(shù)。該技術(shù)已經(jīng)在油田數(shù)據(jù)庫中試運(yùn)行了一段時間,通過實(shí)踐證明,該監(jiān)控系統(tǒng)能夠有效地監(jiān)控數(shù)據(jù)庫用戶在應(yīng)用系統(tǒng)中對數(shù)據(jù)庫進(jìn)行的一切操作和數(shù)據(jù)庫用戶在數(shù)據(jù)庫中的詳細(xì)系統(tǒng)信息。通過定義監(jiān)控策略及構(gòu)建監(jiān)控數(shù)據(jù)字典等步驟將大量監(jiān)控數(shù)據(jù)結(jié)構(gòu)化存儲,進(jìn)行了有效的管理,便于管理員查看和調(diào)用。通過分析監(jiān)控數(shù)據(jù),管理員可以對數(shù)據(jù)庫中的所有被監(jiān)控用戶和應(yīng)用系統(tǒng)的重點(diǎn)表進(jìn)行全方位的掌控,從而避免某些應(yīng)用系統(tǒng)數(shù)據(jù)維護(hù)不及時及冗余操作過多等現(xiàn)象發(fā)生,對數(shù)據(jù)庫的管理和性能調(diào)優(yōu)非常有必要。
[1] 張立奎,閆子熙.基于LogMiner的Oracle數(shù)據(jù)庫日志分析[J].計算機(jī)與網(wǎng)絡(luò),2013,39(z1):145~147.
[2] 支馨悅.觸發(fā)器在實(shí)現(xiàn)數(shù)據(jù)庫安全方面的幾種應(yīng)用[J].林區(qū)教學(xué),2011,(5):95~96.
[3] 鐘亞妹.觸發(fā)器在SQL Server數(shù)據(jù)庫開發(fā)中的應(yīng)用與研究[J].電腦知識與技術(shù),2011,7(11):2492~2494.
[4] 韋晨艷,楊鍵鳴,姚斯立.SQL數(shù)據(jù)庫中存儲過程、觸發(fā)器的應(yīng)用研究[J].中國信息界,2011,(6):59~60.
[5] 劉曉華.企業(yè)數(shù)據(jù)字典標(biāo)準(zhǔn)化管理平臺解決方案探討[J].武漢工程大學(xué)學(xué)報,2008,30(1):101~103.
[6] 尚肖飛.基于ASP.NET高職院校教務(wù)管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].哈爾濱:黑龍江大學(xué),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è)進(jìn)銷存管理信息系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].中國管理信息化,2011,14(3):35~36.