LogMiner配置使用手冊
1 Logminer簡介
1.1 LogMiner介紹
Oracle LogMiner 是Oracle公司從產品8i以后提供的一個實際非常有用的分析工具,使用該工具可以輕松獲得Oracle 在線/歸檔日志文件中的具體內容,特別是該工具可以分析出所有對於數據庫操作的DML和DDL語句。該工具特別適用於調試、審計或者回退某個特定的事務。
LogMiner分析工具實際上是由一組PL/SQL包和一些動態視圖(Oracle8i內置包的一部分)組成,它作為Oracle數據庫的一部分來發布是8i產品提供的一個完全免費的工具。但該工具和其他Oracle內建工具相比使用起來顯得有些復雜,主要原因是該工具沒有提供任何的圖形用戶界面(GUI)。
1.2 LogMiner作用
在Oracle 8i之前,Oracle沒有提供任何協助數據庫管理員來讀取和解釋重作日志文件內容的工具。系統出現問題,對於一個普通的數據管理員來講,唯一可以作的工作就是將所有的log文件打包,然后發給Oracle公司的技術支持,然后靜靜地等待Oracle 公司技術支持給我們最后的答案。然而從8i以后,Oracle提供了這樣一個強有力的工具--LogMiner。
LogMiner 工具即可以用來分析在線,也可以用來分析離線日志文件,即可以分析本身自己數據庫的重作日志文件,也可以用來分析其他數據庫的重作日志文件。
總的說來,LogMiner工具的主要用途有:
1、跟蹤數據庫的變化:可以離線的跟蹤數據庫的變化,而不會影響在線系統的性能。
2、回退數據庫的變化:回退特定的變化數據,減少point-in-time recovery的執行。
3、優化和擴容計划:可通過分析日志文件中的數據以分析數據增長模式
1.3 使用詳解
1.3.1 安裝LogMiner
在使用LogMiner之前需要確認Oracle是否帶有進行LogMiner分析包,一般來說Windows操作系統Oracle10g以上都默認包含。如果不能確認,可以DBA身份登錄系統,查看系統中是否存在運行LogMiner所需要的dbms_logmnr、dbms_logmnr_d包,如果沒有需要安裝LogMiner工具,必須首先要運行下面這樣兩個腳本:
1、$ORACLE_HOME/rdbms/admin/dbmslm.sql
2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql.
這兩個腳本必須均以DBA用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。
創建完畢后將包括如下過程和視圖:
類型 |
過程名 |
用途 |
過程 |
Dbms_logmnr_d.build |
創建一個數據字典文件 |
過程 |
Dbms_logmnr.add_logfile |
在類表中增加日志文件以供分析 |
過程 |
Dbms_logmnr.start_logmnr |
使用一個可選的字典文件和前面確定要分析日志文件來啟動LogMiner |
過程 |
Dbms_logmnr.end_logmnr |
停止LogMiner分析 |
視圖 |
V$logmnr_dictionary |
顯示用來決定對象ID名稱的字典文件的信息 |
視圖 |
V$logmnr_logs |
在LogMiner啟動時顯示分析的日志列表 |
視圖 |
V$logmnr_contents |
LogMiner啟動后,可以使用該視圖在SQL提示符下輸入SQL語句來查詢重做日志的內容 |
1.3.2 創建數據字典文件
LogMiner工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態性能視圖(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動LogMiner時創建)組成。在使用LogMiner工具分析redo log文件之前,可以使用DBMS_LOGMNR_D 包將數據字典導出為一個文本文件。該字典文件是可選的,但是如果沒有它,LogMiner解釋出來的語句中關於數據字典中的部分(如表名、列名等)和數值都將是16進制的形式,我們是無法直接理解的。例如,下面的sql語句:
INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三');
LogMiner解釋出來的結果將是下面這個樣子:
insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));
創建數據字典的目的就是讓LogMiner引用涉及到內部數據字典中的部分時為他們實際的名字,而不是系統內部的16進制。數據字典文件是一個文本文件,使用包DBMS_LOGMNR_D來創建。如果我們要分析的數據庫中的表有變化,影響到庫的數據字典也發生變化,這時就需要重新創建該字典文件。另外一種情況是在分析另外一個數據庫文件的重作日志時,也必須要重新生成一遍被分析數據庫的數據字典文件。
創建數據字典文件之前需要配置LogMiner文件夾:
1 CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR'; 2 alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;
創建字典文件需要以DBA用戶登錄,創建到上面配置好的LogMiner文件夾中:
1 CONN LOGMINER/ LOGMINER@PRACTICE AS SYSDBA 2 EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
1.3.3 加入需分析的日志文件
Oracle的LogMiner可以分析在線(online)和歸檔(offline)兩種日志文件,加入分析日志文件使用dbms_logmnr.add_logfile過程,第一個文件使用dbms_logmnr.NEW參數,后面文件使用dbms_logmnr.ADDFILE參數。
1、創建列表
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW); 3 END; 4 /
2、添加其他日志文件到列表
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE); 3 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00003_0817639922.001',options=>dbms_logmnr.ADDFILE); 4 END; 5 /
1.3.4 使用LogMiner進行日志分析
Oracle的LogMiner分析時分為無限制條件和限制條件兩種,無限制條件中分析所有加入到分析列表日志文件,限制條件根據限制條件分析指定范圍日志文件。
1、無限制條件
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
2、有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數的設置(參數含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數我們可以限制只分析某一時間范圍的日志。
參數 |
參數類型 |
默認值 |
含義 |
StartScn |
數字型 |
0 |
分析重作日志中SCN≥StartScn日志文件部分 |
EndScn |
數字型 |
0 |
分析重作日志中SCN≤EndScn日志文件部分 |
StartTime |
日期型 |
1998-01-01 |
分析重作日志中時間戳≥StartTime的日志文件部分 |
EndTime |
日期型 |
2988-01-01 |
分析重作日志中時間戳≤EndTime的日志文件部分 |
DictFileName |
字符型 |
|
字典文件該文件包含一個數據庫目錄的快照。 |
如下面的例子,我們僅僅分析2013年6月8日的日志,:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName => dictfilename=>'D:\..\practice\LOGMNR\dictionary.ora',
StartTime =>to_date('2013-6-8 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime =>to_date(''2013-6-8 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName =>'D:\..\practice\LOGMNR\dictionary.ora',
StartScn =>20,
EndScn =>50);
1.3.5 觀察分析結果(v$logmnr_contents)
到現在為止,我們已經分析得到了重作日志文件中的內容。動態性能視圖v$logmnr_contents包含LogMiner分析得到的所有的信息。
SELECT sql_redo FROM v$logmnr_contents;
如果我們僅僅想知道某個用戶對於某張表的操作,可以通過下面的SQL查詢得到,該查詢可以得到用戶LOGMINER對表EMP所作的一切工作。
SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP';
序號 |
名稱 |
含義 |
1 |
SCN |
特定數據變化的系統更改號 |
2 |
TIMESTAM |
數據改變發生的時間 |
3 |
COMMIT_TIMESTAMP |
數據改變提交的時間 |
4 |
SEG_OWNER |
數據發生改變的段名稱 |
5 |
SEG_NAME |
段的所有者名稱 |
6 |
SEG_TYPE |
數據發生改變的段類型 |
7 |
SEG_TYPE_NAME |
數據發生改變的段類型名稱 |
8 |
TABLE_SPACE |
變化段的表空間 |
9 |
ROW_ID |
特定數據變化行的ID |
10 |
SESSION_INFO |
數據發生變化時用戶進程信息 |
11 |
OPERATION |
重做記錄中記錄的操作(如INSERT) |
12 |
SQL_REDO |
可以為重做記錄重做指定行變化的SQL語句(正向操作) |
13 |
SQL_UNDO |
可以為重做記錄回退或恢復指定行變化的SQL語句(反向操作) |
需要強調一點的是,視圖v$logmnr_contents中的分析結果僅在我們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是因為所有的LogMiner存儲都在PGA內存中,所有其他的進程是看不到它的,同時隨着進程的結束,分析結果也隨之消失。
最后,使用過程DBMS_LOGMNR.END_LOGMNR終止日志分析事務,此時PGA內存區域被清除,分析結果也隨之不再存在。
2 數據同步Oracle數據庫設置
Oracle數據使用LogMiner查看執行SQL語句,其中需要進行如下四步驟是指:
1、設置數據庫為歸檔模式;
2、設置LogMiner字典文件路徑等;
3、創建數據同步用戶(如用戶名為LOGMINER,該用戶擁有DBA權限);
4、驗證配置是否成功;
2.1 設置數據庫為歸檔模式
2.1.1 查看數據庫是否為歸檔模式
使用SqlPlus或者命令行界面連接數據庫(以下以命令行界面操作)
--進入SqlPlus程序
sqlplus /nolog
--使用DBA用戶登錄到源數據庫中
conn system/system@practic as sysdba
--查看PRACTICE數據庫是否處於歸檔模式
1 SELECT dbid, name, log_mode FROM v$database; 2 或者 3 ARCHIVE LOG LIST;
如果顯示數據庫顯示為歸檔模式,則設置數據庫為歸檔模式可跳過;如果顯示數據庫為非歸檔模式則需要進行以下設置。
上圖顯示數據庫未進行歸檔,需要進行歸檔設置。
2.1.2 設置歸檔模式
創建ARCHIVE文件夾,ARCHIVE文件夾路徑根據所在服務器進行設置,在下面操作中設置為" D:\oracle\oradata\practice\ARCHIVE"
--設置歸檔日志文件路徑
ALTER SYSTEM SET log_archive_dest="D:\oracle\oradata\practice\ARCHIVE";
--日志文件名稱格式:
ALTER SYSTEM SET log_archive_format="ARC%S_%R.%T" SCOPE=SPFILE;
--修改完畢后,關閉數據庫,以MOUNT方式啟動
1 SHUTDOWN IMMEDIATE; 2 STARTUP MOUNT;
--設置數據庫為歸檔模式
ALTER DATABASE ARCHIVELOG;
(注意:如果重啟數據失敗,請參考第4章節異常問題處理)
2.1.3 驗證歸檔是否設置成功
--查看PRACTICE數據庫是否處於歸檔模式
1 SELECT dbid, name, log_mode FROM v$database; 2 或者 3 ARCHIVE LOG LIST;
--驗證參數設置是否起作用
SELECT dest_id, status, destination FROM v$archive_dest WHERE dest_id =1;
--在參數文件設置已經起作用,打開數據庫
ALTER DATABASE OPEN;
2.2 LogMiner設置
2.2.1 創建LogMiner文件夾
創建LOGMNR文件夾,路徑為"D:\oracle\oradata\practice\LOGMNR"
2.2.2 設置LogMiner字典文件路徑
--創建數據字典文件
1 CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR'; 2 alter system set utl_file_dir='D:\oracle\oradata\practice\LOGMNR' scope=spfile;
2.2.3 開啟LogMiner日志補充模式
--創建數據字典文件
alter database add supplemental log data;
2.2.4 重啟數據庫驗證
--修改完畢后,關閉數據庫,以MOUNT方式啟動
1 SHUTDOWN IMMEDIATE; 2 STARTUP;
--查看Logminer文件夾是否設置
SHOW PARAMETER utl_file_dir;
2.3 創建數據同步用戶
在數據庫創建LOGMINER用戶,該用戶需要具有DBA權限
--在源數據庫創建LOGMINER用戶,並賦予DBA權限
1 CREATE USER LOGMINER IDENTIFIED BY LOGMINER; 2 GRANT CONNECT, RESOURCE,DBA TO LOGMINER;
3 使用LogMiner讀取日志例子
在使用LogMiner讀取歸檔/在線日志需要按照第2章節進行設置,設置完畢后可以對歸檔和在線日志進行分析。特別是需要開啟LogMiner日志補充模式,如果沒有開始LogMiner補充模式將無法查看DDL語句,按照測試結果看,只有開始LogMiner日志補充模式后,才能查看DDL語句,在此之前進行DDL將無法進行查看。
3.1 使用LogMiner讀取在線日志
3.1.1 測試數據准備
--以LOGMINER用戶登錄(非DBA登錄)創建AAAAA表(Oracle11g請注意用戶名、密碼大小寫)
1 CONNECT LOGMINER/LOGMINER@PRACTICE 2 CREATE TABLE AAAAA(field001 varchar2(100)); 3 INSERT INTO AAAAA (field001) values ('000000'); 4 INSERT INTO AAAAA (field001) values ('0000010'); 5 commit;
3.1.2 創建數據字典文件
數據庫對象發生變化,需要重新創建數據字典文件
--以LOGMINER用戶(DBA權限)登錄,生成字典文件
1 CONN LOGMINER/LOGMINER@PRACTICE AS SYSDBA 2 EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
3.1.3 確認當前處於聯機狀態的日志文件
--需要確認當前處於聯機狀態的日志文件
SELECT group#, sequence#, status, first_change#, first_time FROM V$log ORDER BY first_change#;
從上圖可以看出在線日志REDO03處於ACTIVE狀態中
3.1.4 加入需分析的日志文件
--加入解析在線日志文件
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\REDO03.LOG',options=>dbms_logmnr.NEW); 3 END; 4 /
3.1.5 使用LogMiner進行分析
--啟動LogMiner進行分析
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
3.1.6 觀察分析結果
--查詢相關操作日志
1 SELECT sql_redo, sql_undo, seg_owner 2 FROM v$logmnr_contents 3 WHERE seg_name='AAAAA' 4 AND seg_owner='LOGMINER';
3.2 使用LogMiner讀取歸檔日志
3.2.1 測試數據准備
--以LOGMINER用戶登錄(非DBA權限)創建EMP表(Oracle11g請注意用戶名、密碼大小寫)
1 CONN LOGMINER/ LOGMINER@PRACTICE 2 CREATE TABLE EMP 3 (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, 4 ENAME VARCHAR2(10), 5 JOB VARCHAR2(9), 6 MGR NUMBER(4), 7 HIREDATE DATE, 8 SAL NUMBER(7,2), 9 COMM NUMBER(7,2), 10 DEPTNO NUMBER(2));
--插入EMP數據
1 INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20); 2 INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30); 3 INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30); 4 INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20); 5 COMMIT;
--從v$log視圖中找出日志文件的序號
1 CONNECT system/system@practice as sysdba 2 ALTER SYSTEM SWITCH LOGFILE; 3 select sequence#, FIRST_CHANGE#, NEXT_CHANGE#,name from v$archived_log order by sequence# desc;
3.2.2 創建數據字典文件
確保按照2.2進行logMiner設置
--以LOGMINER用戶(DBA權限)登錄,生成字典文件
1 CONN LOGMINER/ LOGMINER@PRACTICE AS SYSDBA 2 EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\practice\LOGMNR');
3.2.3 加入需分析的日志文件
--加入解析日志文件
1 BEGIN 2 dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.NEW); 3 END; 4 /
3.2.4 使用LogMiner進行分析
--啟動LogMiner進行分析
1 EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\oradata\practice\LOGMNR\dictionary.ora');
3.2.5 觀察分析結果
--查詢相關操作日志
1 SELECT sql_redo, sql_undo 2 FROM v$logmnr_contents 3 WHERE seg_name='EMP' 4 AND seg_owner='LOGMINER';
4 其他
4.1 異常問題處理
4.1.1 出現ORA-12514錯誤
如果出現ORA-12514錯誤時,如下圖所示:
需要修改listerner.ora文件,具體在Oracle安裝目錄\NETWORK\ADMIN下,當前操作為" D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora "加入如下設置
1 (SID_DESC = 2 (GLOBAL_DBNAME = practice) 3 (ORACLE_HOME = D:\oracle\product\10.2.0\db_1) 4 (SID_NAME = practice) 5 )
設置后需要重新啟動TNSListener,即可生效
4.1.2 出現ORA-16018錯誤
如果出現ORA-16018錯誤時,如下圖所示:
該問題是數據庫開啟了閃回功能,歸檔文件默認情況下是保存到閃回路徑中,簡單的處理方式是在設置歸檔路徑中加入scope=spfile參數
--設置歸檔日志文件路徑
ALTER SYSTEM SET log_archive_dest="D:\oracle\oradata\practice\ARCHIVE" scope=spfile;
此時查看閃回路徑,該路徑並未影響,只不過閃回文件和歸檔文件保存到各自文件夾中
4.2 LogMiner相關資料
參見Oracle官方站點對LogMiner介紹,地址如下:
http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm