国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

分析Oracle數(shù)據(jù)庫日志文件

2024-08-29 13:43:47
字體:
供稿:網(wǎng)友
一、如何分析即LogMiner解釋

從目前來看,分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner來進(jìn)行, Oracle數(shù)據(jù)庫的所有更改都記錄在日志中,但是原始的日志信息我們根本無法看懂,而LogMiner就是讓我們看懂日志信息的工具。 從這一點(diǎn)上看,它和tkPRof差不多,一個(gè)是用來分析日志信息,一個(gè)則是格式化跟蹤文件。通過對日志的分析我們可以實(shí)現(xiàn)下面的目的:

1、查明數(shù)據(jù)庫的邏輯更改;2、偵察并更正用戶的誤操作;3、執(zhí)行事后審計(jì);4、執(zhí)行變化分析。不僅如此,日志中記錄的信息還包括:數(shù)據(jù)庫的更改歷史、更改類型(INSERT、UPDATE、DELETE、DDL等)、更改對應(yīng)的SCN號、以及執(zhí)行這些操作的用戶信息等,LogMiner在分析日志時(shí),將重構(gòu)等價(jià)的SQL語句和UNDO語句(分別記錄在V$LOGMNR_CONTENTS視圖的 SQL_REDO和SQL_UNDO中)。這里需要注重的是等價(jià)語句,而并非原始SQL語句,例如:我們最初執(zhí)行的是“delete a where c1 <>'cyx';”,而LogMiner重構(gòu)的是等價(jià)的6條DELETE語句。所以我們應(yīng)該意識到V$LOGMNR_CONTENTS視圖中顯示的并非是原版的現(xiàn)實(shí),從數(shù)據(jù)庫角度來講這是很輕易理解的,它記錄的是元操作,因?yàn)橥瑯邮恰癲elete a where c1 <>'cyx';”語句,在不同的環(huán)境中,實(shí)際刪除的記錄數(shù)可能各不相同,因此記錄這樣的語句實(shí)際上并沒有什么實(shí)際意義,LogMiner重構(gòu)的是在實(shí)際情況下轉(zhuǎn)化成元操作的多個(gè)單條語句。

另外由于Oracle重做日志中記錄的并非原始的對象(如表以及其中的列)名稱,而只是它們在Oracle數(shù)據(jù)庫中的內(nèi)部編號(對于表來說是它們在數(shù)據(jù)庫中的對象ID,而對于表中的列來說,對應(yīng)的則是該列在表中的排列序號:COL 1, COL 2 等),因此為了使LogMiner重構(gòu)出的SQL語句易于識別,我們需要將這些編號轉(zhuǎn)化成相應(yīng)的名稱,這就需要用到數(shù)據(jù)字典(也就說LogMiner本身是可以不用數(shù)據(jù)字典的,詳見下面的分析過程),LogMiner利用DBMS_LOGMNR_D.BUILD()過程來提取數(shù)據(jù)字典信息。

LogMiner包含兩個(gè)PL/SQL包和幾個(gè)視圖:1、dbms_logmnr_d包,這個(gè)包只包括一個(gè)用于提取數(shù)據(jù)字典信息的過程, 即dbms_logmnr_d.build()過程。2、dbms_logmnr包,它有三個(gè)過程:add_logfile(name varchar2, options number) - 用來添加/刪除用于分析的日志文件;start_logmnr(start_scn number, end_scn number, start_time number,end_time number, dictfilename varchar2, options number) - 用來開啟日志分析,同時(shí)確定分析的時(shí)間/SCN窗口以及確認(rèn)是否使用提取出來的數(shù)據(jù)字典信息。end_logmnr() - 用來終止分析會話,它將回收LogMiner所占用的內(nèi)存。與LogMiner相關(guān)的數(shù)據(jù)字典。1、v$logmnr_dictionary,LogMiner可能使用的數(shù)據(jù)字典信息, 因logmnr可以有多個(gè)字典文件,該視圖用于顯示這方面信息。2、v$logmnr_parameters,當(dāng)前LogMiner所設(shè)定的參數(shù)信息。3、v$logmnr_logs,當(dāng)前用于分析的日志列表。4、v$logmnr_contents,日志分析結(jié)果。二、Oracle9i LogMiner的增強(qiáng):

1、支持更多數(shù)據(jù)/存儲類型:鏈接/遷移行、CLUSTER表操作、DIRECT PATH插入以及DDL操作。在V$LOGMNR_CONTENTS的SQL_REDO中可以看到DDL操作的原句(CREATE USER除外,其中的密碼將以加密的形式出現(xiàn),而不是原始密碼)。假如TX_AUDITING初始化參數(shù)設(shè)為TRUE,則所有操作的數(shù)據(jù)庫賬號將被記錄。 2、提取和使用數(shù)據(jù)字典的選項(xiàng):現(xiàn)在數(shù)據(jù)字典不僅可以提取到一個(gè)外部文件中,還可以直接提取到重做日志流中,它在日志流中提供了操作當(dāng)時(shí)的數(shù)據(jù)字典快照,這樣就可以實(shí)現(xiàn)離線分析。 3、答應(yīng)對DML操作按事務(wù)進(jìn)行分組:可以在START_LOGMNR()中設(shè)置COMMITTED_DATA_ONLY選項(xiàng),實(shí)現(xiàn)對DML操作的分組,這樣將按SCN的順序返回已經(jīng)提交的事務(wù)。 4、支持SCHEMA的變化:在數(shù)據(jù)庫打開的狀態(tài)下,假如使用了LogMiner的DDL_DICT_TRACKING選項(xiàng),Oracle9i的 LogMiner將自動對比最初的日志流和當(dāng)前系統(tǒng)的數(shù)據(jù)字典,并返回正確的DDL語句,并且會自動偵察并標(biāo)記當(dāng)前數(shù)據(jù)字典和最初日志流之間的差別,這樣即使最初日志流中所涉及的表已經(jīng)被更改或者根本已經(jīng)不存在,LogMiner同樣會返回正確的DDL語句。 5、在日志中記錄更多列信息的能力:例如對于UPDATE操作不僅會記錄被更新行的情況,還可以捕捉更多前影信息。 6、支持基于數(shù)值的查詢:Oracle9i LogMiner在支持原有基于元數(shù)據(jù)(操作、對象等)查詢的基礎(chǔ)上,開始支持基于實(shí)際涉及到的數(shù)據(jù)的查詢。例如涉及一個(gè)工資表,現(xiàn)在我們可以很輕易地查出員工工資由1000變成2000的原始更新語句,而在之前我們只能選出所有的更新語句。

三、Oracle8i/9i的日志分析過程

LogMiner只要在實(shí)例起來的情況下都可以運(yùn)行,LogMiner使用一個(gè)字典文件來實(shí)現(xiàn)Oracle內(nèi)部對象名稱的轉(zhuǎn)換,假如沒有這個(gè)字典文件,則直接顯示內(nèi)部對象編號,例如我們執(zhí)行下面的語句: delete from "C"."A" where "C1" = ‘gototop’ and ROWID = 'AAABg1AAFAAABQaAAH'; 假如沒有字典文件,LogMiner分析出來的結(jié)果將是: delete from "UNKNOWN"."OBJ# 6197" where "COL 1" = HEXTORAW('d6a7d4ae') and ROWID = 'AAABg1AAFAAABQaAAH'; 假如想要使用字典文件,數(shù)據(jù)庫至少應(yīng)該出于MOUNT狀態(tài)。然后執(zhí)行dbms_logmnr_d.build過程將數(shù)據(jù)字典信息提取到一個(gè)外部文件中。下面是具體分析 步驟:

1、確認(rèn)設(shè)置了初始化參數(shù):UTL_FILE_DIR,并確認(rèn)Oracle對改目錄擁有讀寫權(quán)限,然后啟動實(shí)例。示例中UTL_FILE_DIR參數(shù)如下: SQL> show parameter utl NAME TYPE VALUE ------------------------ ----------- ------------------------------ utl_file_dir string /data6/cyx/logmnr 這個(gè)目錄主要用于存放dbms_logmnr_d.build過程所產(chǎn)生的字典信息文件,假如不用這個(gè),則可以不設(shè),也就跳過下面一步。

2、生成字典信息文件:

exec dbms_logmnr_d.build(dictionary_filename =>' dic.ora',dictionary_location => '/data6/cyx/logmnr'); 其中dictionary_location指的是字典信息文件的存放位置,它必須完全匹配UTL_FILE_DIR的值,例如:假設(shè) UTL_FILE_DIR=/data6/cyx/logmnr/,則上面這條語句會出錯(cuò),只因?yàn)閁TL_FILE_DIR后面多了一個(gè)“/”,而在很多其它地方對這一“/”是不敏感的。 dictionary_filename指的是放于字典信息文件的名字,可以任意取。當(dāng)然我們也可以不明確寫出這兩個(gè)選項(xiàng),即寫成: exec dbms_logmnr_d.build('dic.ora','/data6/cyx/logmnr'); 假如你第一步的參數(shù)沒有設(shè),而直接開始這一步,Oracle會報(bào)下面的錯(cuò)誤: ERROR at line 1:
ORA-01308: initialization parameter utl_file_dir is not setORA-06512: at "SYS.DBMS_LOGMNR_D", line 923ORA-06512: at "SYS.DBMS_LOGMNR_D", line 1938ORA-06512: at line 1需要注重的是,在oracle817 for Windows版中會出現(xiàn)以下錯(cuò)誤:

14:26:05 SQL> execute dbms_logmnr_d.build('oradict.ora','c:/oracle/admin/ora/log');BEGIN dbms_logmnr_d.build('oradict.ora',' c:/oracle/admin/ora/log'); END;*ERROR at line 1:ORA-06532: Subscript outside of limitORA-06512: at "SYS.DBMS_LOGMNR_D", line 793ORA-06512: at line 1解決辦法:

編輯"$ORACLE_HOME/rdbms/admindbmslmd.sql"文件,把其中的 TYPE col_desc_array IS VARRAY(513) OF col_description; 改成: TYPE col_desc_array IS VARRAY(700) OF col_description; 保存文件,然后執(zhí)行一遍這個(gè)腳本: 15:09:06 SQL> @c:/oracle/ora81/rdbms/admin/dbmslmd.sqlPackage created.Package body created.No errors.Grant sUCceeded.然后重新編譯DBMS_LOGMNR_D包: 15:09:51 SQL> alter package DBMS_LOGMNR_D compile body;Package body altered.之后重新執(zhí)行dbms_logmnr_d.build即可:15:10:06 SQL> execute dbms_logmnr_d.build('oradict.ora','c:/oracle/admin/ora/log');PL/SQL procedure successfully completed.3、添加需要分析的日志文件

SQL>exec dbms_logmnr.add_logfile( logfilename=>'/data6/cyx/rac1arch/arch_1_197.arc', options=>dbms_logmnr.new);PL/SQL procedure successfully completed.這里的options選項(xiàng)有三個(gè)參數(shù)可以用:NEW - 表示創(chuàng)建一個(gè)新的日志文件列表ADDFILE - 表示向這個(gè)列表中添加日志文件,如下面的例子REMOVEFILE - 和addfile相反。SQL> exec dbms_logmnr.add_logfile( logfilename=>'/data6/cyx/rac1arch/arch_2_86.arc', options=>dbms_logmnr.addfile);PL/SQL procedure successfully completed.4、當(dāng)你添加了需要分析的日志文件后,我們就可以讓LogMiner開始分析了:

SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora'); PL/SQL procedure successfully completed. 假如你沒有使用字典信息文件(此時(shí)我們只需要啟動實(shí)例就可以了),那么就不需要跟dictfilename參數(shù): SQL> exec dbms_logmnr.start_logmnr(); PL/SQL procedure successfully completed. 當(dāng)然dbms_logmnr.start_logmnr()過程還有其它幾個(gè)用于定義分析日志時(shí)間/SCN窗口的參數(shù),它們分別是: STARTSCN / ENDSCN - 定義分析的起始/結(jié)束SCN號, STARTTIME / ENDTIME - 定義分析的起始/結(jié)束時(shí)間。例如下面的過程將只分析從 '2003-09-21 09:39:00'到'2003-09-21 09:45:00'這段時(shí)間的日志: SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora' , - starttime => '2003-09-21 09:39:00',endtime => '2003-09-21 09:45:00'); PL/SQL procedure successfully completed. 上面過程第一行結(jié)尾的“-”表示轉(zhuǎn)行,假如你在同一行,則不需要。我們可以看到有效日志的時(shí)間戳: SQL> select distinct timestamp from v$logmnr_contents; TIMESTAMP ------------------- 2003-09-21 09:40:02 2003-09-21 09:42:39 這里需要注重的是,因?yàn)槲抑耙呀?jīng)設(shè)置NLS_DATE_FORMAT環(huán)境變量,所以上面的日期可以直接按這個(gè)格式寫就行了,假如你沒有設(shè),則需要使用to_date函數(shù)來轉(zhuǎn)換一下。 SQL> !env grep NLS NLS_LANG=american_america.zhs16cgb231280 NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS ORA_NLS33=/oracle/oracle9/app/oracle/product/9.2.0/ocommon/nls/admin/data 使用to_date的格式如下: exec dbms_logmnr.start_logmnr(dictfilename=>'/data6/cyx/logmnr/dic.ora',- starttime => to_date('2003-09-21 09:39:00','YYYY-MM-DD HH24:MI:SS'),- endtime => to_date('2003-09-21 09:45:00','YYYY-MM-DD HH24:MI:SS')); STARTSCN 和ENDSCN參數(shù)使用方法類似。


5、在上面的過程執(zhí)行結(jié)束之后,我們就可以通過訪問與LogMiner相關(guān)的幾個(gè)視圖來提取我們需要的信息了。其中在v$logmnr_logs中可以看到我們當(dāng)前分析的日志列表,假如數(shù)據(jù)庫有兩個(gè)實(shí)例(即OPS/RAC),在v$logmnr_logs中會有兩個(gè)不同的THREAD_ID。 而真正的分析結(jié)果是放在v$logmnr_contents中,這里面有很多信息,我們可以根據(jù)需要追蹤我們感愛好的信息。后面我將單獨(dú)列出來講常見的追蹤情形。

6、全部結(jié)束之后,我們可以執(zhí)行dbms_logmnr.end_logmnr過程退出LogMiner分析過程,你也可以直接退出SQL*PLUS,它會自動終止。(完)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邳州市| 鲁甸县| 黎平县| 扎囊县| 泊头市| 临安市| 九江市| 泽州县| 自贡市| 潮州市| 凤凰县| 日喀则市| 米脂县| 江安县| 东安县| 公主岭市| 焦作市| 杭锦后旗| 承德市| 江达县| 海伦市| 鄯善县| 宁津县| 凤庆县| 大邑县| 延长县| 久治县| 清苑县| 萨嘎县| 榆中县| 万安县| 岳西县| 桦川县| 朔州市| 东源县| 灯塔市| 淮安市| 江西省| 临澧县| 武定县| 蒙城县|