环境:
OS:Red Hat Linux As 5
DB:10.2.0.4
我们知道数据的任何操作都会记录到redo日志文件中,在8i以前我们是没有办法查看redo文件里面的内容的,但在9i以后,Oracle推出了logminer,通过logminer分析我们可以很清楚查看Oracle所做的任何操作,比如我删除一个表,在logminer中可以看到很详细的操作记录.
1.使用logminer需要运行如下两个文件
$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE_HOME/rdbms/admin/dbmslmd.sql
SQL> connect sys/sys as sysdba
Connected.
SQL> @/u01/app/oracle/product/10.2.0/db_1/rdbms/admin/dbmslm.sql
Package created.
SQL> @/u01/app/oracle/product/10.2.0/db_1/rdbms/admin/dbmslmd.sql
Package created.
2.修改初始化参数utl_file_dir,指定分析数据的存放处
SQL>alter system set utl_file_dir='/u01/logmine_dir' scope=spfile;
SQL>shutdown immediate
SQL>startup
3.创建数据字典文件
begin
sys.dbms_logmnr_d.build(dictionary_filename =>'mylogmine.ora',dictionary_location =>'/u01/logmine_dir',options>=>dbms_logmnr_d.store_in_flat_file);
end;
mylogmine.ora是给字典文件起的文件名(可任意),字典文件的作用是将Oralce内部处理使用的对象编码和内部数据类型转换为可读的对象名称和类型.例如这个SQL
INSERT INTO HR.JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY) VALUES('IT_WT','Technical Writer', 4000, 11000);
若没有创建数据字典文件的文件的话,logminer出来的记录内容如下:
insert into "UNKNOWN"."OBJ# 45522"("COL 1","COL 2","COL 3","COL 4") values
(HEXTORAW('45465f4748'),HEXTORAW('546563686e6963616c20577269746572'),
HEXTORAW('c229'),HEXTORAW('c3020b'));
4.这个时候我们使用某个用户登录数据库后删除某个表
SQL>connect app_user/hxl
SQL>drop table tb_test;
SQL>conect / as sysdba
SQL>alter system switch logfile;这个时候会产生一个归档日志文件,刚才删除表的操作就在这个文件里
5.分析归档日志
创建列表begin
sys.dbms_logmnr.add_logfile(LogFileName => '/u01/arch_log/1_13_787769576.dbf',
Options => dbms_logmnr.new);
end;
这里的归档日志文件1_13_787769576.dbf就是我们刚才switch生成的日志文件.
当然还可以添加其他归档日志,看分析的需要,我们这里只分析一个归档日志文件.
添加其他归档日志分析的过程如下:
begin
dbms_logmnr.add_logfile(LogFileName => '/u01/arch_log/1_12_787769576.dbf',
Options => dbms_logmnr.addfile);
end;
6.开始使用LogMiner进行日志分析
分析整个日志文件(没有任何条件)begin
sys.dbms_logmnr.start_logmnr(DictFileName =>'/u01/logmine_dir/mylogmine.ora');
end;
若大概知道某个操作发生的时间,可以按照需要时间分析的过程如下:
begin
sys.dbms_logmnr.start_logmnr(DictFileName =>'/u01/logmine_dir/mylogmine.ora',
startTime => to_date('2012-07-04 15:00:00','YYYY-MM-DD HH24:MI:SS'),
endTime => to_date('2012-07-04 16:00:00','YYYY-MM-DD HH24:MI:SS')
);
end;
我们这里分析的是整个日志文件,分析完成后,查看V$LOGMNR_CONTENTS试图的内容就是我们刚才分析得到的内容.注意V$LOGMNR_CONTENTS的内容是保留在PGA中的,查看这个试图需要在跟执行分析的过程在一个session中,否则在另外开一个session是查看不到的,而且会报ORA-01306错误.
从V$LOGMNR_CONTENTS视图中可以查看得到我们刚才删除表的操作:
SQL>select sql_redo from V$LOGMNR_CONTENTS
where upper(sql_redo) like '%TB_TEST%'
SQL_REDO
-----------------------------------
ALTER TABLE "APP_USER"."TB_TEST" RENAME TO "BIN$w/uEl9lUoujgQAB/AQAW2w==$0" ;
"drop table tb_test AS ""BIN$w/uEl9lUoujgQAB/AQAW2w==$0"" ;"
7.结束分析begin
sys.dbms_logmnr.end_logmnr;
end;
使用logminer的一些说明:
1.分析日志所在的数据库平台必须跟产生日志的数据库平台保持一致;
2.分析日志所在的数据库可以跟产生日志的数据库完全独立,或者是两者是同一个数据库;
3.分析日志所在的数据库的版本比如高于产生日志的数据库的版本;
4.分析日志所在的数据库的字符集必须跟产生日志的数据库的字符集保持一致;
5.logminer数据字典文件必须在产生日志的数据库生成.
----------------------oracle 12c---------------------------------------
登陆到CDB(下面的执行都需要在cdb root模式下执行)
1.添加需要分析的归档日志
begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/archlog/1_1206_1032346838.dbf',options=>dbms_logmnr.new);
end;
begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/archlog/1_1207_1032346838.dbf',options=>dbms_logmnr.addfile);
end;
begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/archlog/1_1208_1032346838.dbf',options=>dbms_logmnr.addfile);
end;
如需移除日志使用
execute dbms_logmnr.remove_logfile(logfilename=>'/u01/app/oracle/archlog/1_1208_1032346838.dbf');
2.查看当前添加分析的归档日志文件
select * from v$logmnr_logs;
3.开始分析
begin
dbms_logmnr.start_logmnr(Options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
end;
启动分析时还可以指定时间或者scn
begin
dbms_logmnr.start_logmnr(Options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG,starttime => to_date('2020-07-03 09:30:00','YYYY-MM-DD HH24:MI:SS'),endtime => to_date('2020-07-03 10:30:00','YYYY-MM-DD HH24:MI:SS));
end;
begin
execute dbms_logmnr.start_logmnr(Options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG ,startscn => 3231808,endscn => 3231813);
end;
4.查看相应的日志信息
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents t where t.USERNAME='HXL' and sql_redo like '%T5%'
5.关闭logminer
begin
dbms_logmnr.end_logmnr;
end;
-- The End --