日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志

發(fā)布時間:2024/4/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。