作为Oracle DBA,我们有时候需要追踪数据误删除或用户的恶意操作情况,此时我们不仅需要查出执行这些操作的数据库账号,还需要知道操作是由哪台客户端(IP 地址等)发出的。针对这些问题,一个最有效实用而又低成本的方法就是分析Oracle 数据库的日志文件。本文将就Oracle 日志分析技术做深入探讨。 一、如何分析即 LogMiner解释 从目前来看,分析Oracle 日志的唯一方法就是使用Oracle 公司提供的LogMiner 来进行, Oracle 数据库的所有更改都记录在日志中,但是原始的日志信息我们根本无法看懂,而LogMiner 就是让我们看懂日志信息的工具。从这一点上看,它和 tkprof 差不多,一个是用来分析日志信息,一个则是格式化跟踪文件。通过对日志的分析我们可以实现下面的目的: 1、查明数据库的逻辑更改; 2、侦察并更正用户的误操作; 3、执行事后审计; 4、执行变化分析。 不仅如此,日志中记录的信息还包括:数据库的更改历史、更改类型(INSERT、UPDATE、DELETE、DDL 等)、更改对应的SCN 号、以及执行这些操作的用户信息等,LogMiner在分析日志时,将重构等价的SQL 语句和 UNDO 语句(分别记录在V$LOGMNR_CONTENTS 视图的SQL_REDO 和 SQL_UNDO 中)。这里需要注意的是等价语句,而并非原始 SQL 语句,例如:我们最初执行的是“delete a where c1 <>'cyx';”,而LogMiner 重构的是等价的6 条 DELETE 语句。所以我们应该意识到V$LOGMNR_CONTENTS 视图中显示的并非是原版的现实,从数据库角度来讲这是很容易理解的,它记录的是元操作,因为同样是“delete a where c1 <>'cyx';”语句,在不同的环境中,实际删除的记录数可能各不相同,因此记录这样的语句实际上并没有什么实际意义,LogMiner 重构的是在实际情况下转化成元操作的多个单条语句。 另外由于Oracle 重做日志中记录的并非原始的对象(如表以及其中的列)名称,而只是它们在Oracle 数据库中的内部编号(对于表来说是它们在数据库中的对象ID,而对于表中的列来说,对应的则是该列在表中的排列序号:COL 1, COL 2 等),因此为了使LogMiner重构出的SQL 语句易于识别,我们需要将这些编号转化成相应的名称,这就需要用到数据字典(也就说LogMiner 本身是可以不用数据字典的,详见下面的分析过程),LogMiner利用DBMS_LOGMNR_D.BUILD()过程来提取数据字典信息。 LogMiner 包含两个PL/SQL 包和几个视图: 1、dbms_logmnr_d 包,这个包...