oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志
logminer和配置
安裝logminer
以sqlplus / as sysdba登錄系統(tǒng)數(shù)據(jù)庫系統(tǒng),ORACLE默認(rèn)安裝logminer,如果沒有安裝,執(zhí)行SQL腳本安裝
--安裝logminer
SQL>@$ORACLE_HOME/rdbms/admin/dbmslm.sql
--安裝logminer所需要的數(shù)據(jù)字典
SQL>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
普通用戶執(zhí)行l(wèi)ogminer需要進(jìn)行賦權(quán)
--使TEST1用戶具備執(zhí)行l(wèi)ogminer的權(quán)限
GRANT EXECUTE ON DBMS_LOGMNR TO TEST1
為logminer創(chuàng)建單獨(dú)的表空間
默認(rèn)情況下logminer生成的表和數(shù)據(jù)都是在system表空間下,很容易就把system撐爆從而引發(fā)問題。
因此需要創(chuàng)建單獨(dú)的表空間,并制定logminer使用該表空間:
EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$')
跟蹤ddl語句
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DDL_DICT_TRACKING);
--當(dāng)使用Online catalog時,是不能使用該參數(shù)的
設(shè)置數(shù)據(jù)字典
使用logminer需要指定數(shù)據(jù)字典,在沒有數(shù)據(jù)字典的情況下表,表名和字段名都會顯示為Object#1111和col#1,col#2,閱讀起來非常的不方便??梢蕴崛?shù)據(jù)字典文件,或者使用當(dāng)前數(shù)據(jù)庫的聯(lián)機(jī)目錄作為字典源,目的都是能讓logminer“知道”表名和表的字段名
將數(shù)據(jù)字典提取為Flat File
以sqlplus / as sysdba登錄,修改數(shù)據(jù)庫spfile參數(shù),并重啟數(shù)據(jù)庫(生產(chǎn)環(huán)境慎用!)
ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
--登錄數(shù)據(jù)庫提取
EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle');
要特別注意一個問題,我在測試環(huán)境上執(zhí)行這條命令以后,ORACLE大概卡頓了20分鐘,最后返回一個提示信息:總線錯誤(吐核)……還吐核。。你咋不再來二兩花生米呢
其實(shí)那個錯誤,從日志里看應(yīng)該是core dumped,內(nèi)核已轉(zhuǎn)儲,也就是確實(shí)遇到了系統(tǒng)問題。此時服務(wù)器能正常使用,但是所有跟oracle用戶的功能都廢了,自然也包括數(shù)據(jù)庫服務(wù)器。執(zhí)行reboot重啟也是長時間無反應(yīng),接了個顯示器一看,服務(wù)器已經(jīng)在那里裝死了。16核64G服務(wù)器配置應(yīng)該也不算低。我現(xiàn)在還不確定這個問題是服務(wù)器本身就有錯誤,還是那條命令導(dǎo)致的,反正我是強(qiáng)烈建議在生產(chǎn)環(huán)境上慎用。如果真要執(zhí)行的話,最好先跟信息中心那邊協(xié)商好,萬一真出問題了能直接到機(jī)房去按電源重啟。
反正我是最后按電源重啟解決
將數(shù)據(jù)字典提取為Redo Log
這種方式用的比較廣泛,大多是異地挖掘,比如數(shù)據(jù)是在生產(chǎn)環(huán)境數(shù)據(jù)庫上,把歸檔日志拷貝到本地數(shù)據(jù)庫服務(wù)器上,只要本地數(shù)據(jù)庫開啟了歸檔并且處于OPEN狀態(tài)就可以進(jìn)行分析。但是要注意必須有對應(yīng)的數(shù)據(jù)字典。
網(wǎng)絡(luò)上很多說法都是用DBMS_LOGMNR_D.BUILD把數(shù)據(jù)字典提取到挖掘數(shù)據(jù)庫的在線日志中,但是我自己試了不行,我覺得原因就是拷貝的歸檔日志文件中并不包含對應(yīng)的數(shù)據(jù)字段,最后解析出來的SQL都是unknown,col#,object#。另外一種可能,就是歸檔期間內(nèi)有數(shù)據(jù)庫的重啟、重建表空間等操作,導(dǎo)致歸檔的數(shù)據(jù)字典和當(dāng)前的不一致了。因此以后還是做好數(shù)據(jù)字典的備份
--開啟附加日志,提取需要
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
--提取字典
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
使用聯(lián)機(jī)日志作為數(shù)據(jù)源(推薦)
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
使用聯(lián)機(jī)日志作為數(shù)據(jù)源,是最快的方式,但是局限是如果表上發(fā)生過ddl語句,那么就無法分析ddl之前的SQL。因為聯(lián)機(jī)日志在ddl之后就失效了。
至此logminer的安裝完成
分析在線日志
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DATA01/xxxxxx/onlinelog/redo_01_01.log
+DATA01/xxxxxx/onlinelog/redo_02_01.log
+DATA01/xxxxxx/onlinelog/redo_03_01.log
+DATA01/xxxxxx/onlinelog/redo_04_01.log
+DATA01/xxxxxx/onlinelog/redo_05_01.log
+DATA01/xxxxxx/onlinelog/redo_05_02.log
+DATA01/xxxxxx/onlinelog/redo_06_01.log
+DATA01/xxxxxx/onlinelog/redo_06_02.log
+DATA01/xxxxxx/onlinelog/redo_07_01.log
+DATA01/xxxxxx/onlinelog/redo_07_02.log
+DATA01/xxxxxx/onlinelog/redo_08_01.log
MEMBER
--------------------------------------------------------------------------------
+DATA01/xxxxxx/onlinelog/redo_08_02.log
+DATA01/xxxxxx/onlinelog/redo_03_02.log
+DATA01/xxxxxx/onlinelog/redo_02_02.log
+DATA01/xxxxxx/onlinelog/redo_01_02.log
+DATA01/xxxxxx/onlinelog/redo_04_02.log
16 rows selected.
SQL>
依次添加所有的日志文件:
execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_01_01.log',dbms_logmnr.new);
execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_02_01.log',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_03_01.log',dbms_logmnr.addfile);
使用聯(lián)機(jī)日志開始執(zhí)行分析
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
將日志內(nèi)容寫入物理表
create table usr_logmnr.logmnr201912212053 as select * from v$logmnr_contents;
然后就可以查詢usr_logmnr.logmnr201912212053中的內(nèi)容了。
挖掘歸檔日志
當(dāng)聯(lián)機(jī)日志達(dá)到指定大小后就會轉(zhuǎn)為歸檔日志,
首先通過rman查看要進(jìn)行挖掘的歸檔日志
[root@xxx~]# su - grid
Last login: Sat Dec 21 20:37:10 CST 2019
l[grid@xxx~]$ ls
dbbackup oradiag_grid
[grid@xxx~]$ asmcmd
ASMCMD> cd +arch01/xxx/archivelog/2019_12_16
ASMCMD> ls
thread_1_seq_2361.776.1027125235
thread_1_seq_2362.775.1027134727
thread_1_seq_2363.773.1027134739
thread_1_seq_2364.771.1027157227
thread_1_seq_2365.769.1027157873
ASMCMD>
登錄rman拷貝要進(jìn)行挖掘的歸檔日志
[oracle@xxx archlog]$ rman target /
RMAN> copy archivelog '+arch01/xxx/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235' to '/home/oracle/archlog/thread_1_seq_2361.776.1027125235';
RMAN> exit
也可以在sqlplus中通過SQL執(zhí)行查詢歸檔日志:
SELECT NAME FROM V$ARCHIVED_LOG
--執(zhí)行查詢后,復(fù)制需要進(jìn)行挖掘的歸檔日志即可
然后開始分析拷貝的歸檔日志,或者也可以直接增加歸檔日志
--增加拷貝的歸檔日志:
execute dbms_logmnr.add_logfile('/home/oracle/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235',dbms_logmnr.new);
--或者可以直接增加歸檔目錄里的日志文件
execute dbms_logmnr.add_logfile('+arch01/xxx/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235',dbms_logmnr.new);
PL/SQL procedure successfully completed.
--執(zhí)行分析,注意這里仍然使用的聯(lián)機(jī)的數(shù)據(jù)字典
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
PL/SQL procedure successfully completed.--將分析結(jié)果寫入數(shù)據(jù)表中
SQL> create table logmnr201912212121 as select * from v$logmnr_contents;
然后可以查看歸檔日志的內(nèi)容:
select * from logmnr201912212121
批量增加分析文件
當(dāng)要分析的日志文件比較多時,可以批量增加文件
--獲取開始文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2581.1061.1027675395
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';
--獲取結(jié)束文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2582.1060.1027675397
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
--當(dāng)要增加的歸檔文件比較多時,使用一下SQL生成語句,然后批量執(zhí)行
select 'execute dbms_logmnr.add_logfile(''' || l.NAME || '''' || ',dbms_logmnr.addfile);' from V$ARCHIVED_LOG l WHERE l.FIRST_TIME > to_date('2019-12-17 08:00:00','yyyy-mm-dd hh24:mi:ss') and l.FIRST_TIME < to_date('2019-12-17 18:00:00','yyyy-mm-dd hh24:mi:ss')
--拷貝SQL執(zhí)行結(jié)果,然后在命令行下批量執(zhí)行。注意,你在哪里執(zhí)行的lgominer,就在哪里執(zhí)行這些語句,因為logminer的結(jié)果是分會話的,不同的會話不能訪問彼此的數(shù)據(jù)
--如果文件不多,也可以手動一個一個添加
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2581.1061.1027675395', OPTIONS => DBMS_LOGMNR.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2582.1060.1027675397', OPTIONS => DBMS_LOGMNR.ADDFILE);
--開始執(zhí)行分析
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
結(jié)束分析
logmnr分析的結(jié)果,在另一個會話中是查詢不到的,當(dāng)分析結(jié)束后,建議關(guān)閉當(dāng)前分析過程。釋放PGA內(nèi)存區(qū)域
execute DBMS_LOGMNR.END_LOGMNR
總結(jié)
以上是生活随笔為你收集整理的oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10官网下载安装,oracl
- 下一篇: oracle对substr去重,orac