當遇到由于閃回技術時間窗過小,數據泵沒有合適的泵出文件,介質恢復沒有合適的備份文件時,重做日志就成為了恢復的最后手段。重做日志挖掘也經常用來實現精確恢復。
v$logmnr_contents視圖是logminer挖掘日志的接口,每當v$logmnr_contents被訪問一次,相關的重做日志就會被讀取一次。實際上日志挖掘是對v$logmnr_contents視圖的查詢。但是如果在沒有啟動日志挖掘會話之前,對v$logmnr_conten的讀取會報錯。
logminer的4個元素:源數據庫、挖掘數據庫、logminer字典、重做日志。
1、源數據:指提供需要被挖掘的重做日志的數據庫。
2、挖掘數據庫:只啟動挖掘會話的數據庫。挖掘數據庫與源數據庫可以不是同一個庫,但是其硬件平臺和字符集與源庫一致,挖掘數據庫的版本必須大于或者等于原庫版本。(源庫版本最低Oracle 8i)。
3、logminer字典:logminer字典是將重做記錄中的oracle內部對象翻譯為可讀信息的轉換字典。
4、提供需挖掘的重做日志由源庫產生,或者屬于同一個化身。
使用logminer的前提是開啟補充日志。最起碼應打開最小補充日志。
查看最小補充日志是否打開
SQL> select supplemental_log_data_min from v$database;SUPPLEME--------NO
打開最小補充日志
SQL> alter database add supplemental log data;Database altered.啟動最小補充日子的目的是使用logminer具備識別由update命令導致的行遷移,行移動的能力。不然,所有的非sys用戶的dml命令將無法通過logminer挖掘。當然也可以啟動其他級別的數據庫級補充日志,這樣會隱式啟動最小補充日志。
logminer字典來源有三種:源庫日志字典、源庫在線日志、文本文件日志
1、日志字典:
日志字典是指調用dbms_logmnr_d.build存儲過程將logminer字典提取至源數據庫的重做日志里。
SQL> exec dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);PL/SQL PRocedure successfully completed.可以查看logminer字典被提取到重做日志的那里了。
SQL> select sequence#,name,dictionary_begin,dictionary_end from v$archived_log where dictionary_begin='YES' or dictionary_end='YES'; SEQUENCE# NAME DIC DIC---------- --------------------------------------------------------------------------------11 /u01/oracle/product/Flash_recovery_area/ORCL/archivelog/2013_06_03/o1_mf_1_11_8tscfj0o_.arc YES YES
結果表明,日志字典都包含在11號歸檔日志里面。
使用日志字典有兩個好處:
a、不要求挖掘庫與源庫為同一數據庫
b、ddl命名可以更新該字典。使用dll_dict_tracking常量啟動挖掘,能更新日志字典,使挖掘信息得到完全體現。
2、使用源庫在線字典
使用源庫在線數據庫字典,不用調用存儲過程,直接在啟動start_logmnr啟動挖掘會話時,通過options指定continous_mine。使用源庫在線日志字典,源庫和挖掘庫必須是同一個,而且ddl命令無法更新該字典。
3、文本文件字典
文本文件字典,是將字典載入一個文本文件中,需要為utl_file_dir指定一個初始化參數。
SQL> alter system set utl_file_dir='/u01/oracle/product/temp' scope=spfile;
utl_file_dir是靜態參數,需要重啟實例。然后用dbms_logmnr_d.build存儲過程的options指定store_in_flat_file常量。
exec dbms_logmnr_d.build(dictionary_filename=>'logminerorcl.ora',dictionary_location=>'/u01/oracle/product/temp',options=>dbms_logmnr_d.store_in_flat_file);
文本文件/u01/oracle/product/temp/logminerorcl.ora就可以作為logminer字典使用了。
手動注冊
SQL> exec dbms_logmnr.add_logfile(logfilename=>'/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_03/o1_mf_1_11_8tscfj0o_.arc',
options=>dbms_logmnr.addfile)
在調用add_loggile之后,可以利用v$logmnr_logs查看已注冊的日志;
SQL> select low_scn,thread_id from v$logmnr_logs;自動注冊
自動注冊不用調用dbms_logmnr.add_logfile過程,而是通過dbms_logmnr.start_logmnr啟動挖掘會話的時候對options參數傳入 continuous_mine常量。但是要求:挖掘庫必須與源庫是同一個;啟動會話時,必須制定時間窗(或者SCN)搜索日志;控制文件內必須具有所需日志的記錄。
調用dbms_logmnr.start_logmnr啟動挖掘會話時,必須明白兩點:1、logminer字典如何提供;2、挖掘日志如何注冊。
情況1:源庫與挖掘庫相同,add_file手動注冊、在線字典
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
情況2:源庫=挖掘庫,在線字典,自動注冊日志
SQL> exec dbms_logmnr.start_logmnr(
starttime=>to_date('2013-06-05 22:30:00','yyyy-mm-dd hh24:mi:ss'),
endtime=>to_date('2013-06-05 23:30:00','yyyy-mm-dd hh24:mi:ss'),
options=>dbms_logmnr.dict_from_online_catalog+
dbms_logmnr.continuous_mine);
情況3:日志字典、aff_file手動注冊日志
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_redo_logs);
情況4:日志字典、自動注冊日志
SQL> exec dbms_logmnr.start_logmnr(
starttime=>to_date('2013-06-05 22:30:00','yyyy-mm-dd hh24:mi:ss'),
endtime=>to_date('2013-06-05 23:30:00','yyyy-mm-dd hh24:mi:ss'),
options=>dbms_logmnr.dict_from_redo_logs+
dbms_logmnr.continuous_mine);啟動dbms_logmnr.start_logmnr時,options賦予的常量:
1、committed_data_only:表示在v$logmnr_contents視圖時,只返回已經提交了的變更的sql_redo和sql_undo
2、skip_corruption :能夠忽略在查詢v$logmnt_contents視圖時,遭遇到的日志損壞。因為每對該視圖的查詢,就會掃描日志。
3、ddl_dict_tarcking:能夠是logminer日志字典被ddl命令更新。
4、dict_from_online_catalog:聲明logminer字典來源于在線數據字典。此參數與dll_dict_tracking不兼容。
5、dict_from_redo_logs:聲明logminer字典來自日志字典。
6、no_sql_delimiter:能夠將sql_redo和sql_undo后面的分好‘;’ 去掉。
7、print_pretty_sql:簡單格式化sql_redo和sql_undo。
8、continuous_mine:說明挖掘日志支持自動注冊,不要求調用add_logfile手動注冊日志。
9、no_rowid_in_stmt:能夠將sql_redo和sql_undo的where子句中‘rowid=’條件去掉。
10、string_literals_in_stmt:指定sql_redo和sql_undo中的number,日期、時間格式類型按照字面值表示。
在dbms_logmnr.start_logmnr成功調用之后,就可以對視圖v$logmnr_contents查詢了。
一把建議建一張與v$logmnr_contents相同的臨時表以存儲挖掘中想要的數據,以便避免對該視圖的多次查詢,畢竟,對該視圖的一次查詢,就會掃描注冊的日志。如果日記較多,是一個比較耗時的過程。
SQL>select rownum sql#,sql_redo,sql_undo from v$logmnr_contents where seg_omner='SCOTT' and seg_name='DEPT';
exec dbms_logmnr.end_logmnr;
新聞熱點
疑難解答