|
|
目前有一个需求,需要知道某张表下某个用户的字段是在何时被谁给修改了,在这里需要借助 Oracle Logminer 来查询详细记录
前提:数据库的归档模式必须开启,这是 LogMiner 有效工作的基础
操作步骤示例:
1. 添加日志文件:
注意:需要知道大致时间,比如是在8点到10点时候被修改的,就需要定位在这个时间段的所有归档日志,可以通过 v$archived_log 查询
execute dbms_logmnr.add_logfile('/data/logmnr/1_38170_1153517812.dbf',dbms_logmnr.new);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38171_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38172_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38173_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38174_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38175_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38176_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38177_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38178_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38179_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38180_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38181_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38182_1153517812.dbf',dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile('/data/logmnr/1_38183_1153517812.dbf',dbms_logmnr.addfile);
- 作用:把一系列归档日志文件注册到 LogMiner 里
- 第一个 dbms_logmnr.new 表示“新建一个日志列表”
- 后续用 dbms_logmnr.addfile 不断往列表追加日志
- 简单理解:告诉 LogMiner“我要分析这些日志文件里的内容”
2. 启动 LogMiner
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
- dict_from_online_catalog:告诉 LogMiner 使用当前数据库的数据字典(而不是 dump 出来的字典文件),这样能识别表名、列名
- committed_data_only:只返回已经提交的事务(过滤掉回滚的/未提交的 SQL)
3. 查询日志内容:
注意:此时会生成 v$logmnr_contents,可以用它创建一张副表,这样的话可以结束 LogMiner 会话 ,提前释放资源,不影响业务
create table xx as select * from v$logmnr_contents;
select count(*) from xx;
4. 结束 LogMiner 会话
exec dbms_logmnr.end_logmnr();
5. 查询分析结果 (在 v$logmnr_contents的副表 xx 中)
例如:
SELECT START_TIMESTAMP,
SQL_REDO,
SESSION_INFO
FROM SYS.xx
WHERE (UPPER(SQL_REDO) LIKE '%YBZZF%' and UPPER(SQL_REDO) LIKE '%2412128361%')
在只保留了id(2412128361)和被改字段(YBZZF)的条件下,找到了被修改的时间(START_TIMESTAMP)、内容(SQL_REDO)和操作用户(SESSION_INFO)
注意:如果没有结果,可以逐步放宽搜索条件,知道找到需要找到的结果为止
|
|