四如何利用LogMiner分析Oracle的日志文件
虽然说LogMiner是Oraclei才推出来但我们同样可以用它来分析Oracle的日志文件只不过稍微麻烦了一点并且有一定的限制下面是具体做法
我们首先复制Oraclei的$ORACLE_HOME/rdbms/admin/dbmslmdsql脚本到Oracle数据库所在主机的同样目录这个脚本用于创建dbms_logmnr_d包(注意Oraclei中还将创建dbms_logmnr包)如果是脚本名字为dbmslogmnrdsql然后在Oracle的数据库上运行这个脚本之后使用dbms_logmnr_dbuild过程创建字典信息文件现在我们就可以把Oracle的归档日志连同这个字典信息文件复制到Oraclei数据库所在的主机上之后在Oraclei数据库中从上面分析过程的第三步开始分析Oracle的日志不过
dbms_logmnrstart_logmnr()中使用的是Oracle的字典信息文件
按照我前面所说的那样如果不是字典文件我们则可以直接将Oracle的归档日志复制到Oraclei数据库所在主机然后对它进行分析
其实这里涉及到了一个跨平台使用LogMiner的问题笔者做过试验也可以在Oraclei中来分析Oraclei的日志但这些都是有所限制的主要表现在
LogMiner所使用的字典文件必须和所分析的日志文件是同一个数据库所产生的并且该数据库的字符集应和执行LogMiner数据库的相同这很好理解如果不是同一个数据库所产生就不存在对应关系了
生成日志的数据库硬件平台和执行LogMiner数据库的硬件平台要求一致操作系统版本可以不一致笔者做试验时(如果读者有兴趣可以到我网站上下载试验全过程因为太长就不放在这里了)所用的两个数据库操作系统都是Tru UNIX但一个是 VA另一个则是VF如果操作系统不一致则会出现下面的错误
ORA: file /data/cyx/logmnr/arch__arc cannot be opened
ORA: cannot open archived log /data/cyx/logmnr/arch__arc
ORA: skgfifi: file header information is invalid
ORA: at SYSDBMS_LOGMNR line
ORA: at line
五分析v$logmnr_contents
前面我们已经知道了LogMiner的分析结果是放在v$logmnr_contents中这里面有很多信息我们可以根据需要追蹤我们感兴趣的信息那么我们通常感兴趣的有哪些呢?
追蹤数据库结构变化情况即DDL操作如前所述这个只有Oraclei才支持
SQL> select timestampsql_redo from v$logmnr_contents
where upper(sql_redo) like %CREATE%;
TIMESTAMP
SQL_REDO
::
create table t (c number);
追蹤用户误操作或恶意操作
例如我们现实中有这样需求有一次我们发现一位员工通过程序修改了业务数据库信息把部分电话的收费类型改成免费了现在就要求我们从数据库中查出到底是谁干的这件事?怎么查?LogMiner提供了我们分析日志文件的手段其中v$logmnr_contents的SESSION_INFO列包含了下面的信息
login_username=NEW_
client_info= OS_username=oracle Machine_name=phoenix
OS_terminal=ttyp OS_process_id= OS_program name=sqlplus@phoenix
(TNS VV)
虽然其中信息已经很多了但在我们的业务数据库中程序是通过相同的login_username登录数据库的这样单从上面的信息是很难判断的
不过我们注意到因为公司应用服务器不是每个人都有权限在上面写程序的一般恶意程序都是直接通过他自己的PC连到数据库的这就需要一个准确的定位IP追蹤是我们首先想到的并且也满足我们的实际要求因为公司内部IP地址分配是统一管理的能追蹤到IP地址我们就可以准确定位了但从面的SESSION_INFO中我们并不能直接看到IP不过我们还是有办法的因为这个SESSION_INFO里面的内容其实是日志从V$SESSION视图里提取的我们可以在生产数据库中创建一个追蹤客户端IP地址的触发器
create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_infoset_client_info(sys_context(userenv ip_address));
end;
/
现在我们就可以在V$SESSION视图的CLIENT_INFO列中看到新登录的客户端IP地址了那么上面的提出的问题就可以迎刃而解了假如被更新的表名为HMLX我们就可以通过下面的SQL来找到所需信息
SQL > select session_info sql_redo from v$logmnr_contents
where upper(operation) = UPDATEand upper(sql_redo) like %HMLX%
/
SESSION_INFO
SQL_REDO
login_username=C client_info= OS_username=szxjschengyx Machine_name
=GDTEL\SZXJSCHENGYX
update CHMLX set NAME = free where NAME = and ROWID = AAABhTAA
FAAABRaAAE;