LogMiner是Oracle数据库提供的一个工具,它用于分析重做日志和归档日志所记载的事务操作。它既能分析redo log file,也能分析归档后的archive log file。 Logminer也可以分析其它数据库的重做日志文件,但是必须使用重做日志所在数据库的数据字典,否则会出现无法识别的乱码。另外被分析数据库的操作系统平台最好和当前Logminer所在数据库的运行平台一样,且block size相同
LogMiner的功能:
(1)确定数据库的逻辑损坏时间。
通过LogMiner可以准确定位该误操作的执行时间和SCN值,然后通过基于时间恢复或者基于SCN恢复可以完全恢复该表数据。
(2)确定事务级要执行的精细逻辑恢复操作。
通过LogMiner可以取得任何用户的DML操作及相应的UNDO操作,通过执行UNDO操作可以取消用户的错误操作。
(3)执行后续审计。
通过LogMiner可以跟踪Oracle数据库的所有DML、DDL和DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息。
日志挖掘环境(挖掘本地日志):
1.1.查看归档路径及路径下的日志:
SYS@ORA11GR2>archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 55
Next log sequence to archive 57
Current log sequence 57
SYS@ORA11GR2>
SYS@ORA11GR2>show parameter recover
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/FRA
db_recovery_file_dest_size big integer 3G
db_unrecoverable_scn_tracking boolean TRUE
recovery_parallelism integer 0
SYS@ORA11GR2>
——查看归档日志:
[oracle@wang archivelog]$ pwd
/u01/app/FRA/ORA11GR2/archivelog
[oracle@wang archivelog]$ ls
2016_09_28
[oracle@wang archivelog]$
因为还没有到归档时机,2016-9-30.
1.2. 查看当前的日子组:
SYS@ORA11GR2>select group#,members,status from v$log order by 1;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 INACTIVE
2 2 INACTIVE
3 2 CURRENT
SYS@ORA11GR2>
——第3组日子正在应用,进行操作:
SYS@ORA11GR2>create table a(x int);
Table created.
SYS@ORA11GR2>insert into a values(1);
1 row created.
SYS@ORA11GR2>
SYS@ORA11GR2>insert into a values(2);
1 row created.
SYS@ORA11GR2>insert into a values(3);
1 row created.
SYS@ORA11GR2>commit;
Commit complete.
SYS@ORA11GR2>
再次查看:
SYS@ORA11GR2>select group#,members,status from v$log order by 1;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 INACTIVE
2 2 INACTIVE
3 2 CURRENT
SYS@ORA11GR2>
——查看归档日志:
[oracle@wang archivelog]$ pwd
/u01/app/FRA/ORA11GR2/archivelog
[oracle@wang archivelog]$ ls
2016_09_28
[oracle@wang archivelog]$
因为还没有到归档时机,2016-9-30.
1.3.切换日志(因为启动了归档,所以当前的第1组日志里记录了我前面的操作且在进行归档)
SYS@ORA11GR2>alter system switch logfile;
System altered.
手动切换日记组,同时上一组的日志进行归档操作(或者在进行实例恢复)
——查看归档日子:
[oracle@wang archivelog]$ ls
2016_09_28 2016_09_30
[oracle@wang archivelog]$ cd 2016_09_30/
[oracle@wang 2016_09_30]$ ls
o1_mf_1_57_cyw0d7cs_.arc
已经生成了归档日志
1.4.查看日子组状态,第1组日志正在使用,进行操作:
SYS@ORA11GR2>select group#,members,status from v$log order by 1;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 CURRENT
2 2 INACTIVE
3 2 ACTIVE
SYS@ORA11GR2>select * from a;
X
----------
1
2
3
SYS@ORA11GR2>delete a where x<=2;
2 rows deleted.
SYS@ORA11GR2>
SYS@ORA11GR2>commit;
Commit complete.
SYS@ORA11GR2>select * from a;
X
----------
3
SYS@ORA11GR2>
——切换日志,查询当前使用的日志组已经为第2组了,说明已经生成了归档日志。
SYS@ORA11GR2>alter system switch logfile;
System altered.
SYS@ORA11GR2>select group#,members,status from v$log order by 1;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 ACTIVE
2 2 CURRENT
3 2 INACTIVE
SYS@ORA11GR2>
验证:
[oracle@wang 2016_09_30]$ ls
o1_mf_1_57_cyw0d7cs_.arc o1_mf_1_58_cyw0x5l2_.arc
[oracle@wang 2016_09_30]$ pwd
/u01/app/FRA/ORA11GR2/archivelog/2016_09_30
[oracle@wang 2016_09_30]$
2.执行logminer日志挖掘:
——先采集日志:
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/u01/app/FRA/ORA11GR2/archivelog/2016_09_30/o1_mf_1_57_cyw0d7cs_.arc',dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/u01/app/FRA/ORA11GR2/archivelog/2016_09_30/o1_mf_1_58_cyw0x5l2_.arc',dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
——开始分析日志
SYS@ORA11GR2>exec sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.
——将logminer分析到报告存储到dt表中:
SYS@ORA11GR2>create table dt as select * from v$logmnr_contents;
Table created.
——结束挖掘:
SYS@ORA11GR2>exec sys.dbms_logmnr.end_logmnr();
PL/SQL procedure successfully completed.
3. 查看logminer日志挖掘结果:
SYS@ORA11GR2>desc dt;
SYS@ORA11GR2>select start_timestamp,sql_redo,sql_undo from dt;
或者:
打开pl/sql developer查看:
注:由于测试表的名字起得不好导致查出来的数据很多,教训啊!!!!!!!!!!!!!!!
日志挖掘环境(挖掘远程传输的日志)
1. 配置环境:
——上传要挖掘的日志:
验证:
[oracle@wang ~]$ ls *.arc
o1_mf_1_1_cxljlsmd_.arc o1_mf_1_2_cxljnxht_.arc
[oracle@wang ~]$ pwd
/home/oracle
[oracle@wang ~]$
2. 执行日志挖掘
——采集日志:
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/home/oracle/o1_mf_1_1_cxljlsmd_.arc',dbms_logmnr.addfile)
PL/SQL procedure successfully completed.
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/home/oracle/o1_mf_1_2_cxljnxht_.arc',dbms_logmnr.addfile)
PL/SQL procedure successfully completed.
SYS@ORA11GR2>
——logminer分析日志:
SYS@ORA11GR2>exec sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog);
BEGIN sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog); END;
*
ERROR at line 1:
ORA-01295: DB_ID mismatch between dictionary USE_ONLINE_CATALOG and logfiles
ORA-06512: at "SYS.DBMS_LOGMNR", line 58
ORA-06512: at line 1
解决:
SYS@ORA11GR2>alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;
System altered.
SYS@ORA11GR2>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ORA11GR2>startup
ORACLE instance started.
Total System Global Area 730714112 bytes
Fixed Size 2256832 bytes
Variable Size 452984896 bytes
Database Buffers 272629760 bytes
Redo Buffers 2842624 bytes
Database mounted.
Database opened.
SYS@ORA11GR2>
——创建目录:
[oracle@wang ~]$ mkdir logmnr
?
SYS@ORA11GR2>exec dbms_logmnr_d.build('enmo.ora','/home/oracle/logmnr');
PL/SQL procedure successfully completed.
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/home/oracle/o1_mf_1_1_cxljlsmd_.arc',dbms_logmnr.addfile)
PL/SQL procedure successfully completed.
SYS@ORA11GR2>exec dbms_logmnr.add_logfile('/home/oracle/o1_mf_1_2_cxljnxht_.arc',dbms_logmnr.addfile)
PL/SQL procedure successfully completed.
——修改/home/oracle/enmo.ora中DB_ID的值为源库的DB_ID(示例BD_ID为763893530)
[oracle@wang ~]$ cd logmnr/
[oracle@wang logmnr]$ pwd
/home/oracle/logmnr
[oracle@wang logmnr]$ ls
enmo.ora
[oracle@wang logmnr]$ vi enmo.ora
CREATE_TABLE DICTIONARY_TABLE ( DB_NAME VARCHAR2(9), DB_ID NUMBER(20), DB_CREATED VARCHAR2(20), DB_DICT_CREATED VARCHAR2(20), DB_RESETLOGS_CHANGE# NUMBER(22), DB_RESETLOGS_TIME VARCHAR2(20), DB_VERSION_TIME VARCHAR2(20), DB_REDO_TYPE_ID VARCHAR2(8), DB_REDO_RELEASE VARCHAR2(60), DB_CHARACTER_SET VARCHAR2(30), DB_VERSION VARCHAR2(64), DB_STATUS VARCHAR2(64), DB_DICT_MAXOBJECTS NUMBER(22), DB_DICT_OBJECTCOUNT NUMBER(22), DB_DICT_SCN NUMBER(22), DB_THREAD_MAP RAW(8), DB_TXN_SCNBAS NUMBER(22), DB_TXN_SCNWRP NUMBER(22));
INSERT_INTO DICTIONARY_TABLE VALUES ('ORA11GR2',763893530,'08/30/2016 20:58:09','09/30/2016 15:29:16',1256742,'09/23/2016 15:29:09','09/23/2016 07:36:24','','','AL32UTF8','11.2.0.4.0','Production',89906,87280,1826459,,1827167,0);
??????????????修改完保存;
——再次分析:
SYS@ORA11GR2>exec sys.dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/enmo.ora');
PL/SQL procedure successfully completed.
——存储分析报告:
SYS@ORA11GR2>create table ft as select * from v$logmnr_contents;
Table created.
——结束分析:
SYS@ORA11GR2>exec sys.dbms_logmnr.end_logmnr();
PL/SQL procedure successfully completed.
SYS@ORA11GR2>
3. 查看logminer日志挖掘结果:
SYS@ORA11GR2>desc ft;
SYS@ORA11GR2>select START_TIMESTAMP,SQL_REDO,SQL_UNDO from ft;
或者:
打开pl/sql developer查看: