一客户反应某业务表数据某列数据被批量误修改,客户希望查出是谁做了什么操作修改了数据。
这里我们试着用logminer挖掘一下归档日志,归档日志中记录了大部分的DML操作。这里我们就先记录一下这次(本机)挖掘的操作记录,后面关于logminer的更多用法后面有机会再补充。
**事情经过:**用户在12月29日发现某业务表中数据被大批量篡改,客户可以确定大概的篡改时间为12月9日至10日。好在这个核心业务保存了一个月的CDP备份(包含每天晚上8点的数据泵dmp导出)和rman及归档日志。我们先试图通过数据泵导出的dmp将业务表被篡改的数据恢复,然后再用logminer挖掘归档日志,查找篡改业务表的操作。
**确定误操作发生的大概时间点:**首先我们用12月10日的dmp恢复业务表到测试库中,发现该表在10号晚上8点前已经被篡改了,于是我们用9号的dmp恢复业务表,发现表中数据正常,于是将恢复出来的业务表交给开发比对先恢复业务表。通过恢复操作我们可以确定的是篡改操作发生的大概时间在9号晚上8点至10号晚上8点之间。
**挖掘大概步骤:**通过备份一体机将9号晚上8点至10号晚上8点之间的rman备份中的归档备份拷贝至数据库中(也可是分析库),将归档日志备份集注册至catalog,恢复归档,然后用logminer开始挖掘。
logminer挖掘步骤:
1.归档恢复:我将两天的日志备份拷贝到了主库节点一,开始恢复归档。
run {
set archivelog destination to '/u01/archivelog';
--源库是rac双节点,指定恢复目录
SQL 'ALTER SESSION SET NLS_DATE_FORMAT="YYYY-MM-DD:HH24:MI:SS"';
restore archivelog time between '2022-11-9 20:00:00' and '2022-11-10 19:59:59';
}
2.开始挖掘
(1)创建临时用户及专用表空间,用于日志挖掘存放,临时记录表。
create tablespace logminer datafile '+DATA' size 500M autoextend on next 100M maxsize unlimited;
create user logminer identified by logminer default tablespace logminer;
grant connect,resource,dba to logminer;
(2)添加要挖掘的日志
--插入第一条日志使用dbms_logmnr.new
execute dbms_logmnr.add_logfile(logfilename=>'/u01/archivelog/1_86301_1080556683.dbf',options=>dbms_logmnr.new);
--第二条往后开始用
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/archivelog/1_86302_1080556683.dbf');
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/archivelog/1_86302_1080556683.dbf');
.
.
.
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/archivelog/1_863400_1080556683.dbf');
--上面的添加日志sql可以批量生成,注意thread号
select 'EXECUTE DBMS_LOGMNR.ADD_LOGFILE('''||name||''');' from v$archived_log where (thread#=1 and sequence# between 86302 and 86400 and name is not null);
--添加完日志便可以开始挖掘了
EXECUTE DBMS_LOGMNR.START_LOGMNR;
execute DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
--挖掘完成后数据全部会存放在一个临时视图v$logmnr_contents中,我们可以在该视图中直接查看信息,也可以创建一个表将视图信息复制过来,因为该视图只对此次挖掘和当前session有效,为了查看信息方便。
create table log11 as select * from v$logmnr_contents;
--结束当前挖掘,开始下一次挖掘
EXECUTE DBMS_LOGMNR.END_LOGMNR;
注:
1.最好创建专用用户和表空间用于临时表创建,如果用系统用户会占用system表空间。
2. logmnr_contents视图只存在于本次挖掘和当前session。
3. logmnr_contents视图中machine_name可以查看操作主机,redo_sql可查看操作sql,undo_sql可以查看重做sql用于恢复误操作数据。
4.依据每个归档日志大小决定每次挖掘所要添加的归档日志数量。