張志 常永娟 遇炳杰
[摘 要]本文介紹了一種分析ORACLE數(shù)據(jù)庫中用戶或表是否活動(dòng)的方法,用于判斷相關(guān)用戶是否仍被使用,常用于復(fù)雜的系統(tǒng)中由于各種原因?qū)е聵I(yè)務(wù)用戶用途不明等情況,對于明確用戶用途,做好數(shù)據(jù)庫維護(hù)提供了一條途經(jīng)。
[關(guān)鍵詞]ORACLE數(shù)據(jù)庫;判斷用戶行為活動(dòng);會(huì)話;
中圖分類號(hào):TP311.13 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-914X(2018)31-0286-01
1.ORACLE用戶的連接分析
根據(jù)ORACLE的內(nèi)部設(shè)計(jì),數(shù)據(jù)庫用戶訪問數(shù)據(jù)庫會(huì)記錄下連接信息和會(huì)話信息,對于長期沒有業(yè)務(wù)系統(tǒng)使用的用戶,是看不到這些連接信息的,因此連接信息可以直接判定用戶是否還在使用。連接信息記錄在會(huì)話視圖中,可以通過查詢v$session或dba_hist_active_sess_history。根據(jù)ORACLE官方文檔中的介紹,v$session中記錄著當(dāng)前會(huì)話內(nèi)容,可以直接查出來當(dāng)前會(huì)話中是否有我們關(guān)注的用戶連接信息,如果有說明這些用戶還在連接著數(shù)據(jù)庫,仍在使用中,且通過machine列可以看到從哪臺(tái)客戶端機(jī)器上發(fā)起的連接,logon_time列可以知道什么時(shí)間連接到數(shù)據(jù)庫中。但是如果用戶斷開了連接,或者當(dāng)前時(shí)間內(nèi)沒有連接到數(shù)據(jù)庫上,則無法判斷是否在用,這時(shí)就需要用到歷史會(huì)話信息了,即dba_hist_active_sess_history,這個(gè)數(shù)據(jù)字典記錄著歷史活動(dòng)會(huì)話內(nèi)容,其部分結(jié)構(gòu)如圖1:
如果有我們需要分析的用戶連接信息,則上面的查詢語句能夠顯示出來。此數(shù)據(jù)字典中的信息保留時(shí)間默認(rèn)為8天,因此如果再進(jìn)一步查看更久遠(yuǎn)的信息,需要提前將這些歷史數(shù)據(jù)保存起來或者延長默認(rèn)保留時(shí)間。
2.ORACLE用戶的活動(dòng)分析
有的情況下,有可能數(shù)據(jù)庫用戶長時(shí)間沒有連接,或者處于鎖定狀態(tài),要判斷是否還在使用,就需要進(jìn)一步分析其對象的變化。用戶的對象通常是表、索引、視圖、序列等。對于對象的變化可以通過對象數(shù)據(jù)字典來分析,這就需要用到user_objects數(shù)據(jù)字典,其部分結(jié)構(gòu)如圖2:
根據(jù)數(shù)據(jù)字典中的字段,可以通過數(shù)量、創(chuàng)建時(shí)間等維度進(jìn)行分析。例如查看對象數(shù)量:可以先執(zhí)行一次此查詢記錄下當(dāng)前各類對象詳細(xì)信息,經(jīng)過一段時(shí)間后再次執(zhí)行此查詢,將兩次的結(jié)果進(jìn)行比對,如果對象的數(shù)量有所變化,說明用戶還處于活動(dòng)狀態(tài)。
有可能有的用戶對象數(shù)量不變化,但是自身存放的數(shù)據(jù)在變化,這時(shí)就需要用到user_tab_modifications數(shù)據(jù)字典。
根據(jù)數(shù)據(jù)字典中的字段,可以通過對用戶表中數(shù)據(jù)插入、刪除、更新等操作進(jìn)行分析,例如:
select TABLE_NAME,
PARTITION_NAME,
INSERTS,
UPDATES,
DELETES,
TO_CHAR(TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') DAT,
TRUNCATED
from user_tab_modifications
ORDER BY INSERTS + UPDATES + DELETES DESC;
如果用戶數(shù)據(jù)有變化,則通過上述語句中能夠查詢出來。
還有可能用戶很少連接到數(shù)據(jù)庫上而且數(shù)據(jù)基本不變,但有可能自身數(shù)據(jù)被別的用戶訪問,這種情況下就需要對象訪問信息,可以通過V$SQL_PLAN 或DBA_HIST_SQL_PLAN數(shù)據(jù)字典來觀察到對象被訪問的情況。
根據(jù)數(shù)據(jù)字典中的字段,可以得知用戶的對象是否被調(diào)用過。
如果用戶的對象被訪問過,最終會(huì)在執(zhí)行計(jì)劃中留下痕跡,通過執(zhí)行上述查詢語句可以判斷是否被調(diào)用過,此方法比分析語句或進(jìn)行日志挖掘效果要好,因?yàn)榉治稣Z句要判斷是否有對象重名或同義詞的影響,日志挖掘?qū)τ诓樵冾惖牟僮魇强床坏降?。?dāng)然此方法也存在一定缺陷,例如對數(shù)據(jù)泵直接導(dǎo)出的操作是看不到的。
3.作業(yè)活動(dòng)分析
還可以通過檢查作業(yè)(job)或調(diào)度(shchedule),檢查是否有活動(dòng)的定期任務(wù)在執(zhí)行,可以查詢user_jobs和user_scheduler_jobs數(shù)據(jù)字典來判斷。
結(jié)束語
通常來說用戶活動(dòng)行為可以通從會(huì)話、數(shù)據(jù)變化、對象是否訪問等幾個(gè)方面進(jìn)行分析,分析的數(shù)據(jù)主要來自O(shè)RACLE內(nèi)部的數(shù)據(jù)字典或視圖,這些信息為我們提供了必要的支撐,另外,分析的數(shù)據(jù)往往關(guān)注一段時(shí)間內(nèi)即可,例如3個(gè)月內(nèi),對于時(shí)間過久的數(shù)據(jù),往往也就沒有分析的必要了。
參考文獻(xiàn)
[1] Oracle Database Reference 12c Release 1 (12.1) E17615-16