针对日记挖掘这项很有用的技术,自己做了个实验。
实验步骤:
本人环境是10G,SID=ora10g,开始时数据库还是非归档模式。
一、修改归档模式
SQL>shutdown immediate
SQL>startup mount
SQL>ALTER DATABASE ARCHIVELOG;
SQL>alter database opne
SQL>archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 55
下一个存档日志序列 57
当前日志序列 57
二、模拟insert操作
创建test表
SQL>create table test as select * from dba_objects where 1=2;
插入值
SQL>insert into test select * from dba_objects;
提交
SQL>commit
三、产生所需的归档日志
手动切换日志
SQL>alter system switch logfile;
手动归档(这步用不着,切换日志的时候10g可能已经自动将日志归档)
SQL>archive log all
查找归档日志文件
存档终点=USE_DB_RECOVERY_FILE_DEST
USE_DB_RECOVERY_FILE_DEST是10g库中新增的一项参数,具体存放一些回滚需要的文件,归档日志文件就默认放在这里。
USE_DB_RECOVERY_FILE_DEST=E:\ora10g\flash_recovery_area\ORA10G\ARCHIVELOG\2008_06_11
确定对O1_MF_1_54_44YK01DQ_.ARC大小5M的这个归档文件做一次挖掘。
四、日志挖掘
先看看挖掘脚本
execute
dbms_logmnr.add_logfile(logfilename=>'E:\ora10g\flash_recovery_area\ORA10G\ARCHIVELOG\2008_06_11\O1_MF_1_54_44YK01DQ_.ARC',options=>dbms_logmnr.new);
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
create table temp_arch_44YK01DQ tablespace USERS as select * from v$logmnr_contents;
execute dbms_logmnr.end_logmnr;
实际这个脚本分为4个步骤:
1.执行程序包dbms_logmnr.add_logfile
execute dbms_logmnr.add_logfile(logfilename=>'归档文件路径',options=>dbms_logmnr.new);
2.执行程序包dbms_logmnr.start_logmnr
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
3.创建表
create table table_name tablespace ts_name as select * from v$logmnr_contents;
用来存放这个v$logmnr_contents视图的资料,由于delete or insert or update都以行的形式存在,如:
SQL_REDO
insert into "SYS"."TEST"("OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED","SECONDARY") values ('SYS','DIMLEVEL$',NULL,'423','423','TABLE',TO_DATE('13-4月 -08', 'DD-MON-RR'),TO_DATE('13-4月 -08', 'DD-MON-RR'),'2008-04-13:09:27:27','VALID','N','N','N');
SQL_UNDO
delete from "SYS"."TEST" where "OWNER" = 'SYS' and "OBJECT_NAME" = 'DIMLEVEL$' and "SUBOBJECT_NAME" IS NULL and "OBJECT_ID" = '423' and "DATA_OBJECT_ID" = '423' and "OBJECT_TYPE" = 'TABLE' and "CREATED" = TO_DATE('13-4月 -08', 'DD-MON-RR') and "LAST_DDL_TIME" = TO_DATE('13-4月 -08', 'DD-MON-RR') and "TIMESTAMP" = '2008-04-13:09:27:27' and "STATUS" = 'VALID' and "TEMPORARY" = 'N' and "GENERATED" = 'N' and "SECONDARY" = 'N' and ROWID = 'AAAMjsAABAAAPBgAAA';
即使使用比如这种语句insert into test values(……) where wner='SYS' and OBJECT_NAME='DIMLEVEL$';
也同样在这个v$logmnr_contents视图中将修改记录以行的形式出现的(显示where子句的所有条件)。
所以表会比较大,建议选择较大的表空间ts_name。
4.执行程序包dbms_logmnr.end_logmnr
execute dbms_logmnr.end_logmnr;
用于结束日志挖掘。
五、查询表
select * from table_name;
一般是使用sys用户做日志挖掘操作
select * from sys.table_name;
表中详细记载着日志时间内,所有对数据库所做的所有dml操作(可能不包括select,有待考察)
一般采用这个语句查询:
select USERNAME,SEG_OWNER,SEG_NAME,SEG_TYPE,SEG_TYPE_NAME,TABLE_SPACE,OPERATION,OPERATION_CODE,
SQL_REDO,SQL_UNDO,STATUS
from sys.table_name
where table_space='BOSS_DATA01'
and rownum<1000;
主要是SQL_REDO这栏位里的内容,利用PL/SQL查询最好。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11400965/viewspace-406692/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11400965/viewspace-406692/