Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 认证 > Oracle认证 > 正文

深入分析Oracle数据库日志文件

时间:2015-06-11 22:49 来源:网络整理 作者:51ou.com 阅读:

深入分析Oracle数据库日志文件

发布者:csaicom893 来源:互联网 发布日期:2014年09月28日 文章评论 发表文章

  LogMiner只要在实例起来的情况下都可以运行LogMiner使用一个字典文件来实现Oracle内部对象名称的转换如果没有这个字典文件则直接显示内部对象编号例如我们执行下面的语句
 


  delete from CA where C = gototop and ROWID = AAABgAAFAAABQaAAH; 如果没有字典文件LogMiner分析出来的结果将是 delete from UNKNOWNOBJ# where COL = HEXTORAW(dadae) and ROWID = AAABgAAFAAABQaAAH;



如果想要使用字典文件数据库至少应该出于MOUNT状态然后执行dbms_logmnr_dbuild过程将数据字典信息提取到一个外部文件中下面是具体分析步骤

确认设置了初始化参数UTL_FILE_DIR并确认Oracle对改目录拥有读写权限然后启动实例示例中UTL_FILE_DIR参数如下

  SQL> show parameter utl NAME TYPE VALUE utl_file_dir string /data/cyx/logmnr



这个目录主要用于存放dbms_logmnr_dbuild过程所产生的字典信息文件如果不用这个则可以不设也就跳过下面一步

生成字典信息文件

  exec dbms_logmnr_dbuild(dictionary_filename => dicoradictionary_location => /data/cyx/logmnr);



其中dictionary_location指的是字典信息文件的存放位置它必须完全匹配UTL_FILE_DIR的值例如假设UTL_FILE_DIR=/data/cyx/logmnr/则上面这条语句会出错只因为UTL_FILE_DIR后面多了一个/而在很多其它地方对这一/是不敏感的

dictionary_filename指的是放于字典信息文件的名字可以任意取当然我们也可以不明确写出这两个选项即写成

  exec dbms_logmnr_dbuild(dicora/data/cyx/logmnr);

如果你第一步的参数没有设而直接开始这一步Oracle会报下面的错误

  ERROR at line : ORA: initialization parameter utl_file_dir is not set ORA: at SYSDBMS_LOGMNR_D line ORA: at SYSDBMS_LOGMNR_D line ORA: at line



需要注意的是在oracle for Windows版中会出现以下错误

  :: SQL> execute dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log); BEGIN dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log); END; * ERROR at line : ORA: Subscript outside of limit ORA: at SYSDBMS_LOGMNR_D line ORA: at line



解决办法

  编辑$ORACLE_HOME/rdbms/admindbmslmdsql文件把其中的 TYPE col_desc_array IS VARRAY() OF col_description; 改成 TYPE col_desc_array IS VARRAY() OF col_description;



保存文件然后执行一遍这个脚本

  :: SQL> @c:\oracle\ora\rdbms\admin\dbmslmdsql Package created Package body created No errors Grant succeeded



然后重新编译DBMS_LOGMNR_D包

  :: SQL> alter package DBMS_LOGMNR_D compile body; Package body altered 之后重新执行dbms_logmnr_dbuild即可 :: SQL> execute dbms_logmnr_dbuild(oradictorac:\oracle\admin\ora\log); PL/SQL procedure successfully completed



添加需要分析的日志文件

  SQL>exec dbms_logmnradd_logfile( logfilename=> /data/cyx/racarch/arch__arc options=>dbms_logmnrnew); PL/SQL procedure successfully completed



这里的options选项有三个参数可以用

NEW 表示创建一个新的日志文件列表

ADDFILE 表示向这个列表中添加日志文件如下面的例子

REMOVEFILE 和addfile相反

  SQL> exec dbms_logmnradd_logfile( logfilename=> /data/cyx/racarch/arch__arc options=>dbms_logmnraddfile); PL/SQL procedure successfully completed



当你添加了需要分析的日志文件后我们就可以让LogMiner开始分析了

  SQL> exec dbms_logmnrstart_logmnr(dictfilename=>/data/cyx/logmnr/dicora); PL/SQL procedure successfully completed



如果你没有使用字典信息文件(此时我们只需要启动实例就可以了)那么就不需要跟dictfilename参数

  SQL> exec dbms_logmnrstart_logmnr(); PL/SQL procedure successfully completed



当然dbms_logmnrstart_logmnr()过程还有其它几个用于定义分析日志时间/SCN窗口的参数它们分别是

STARTSCN / ENDSCN 定义分析的起始/结束SCN号

STARTTIME / ENDTIME 定义分析的起始/结束时间

例如下面的过程将只分析从 ::到 ::这段时间的日志

  SQL> exec dbms_logmnrstart_logmnr(dictfilename=>/data/cyx/logmnr/dicora starttime => ::endtime => ::); PL/SQL procedure successfully completed



上面过程第一行结尾的表示转行如果你在同一行则不需要我们可以看到有效日志的时间戳

  SQL> select distinct timestamp from v$logmnr_contents; TIMESTAMP :: ::



这里需要注意的是因为我之前已经设置NLS_DATE_FORMAT环境变量所以上面的日期可以直接按这个格式写就行了如果你没有设则需要使用to_date函数来转换一下

  SQL> !envgrep NLS NLS_LANG=american_americazhscgb NLS_DATE_FORMAT=YYYYMMDD HH:MI:SS ORA_NLS=/oracle/oracle/app/oracle/product//ocommon/nls/admin/data 使用to_date的格式如下 exec dbms_logmnrstart_logmnr(dictfilename=>/data/cyx/logmnr/dicora starttime => to_date( ::YYYYMMDD HH:MI:SS) endtime => to_date( ::YYYYMMDD HH:MI:SS));



STARTSCN 和ENDSCN参数使用方法类似

好了在上面的过程执行结束之后我们就可以通过访问与LogMiner相关的几个视图来提取我们需要的信息了其中在v$logmnr_logs中可以看到我们当前分析的日志列表如果数据库有两个实例(即OPS/RAC)在v$logmnr_logs中会有两个不同的THREAD_ID

而真正的分析结果是放在v$logmnr_contents中这里面有很多信息我们可以根据需要追踪我们感兴趣的信息后面我将单独列出来讲常见的追踪情形

全部结束之后我们可以执行dbms_logmnrend_logmnr过程退出LogMiner分析过程你也可以直接退出SQL*PLUS它会自动终止

  生成日志的数据库硬件平台和执行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) = UPDATE and 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;



好了到此为止这篇文章就要结束了如果读者朋友还有什么疑问可以登录我的个人网站()来获得最新消息也可以通过MSN()直接和我联系

六参考资料

Technical White Paper Oraclei LogMiner

Metalink文档How to Setup LogMiner(文档ID)

  

1 2

标签: 程序开发 Oracle

本文标题:深入分析Oracle数据库日志文件

本文链接:

更多>> IT认证学院:Oracle认证 栏目最近更新

  • · ORACLE Developer/2000 编程技巧六则
  • · OC4J 10g 10.1.3 数据源中的连接高速缓存
  • · 浅谈建立 Oracle数据库连接的两种要领
  • · 浅谈Oracle数据库多种安全性方法
  • · 把Oracle数据库移植到Microsoft SQL Server 7.0
  • · Oracle中只更新两张表对应数据的要领
  • · Oracle9i PL/SQL编程的经验小结
  • · 在Solaris 10 X86上安装Oracle 10g RAC详解 (1)
  • · Oracle 新手必读,不要错过噢
  • · Oracle运用 hash分区优化分析函数查询
  • · 小议在Oracle中索引的使用
  • · 三招让Oracle表列管理更加基本
  • 更多>> IT认证资料下载:Oracle认证资料下载 栏目最近更新

  • · Oracle备份和恢复
  • · oracle 10G plsql 错误手册
  • · 第一次优化 flash 抽奖
  • · Oracle DBA手记4:数据安全警示录.《Oracle.DBA手记》
  • · linux_oracle10g_安装视频教程.part5
  • · Oracle10g_rac
  • · Oracle Database 11g & MySQL 5.6开发手册
  • · Oracle IDM 中文资料
  • · oracle 10g r2 concepts双语版
  • · (1) 1.1 ORACLE数据库体系结构(1)
  • · Oracle数据库管理的入门教材
  • · 在LINUX下安装ORACLE10I
  • 感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《深入分析Oracle数据库日志文件》技术文章,《深入分析Oracle数据库日志文件》详细使用和说明,有时《深入分析Oracle数据库日志文件》可能不完善、敬请谅解!如果《深入分析Oracle数据库日志文件》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    上一篇:PL/Sql循序渐进全面学习教程
    下一篇:没有了
    推荐内容
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    验证码:点击我更换图片