摘要:Logminer是Oracle数据库一个功能强大、灵活、消耗资源少的重做日志挖掘工具。通过Logminer,即使是非原厂的Oracle DBA(数据库管理员)也能够准确还原数据库的所有历史操作。有了Logminer,对数据库的历史操作不再是无法重现的了。可以有效的恢复误操作导致的数据被修改、删除及插入等,并可以找到执行该操作的具体人员,修补漏洞、避免类似问题的发生。
关键词:数据库;日志挖掘;数据恢复
中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)07-1507-04
随着信息技术的发展,信息量也出现了爆炸式的增长。这些信息的组织、存储就变得越来越重要了。在过去的几十年,甲骨文(Oracle)公司的数据库产品,占据了最大的市场份额,成为各行各业信息存储最常用的数据库。就笔者所在的电信企业来讲,从核心数据库到边缘数据库,Oracle产品的占有率达到80%以上。
Oracle数据库是一个功能强大的产品。由于数据库产品本身就是为所有相关人员提供信息的一个产品,因此很多人都会有各种权限的数据库账户。权限管理的任何漏洞、任何人为的操作失误,都有可能会对数据库内信息造成不可恢复的损失。为保障Oracle数据库内数据的安全,甲骨文公司在设计Oracle数据库时,就提供了很多机制,比如审计、细粒度审计、闪回(含闪回查询、闪回表、闪回数据库等)、日志挖掘工具(Logminer)等。这其中,Logminer是历史最悠久的功能强大、灵活的操作历史记录查看工具,堪称Oracle数据库的“后悔药”。
1 Logminer简介
甲骨文公司在Oracle 8i 中首次提供了日志挖掘(以下简称Logminer)工具。使用Logminer工具,DBA可以对数据库的在线日志及归档日志进行分析,从而得到哪些人对数据库进行了哪种类型的操作、修改了哪些信息、信息修改前后的情况如何等信息。利用Logminer得到的信息,可以查看误操作修改前的数据详情、可以找到恶意修改数据的人的相关信息、也可以利用Logminer的信息,生成修复相关修复的SQL脚本。而在此之前,这些工作只能由甲骨文公司的工程师来完成,其他的DBA对此完全无能为力。
需要注意的是,Logminer需要运行在oracle 8.1及以上的数据库环境中,但是Logminer可以分析从Oracle 8.0开始的日志文件。
在Logminer诞生的13个年头里,甲骨文一共发布了4个主要的Oracle数据库版本: 8i、9i、10g、11g。在笔者所在的行业,oracle 8i在很早以前就已经全部升级到9i或10g了;而出于谨慎考虑,目前新上的数据库系统还以10g为主, 11g并没有开始大规模应用,因此本文主要讨论9i和10g版本的Logminer。
2 Logminer安装
Logminer的安装过程,实际上是在数据库里建立程序包和动态视图的过程。
安装Logminer需要运行两个SQL脚本,它们是:
1) $ORACLE_HOME/rdbms/admin/dbmslmd.sql
2) $ORACLE_HOME/rdbms/admin/dbmslm.sql
在这两个脚本运行过程中,会在数据库上建立dbms_logmnr和dbms_logmnr_d两个程序包。这两个程序包包含了Logminer配置和运行过程中需要的所有程序。
3 Logminer使用
Logminer具有很强的灵活性,不仅可以用来分析在线的重做日志,还能用来分析离线的重做日志;不仅可以分析数据库自己的重做日志,还能分析其他数据库的重做日志。
Logminer运行的标准结构如下:
源数据库(Source Database)是指需要分析历史数据的数据库,及归档日志的来源数据库;挖掘数据库(Mining database)是指运行Logminer程序的数据库。前边提到了,源数据库和挖掘数据库可以是同一个数据库,也可以是不同的两个数据库,但是挖掘数据库的版本不应该低于源数据库的版本。
3.1 运行环境准备
在使用Logminer以前,必须先启用Oracle数据库的补充日志(Supplemental log)和日志归档(archive)功能。
Oracle数据库运行时需要使用重做日志(redo log)来记录数据库中的操作,重做日志在提交和回滚事务时都使用到。但是重做日志一个更主要的作用是用户恢复数据库。每个运行的数据库都有若干组重做日志由数据进行循环使用。在每组重做日志文件重用前,是否对重做日志中的数据进行转储,就是数据库的两种运行模式:归档模式和非归档模式。因为Logminer需要使用到数据库的重做日志,因此,数据库需运行于归档模式。如果数据库处于非归档模式,使用如下步骤启用归档模式:
1) 设置归档目录参数
归档日志目录的设置方式有三种,下面是最常用的设置方式:
SQL>alter database set log_archive_dest=‘/arch/’scope=both;
2) 启动数据库到mount状态
SQL>startup mount
3) 执行启动归档SQL语句
SQL> alter database archivelog;
4) 打开数据库
SQL>alter database open;
通常oracle日志中记录的信息用来对数据库进行实例恢复和介质恢复是足够的。但是当使用在线日志和归档日志来的Logminer运行时,这些信息就显得捉襟见肘了。为确保这样的应用顺利运行,Oracle数据库需要在日志中记录更充分的信息。这就是补充日志。如果没有打开该功能,运行dbms_logmnr程序时会遇到ora-1354错误。
补充日志有两种模式,最小模式(minimal)和唯一关键字模式(identification key logging)。最小模式记录的信息已经足够给Logminer使用了。
执行如下语句打开数据库的最小模式的Supplemental Log功能:
SQL> alter database add supplemental log data;
3.2 生成Logminer的数据字典文件
在正式开始从重做日志挖掘数据之前,需要先从源数据库生成数据字典文件。从原理上讲,数据字典文件并不是数据挖掘工作所必须的。但是数据字典能提高挖掘结果的可读性。从下面的例子我们可以很容易理解数据字典的重要性。
有数据字典的挖掘结果:
INSERT INTO HR.JOBS
(JOB