重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: Oracle LogMiner 分析归档日志内容 [打印本页]

作者: ZhangQi    时间: 2025-8-31 14:48
标题: Oracle LogMiner 分析归档日志内容
目前有一个需求,需要知道某张表下某个用户的字段是在何时被谁给修改了,在这里需要借助 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)

注意:如果没有结果,可以逐步放宽搜索条件,知道找到需要找到的结果为止











欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2