Oracle LogMiner:概念

一、LogMiner概念
LogMiner工具既可以用来分析在线日志,也可以用来分析离线日志文件,既可以分析本身自己数据库的重作日志文件,也可以用来分析其它数据库的重作日志文件。当分析其它数据库的重作日志文件时,需要注意的是,LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外,必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。源数据库(Source Database)平台必须和分析数据库(Mining Database)平台一样。
Oracle通过LogMiner工具对Redo Log进行挖掘,显示出一系列可读的信息,该过程称为日志挖掘。LogMiner通过V$LOGMNR_CONTENTS视图显示Redo Log中的信息。

主要作用
1、跟踪数据库的变化:可以离线地跟踪数据库的变化,而不会影响在线系统的性能
2、回退数据库的变化:回退特定的变化数据,减少Point-In-Time Recovery的执行
3、优化和扩容计划:可通过分析日志文件中的数据以分析数据的增长模式
4、确定数据库的逻辑损坏时间:准确定位操作执行的时间和SCN
5、确定事务级要执行的精细逻辑恢复操作,可以取得相应的UNDO操作
6、执行后续审计

二、使用前提
1、本地挖掘日志:归档(建议)+ 补充日志(必须)+ LogMiner工具(必须)
2、异机挖掘日志:参见22.2.1.2 Requirements
3、确定是否安装了LogMiner工具

desc DBMS_LOGMNR
desc DBMS_LOGMNR_D
或
select object_name from dba_objects where object_type='PACKAGE' and object_name LIKE '%LOGMNR%';
# 安装
@$ORACLE_HOME/rdbms/admin/dbmslm.sql
@$ORACLE_HOME/rdbms/admin/dbmslmd.sql

三、创建LogMiner用户(避免使用SYS用户进行日志挖掘)

## 非CDB数据库(11G以下)
#1. 创建LogMiner的用户角色roma_logminer_privs,并配置权限
create role roma_logminer_privs;
grant create session,
 execute_catalog_role,
 select any transaction,
 flashback any table,
 select any table,
 lock any table,
 select any dictionary to roma_logminer_privs;
grant select on SYSTEM.LOGMNR_COL$ to roma_logminer_privs;
grant select on SYSTEM.LOGMNR_OBJ$ to roma_logminer_privs;
grant select on SYSTEM.LOGMNR_USER$ to roma_logminer_privs;
grant select on SYSTEM.LOGMNR_UID$ to roma_logminer_privs;
grant select on V_$DATABASE to roma_logminer_privs;
grant select_catalog_role to roma_logminer_privs;
grant LOGMINING to roma_logminer_privs;# 仅当Oracle为12c版本时,才需要添加,否则删除此行内容。
#2. 创建LogMiner执行用户roma_logminer
create user roma_logminer identified by password default tablespace users;
grant roma_logminer_privs to roma_logminer;
alter user roma_logminer quota unlimited on users;
## CDB数据库(Oracle 12c以上开启了CDB)
#1. 创建LogMiner的用户角色c##roma_logminer_privs,并配置权限
create role c##roma_logminer_privs container=all;
grant create session,
 execute_catalog_role,
 select any transaction,
 flashback any table,
 select any table,
 lock any table,
 logmining,
 set container,
 select any dictionary to c##roma_logminer_privs container=all;
grant select on SYSTEM.LOGMNR_COL$ to c##roma_logminer_privs container=all;
grant select on SYSTEM.LOGMNR_OBJ$ to c##roma_logminer_privs container=all;
grant select on SYSTEM.LOGMNR_USER$ to c##roma_logminer_privs container=all;
grant select on SYSTEM.LOGMNR_UID$ to c##roma_logminer_privs container=all;
grant select on V_$DATABASE to c##roma_logminer_privs container=all;
grant select_catalog_role to c##roma_logminer_privs container=all;
#2. 创建LogMiner执行用户c##roma_logminer,在CDB中创建用户必须使用c##
create user c##roma_logminer identified by password default tablespace users container=all;
grant c##roma_logminer_privs to c##roma_logminer container=all;
alter user c##roma_logminer quota unlimited on users container=all;
sqlplus c##roma_logminer/password

四、基本步骤
1、设置提取字典的方式,有三种方式
1)DBMS_LOGMNR_D.STORE_IN_FLAT_FILE,将字典文件提取为一个平面文件或中间接口文件,和第2种使用redolog的方式相比,该方式占用更少的系统资源。

# Oracle 18C以后Oracle不再支持UTL_FILE_DIR参数
mkdir -p /home/oracle/logmnr
create directory utlfile as '/home/oracle/logmnr';
EXECUTE dbms_logmnr_d.build(dictionary_location=>'utlfile', 
                            dictionary_filename =>'dictionary.ora',
                            options =>dbms_logmnr_d.store_in_flat_file);
# Oracle 12.2及以前:
ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle/logmnr' SCOPE=SPFILE;
EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle/logmnr');

2)DBMS_LOGMNR_D.STORE_IN_REDO_LOGS,将数据字典提取到重做日志文件,数据库必须打开并且必须启用归档,当数据字典文件生成到日志文件过程中,任何的DDL操作是不允许的。 提取字典文件到日志文件中占用数据库资源,但是你把这个提取操作限制在非高峰时期,那么这就不是个问题了。而且该操作要比把字典生成到文本文件中要快。根据字典文件的大小的不同,可能该字典包含多个日志文件。加入日志已经归档,我们通过查询视图而得知字典文件的开始和结束日志序号。

EXECUTE DBMS_LOGMNR_D.BUILD( OPTIONS => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
# 查看挖掘生产的日志文件:
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN= 'YES';
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
# 建议定期备份该日志

3)DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG,使用当前的数据库的联机数据字典(只能分析当前数据库的重做日志文件,此时就不需要平面字典文件)。使用在线目录来分析在线重做日志文件,您可以使用它来分析存档的重做日志文件,如果您位于生成归档重做日志文件的同一系统上。联机目录包含了大量的数据库信息,也是一种最快的分析数据库日志的方法。因为DDL语句对数据库对象的改变在日志中只有很少的记录,因此日志挖掘中只提供少量的分析信息。使用联机目录分析,只能挖掘最近的数据库对象的信息,而对以前的老的对象,或者是归档日志中的对象目前已经不存在或者改变的,只有使用以前的方法去分析。使用前两种方法分析的前提是:含有以前提取的数据字典文件的备份。

# 使用该方式时,此执行步骤为第三步,参见案例《LogMiner应用:确定闪回时间》
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

2、指定或添加日志文件

# redo log
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/ORCL/redo01.log',options=>dbms_logmnr.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/ORCL/redo02.log',options=>dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/ORCL/redo03.log',options=>dbms_logmnr.ADDFILE);
# archive log
select name,sequence#,first_change#,to_char(first_time,'yyyy-mm-dd hh24:mi:ss'),dictionary_begin,dictionary_end from v$archived_log;
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(logfilename=>'/u01/app/oracle/fast_recovery_area/orcl/ORCL/archivelog/2021_03_24/o1_mf_1_14_j5on9n9w_.arc',options=>dbms_logmnr.new);

3、启动日志挖掘

EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '/home/oracle/logmnr/dictionary.ora');
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS);
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
# 如果在源数据库上进行log miner时,也可以通过starttime\endtime或startscn\endscn界定分析范围
# 并options选项加上DBMS_LOGMNR.CONTINUOUS_MINE,就不用指定具体的log文件,
# log miner会通过控制文件自动确定并添加要分析的log文件
EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTTIME => '09-11-2017 08:30:00', 
                                 ENDTIME => '09-11-2017 15:55:00', 
                                 OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);
EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTSCN => 3489525, 
                                 ENDSCN => 3489535, 
                                 OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);

4、查询 V$LOGMNR_CONTENTS 视图

select scn,operation,timestamp,sql_redo,sql_undo
  from v$logmnr_contents 
  Where seg_owner='HR' and seg_name ='EMPLOYEES';   # DDL对应没有undo

5、结束LogMiner会话

EXECUTE DBMS_LOGMNR.END_LOGMNR;

五、案例
1、准确定位操作执行的时间和SCN:如某用户错误更新表中的数据、表的误删除,可通过日志挖掘确定恢复的时间点,参见《LogMiner应用:确定闪回时间》。
2、可以查询某用户在指定时间段对指定表的操作。案例《LogMiner应用:确定闪回时间》中,在LogMiner挖掘的语句中,where条件变更一下即可实现该功能。
3、确定某个表收到最多的数据更新或插入:通过日志挖掘计算某表的访问统计。参见《LogMiner应用:表的访问统计》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O记DBA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值