oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志
logminer和配置
安裝logminer
以sqlplus / as sysdba登錄系統數據庫系統,ORACLE默認安裝logminer,如果沒有安裝,執行SQL腳本安裝
--安裝logminer
SQL>@$ORACLE_HOME/rdbms/admin/dbmslm.sql
--安裝logminer所需要的數據字典
SQL>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
普通用戶執行logminer需要進行賦權
--使TEST1用戶具備執行logminer的權限
GRANT EXECUTE ON DBMS_LOGMNR TO TEST1
為logminer創建單獨的表空間
默認情況下logminer生成的表和數據都是在system表空間下,很容易就把system撐爆從而引發問題。
因此需要創建單獨的表空間,并制定logminer使用該表空間:
EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$')
跟蹤ddl語句
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DDL_DICT_TRACKING);
--當使用Online catalog時,是不能使用該參數的
設置數據字典
使用logminer需要指定數據字典,在沒有數據字典的情況下表,表名和字段名都會顯示為Object#1111和col#1,col#2,閱讀起來非常的不方便。可以提取數據字典文件,或者使用當前數據庫的聯機目錄作為字典源,目的都是能讓logminer“知道”表名和表的字段名
將數據字典提取為Flat File
以sqlplus / as sysdba登錄,修改數據庫spfile參數,并重啟數據庫(生產環境慎用!)
ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
--登錄數據庫提取
EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle');
要特別注意一個問題,我在測試環境上執行這條命令以后,ORACLE大概卡頓了20分鐘,最后返回一個提示信息:總線錯誤(吐核)……還吐核。。你咋不再來二兩花生米呢
其實那個錯誤,從日志里看應該是core dumped,內核已轉儲,也就是確實遇到了系統問題。此時服務器能正常使用,但是所有跟oracle用戶的功能都廢了,自然也包括數據庫服務器。執行reboot重啟也是長時間無反應,接了個顯示器一看,服務器已經在那里裝死了。16核64G服務器配置應該也不算低。我現在還不確定這個問題是服務器本身就有錯誤,還是那條命令導致的,反正我是強烈建議在生產環境上慎用。如果真要執行的話,最好先跟信息中心那邊協商好,萬一真出問題了能直接到機房去按電源重啟。
反正我是最后按電源重啟解決
將數據字典提取為Redo Log
這種方式用的比較廣泛,大多是異地挖掘,比如數據是在生產環境數據庫上,把歸檔日志拷貝到本地數據庫服務器上,只要本地數據庫開啟了歸檔并且處于OPEN狀態就可以進行分析。但是要注意必須有對應的數據字典。
網絡上很多說法都是用DBMS_LOGMNR_D.BUILD把數據字典提取到挖掘數據庫的在線日志中,但是我自己試了不行,我覺得原因就是拷貝的歸檔日志文件中并不包含對應的數據字段,最后解析出來的SQL都是unknown,col#,object#。另外一種可能,就是歸檔期間內有數據庫的重啟、重建表空間等操作,導致歸檔的數據字典和當前的不一致了。因此以后還是做好數據字典的備份
--開啟附加日志,提取需要
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
--提取字典
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
使用聯機日志作為數據源(推薦)
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
使用聯機日志作為數據源,是最快的方式,但是局限是如果表上發生過ddl語句,那么就無法分析ddl之前的SQL。因為聯機日志在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);
使用聯機日志開始執行分析
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
將日志內容寫入物理表
create table usr_logmnr.logmnr201912212053 as select * from v$logmnr_contents;
然后就可以查詢usr_logmnr.logmnr201912212053中的內容了。
挖掘歸檔日志
當聯機日志達到指定大小后就會轉為歸檔日志,
首先通過rman查看要進行挖掘的歸檔日志
[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拷貝要進行挖掘的歸檔日志
[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執行查詢歸檔日志:
SELECT NAME FROM V$ARCHIVED_LOG
--執行查詢后,復制需要進行挖掘的歸檔日志即可
然后開始分析拷貝的歸檔日志,或者也可以直接增加歸檔日志
--增加拷貝的歸檔日志:
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.
--執行分析,注意這里仍然使用的聯機的數據字典
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
PL/SQL procedure successfully completed.--將分析結果寫入數據表中
SQL> create table logmnr201912212121 as select * from v$logmnr_contents;
然后可以查看歸檔日志的內容:
select * from logmnr201912212121
批量增加分析文件
當要分析的日志文件比較多時,可以批量增加文件
--獲取開始文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2581.1061.1027675395
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';
--獲取結束文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2582.1060.1027675397
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
--當要增加的歸檔文件比較多時,使用一下SQL生成語句,然后批量執行
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執行結果,然后在命令行下批量執行。注意,你在哪里執行的lgominer,就在哪里執行這些語句,因為logminer的結果是分會話的,不同的會話不能訪問彼此的數據
--如果文件不多,也可以手動一個一個添加
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);
--開始執行分析
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
結束分析
logmnr分析的結果,在另一個會話中是查詢不到的,當分析結束后,建議關閉當前分析過程。釋放PGA內存區域
execute DBMS_LOGMNR.END_LOGMNR
總結
以上是生活随笔為你收集整理的oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10官网下载安装,oracl
- 下一篇: oracle对substr去重,orac