Oracle未开启审计情况下追踪表变更记录

运维组的老大打电话说,他们发现有几万笔业务被重新推送了一遍,而且是第三次了,问题还是挺严重的,想要追踪是谁做的误操作,他们有时间段和涉及的表,问有没有办法追踪到。

数据库版本为10.2.0.4。首先想到的是审计功能,但是无奈数据库没有开审计。再次想到的是日志挖掘(LogMiner),但是不确定能不能找到对应操作的用户和主机。在QQ群里提出了这个问题,得到的答案是可以找到,同时也在官方文档中找到了v$logmnr_contents中对就的SESSION_INFO字段:

从上面给出的信息可以看出,可以跟踪到执行sql时对应的用户和主机信息。

下面做一个简单的测试,关于LogMiner的简单应用参考:http://hbxztc.blog.51cto.com/1587495/1871934

SQL> exec dbms_logmnr.add_logfile(LOGFILENAME=>‘/u01/app/oracle/flashback_area/MYDB/archivelog/2017_04_21/o1_mf_1_4_dhn2m29n_.arc‘,OPTIONS=>dbms_logmnr.new);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.start_logmnr(DICTFILENAME=>‘/home/oracle/logminer/dictionary.ora‘);

PL/SQL procedure successfully completed.

SQL> col table_name for a10 
SQL> col session_info for a180
SQL> set linesize 200
SQL> select table_name,session_info from v$logmnr_contents where table_name=‘T1‘ and rownum < 5;

TABLE_NAME SESSION_INFO
---------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T1	   login_username=ZX client_info= OS_username=oracle Machine_name=rhel5 OS_terminal=pts/0 OS_process_id=2596 [email protected] (TNS V1-V3)
T1	   login_username=ZX client_info= OS_username=oracle Machine_name=rhel5 OS_terminal=pts/0 OS_process_id=2596 [email protected] (TNS V1-V3)
T1	   login_username=ZX client_info= OS_username=oracle Machine_name=rhel5 OS_terminal=pts/0 OS_process_id=2596 OS_program_name=sqlp[email protected] (TNS V1-V3)
T1	   login_username=ZX client_info= OS_username=oracle Machine_name=rhel5 OS_terminal=pts/0 OS_process_id=2596 [email protected] (TNS V1-V3)

从上面的查询可以看出可以从日志中挖掘出用户和主机信息。

v$logmnr_contents:http://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_1154.htm#REFRN30132

LogMiner:http://docs.oracle.com/cd/B19306_01/server.102/b14215/logminer.htm#sthref1875

如果遇到USERNAME和SESSION_INFO为NULL或UNKNOWN参考如下:

Column USERNAME And SESSION_INFO Are UNKNOWN Or NULL In V$LOGMNR_CONTENTS (文档 ID 110301.1)

CAUSE

  1. If supplemental logging was not active at the time when the redo records were created, then LogMiner won‘t be able to obtain all the required information. The Oracle Database Utilities manual mentions:

    By default, Oracle Database does not provide any supplemental logging, which means that by default LogMiner is not usable. Therefore, you must enable at least minimal supplemental logging prior to generating log files which will be analyzed by LogMiner.

    So, we have to enable supplemental logging by using a SQL statement similar to the following:

    SQL> CONNECT / AS SYSDBA
    SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

    Then the information necessary to populate the USERNAME and SESSION_INFO columns will be stored in the redo stream.

  2. The redo stream does not contain the USERNAME and SESSION_INFO data for every transaction. This information is only stored for the first transaction executed in the user‘s session. So in order to be able to see this information in V$LOGMNR_CONTENTS, all the redo generated during the entire session must be added to the mining session. Should this not be done, then the USERNAME and SESSION_INFO columns will remain empty.
  3. LogMiner was first available in Oracle8i. If the COMPATIBLE instance parameter is set to a value lower than 8.1.0 you will not have access to its full functionality.
  4. In Oracle9i and lower releases of Oracle, the TRANSACTION_AUDITING instance parameter is set to TRUE by default. This causes the generation of a redo record containing the user logon name, username, session ID, and some operating system and client information. For each successive transaction in the session, Oracle will store only the session ID. These session IDs are linked back to the first record to retrieve user and session information.

    When TRANSACTION_AUDITING is set to FALSE, this redo record is not written and the user information is not available to LogMiner.

SOLUTION

This can result from your database parameter settings and also from the method you are using to mine redo logs using LogMiner.

  1. Ensure that database was in minimum supplemental logging at the time that the redo information was created:

    SQL> SELECT name, supplemental_log_data_min FROM v$database;

    NAME                           SUPPLEME
    ------------------------------ --------
    M10202WA                       YES

  2. Ensure that all archive redo logs containing the necessary redo information have been added to the LogMiner session.
  3. Ensure that the COMPATIBLE initialization parameter is set to 8.1.0 or higher.

    SQL> show parameter compatible

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ----------
    compatible                           string      10.2.0.2.0

  4. For Oracle8i and Oracle9i only: ensure that the TRANSACTION_AUDITING instance parameter is set to TRUE (default).

    SQL> show parameter transaction_auditing

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ----------
    transaction_auditing                 boolean     TRUE

时间: 2024-11-05 02:33:16

Oracle未开启审计情况下追踪表变更记录的相关文章

.net程序错误:BadImageFormatException....如果在安装32位Oracle客户端组件的情况下以64位模式运行

OracleClient 程序要连oracle数据库,提示如下错误: 数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题. 1.IIS部署时 网上搜索了一下,有各种办法,试过多安装了一个64位的oracle11g客户端,还是不行.后来想到是否是iis的问题,之前配置iis的时候好像碰到过32位64位的一个设置,看了以前的博客之后把应用程序池做了如下设置

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

从10G开始,Oracle提供了一个较为轻量级的客户包,叫做Instant Client. 将它安装好后,就不用再安装庞大的Oracle Client了. 这样一来,只要客户端下载Instant Client,直接解压,设置Path就ok了.具体设置如下:1.下载32位Oracle InstantClient 2.将Oracle InstantClient解压到某目录 3.打开PL/SQL,在perference里面设置OCI Library和Oracle_home,例子如下:        

webservice 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下运行,将出现此问题

最近做的项目中,应用服务器迁移到另外一台服务器,操作系统升级为win10,配置好IIS里的应用程序发布网站和Webservice网站后, 客户端程序调用Webservice出错: “尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Oracle 客户端组件的情况下运行,将出现此问题”. 写了个控制台程序,在本机上运行测试,还是出现这个问题: 最开始以为是oracle客户端的问题,重新安装另外一个版本的客户端,运行程序还是出现这个错误.

IIS发布后出现“如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”错误

VS2010运行程序没有任何问题,但是发布到IIS以后,连接数据库时报错:“尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题.”,解决方法为: IIS应用程序池---高级设置----启用32位应用程序设为“TRUE”----加载用户配置文件设为“TRUE”

如果在安装32位Oracle客户端组件的情况下以64位模式

1.Oracle客户端32位和64位都可以连接Oracle服务端.所以“如果在安装32位Oracle客户端组件的情况下以64位模式”这个错误,不是Oracle本身的问题. 2.错误原因:应用程序和本机安装的Oracle客户端版本不一致的问题: 即:应用程序:64位   本机安装的Oracle客户端为32位. 解决方法:本机安装Oracle客户端64位. 我的本机是win7-64位,vs2005是32位,但我的工程编译的是:anycpu,因为我本机操作系统是64位,因此anycpu编译出来就是64

Asp.net_解决vs运行报在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题的bug方法

环境:操作系统win10 64位,开发工具vs2015 社区版,服务器数据库oracle 11g 64位,本机客户端oracle client 11g 64位,PLSQL Developer 也是64位版 以上开发环境,PLSQL Developer可以正常连接服务器数据库,然而运行项目代码后报以下错误: “System.InvalidOperationException”类型的异常在 System.Data.OracleClient.dll 中发生,但未在用户代码中进行处理 其他信息: 尝试加

并发情况下锁表问题讨论

上周五的分享,主要针对项目中遇到的一些问题进行了技术讨论,以下是关于数据库锁问题的讨论.示例代码采用了JPA. 情境:车站售票系统,从A地到B地,还剩余5张车票.有30个用户同时购票,如何通过数据库锁解决并发问题. 新建t_ticket表,存入一条记录,起始地A,目的地B,剩余车票5,数据记录如下图: 首先,假设我们不进行并发控制,按照一般的逻辑来进行处理.开启30个线程模拟用户,根据起始地.目的地查询出数据库记录,获取amount字段的值,如果大于0,则将amount字段-1,再更新到数据库.

Oracle数据库访问其他用户下的表,不加表所属的用户名的实现方法

一. 问题: 如何实现在Oracle数据库中访问其他用户的表时不需加表所属的用户名 二. 举例: Oracle里面的用户A,要访问用户B的表需要带用户B的前缀,如访问用户B的 TEST表,需要这样访问 select * from B.TEST;现在就是问如何才能无需添加用户名的前缀. 三. 原因: 方便访问常用表 隐藏表的用户 四. 解决方案: 1. 创建同义词(最好的方式) 语法: CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] objec

sqlserver同步后在不重新初始化快照的情况下新增表

在已有事务复制中,时长需要新增表.索引,这些变更时不会同步到从库中.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这显然是无法在线上实践的方法.另一种方法是将新增的架构变更新建一个发布订阅,但会造成维护困难,增加出错的几率. 可以通过设置immediate_sync和allow_anonymous 来实现不重新初始化快照的前提下新增表. 先看着两个参数的含义: immediate_sync:指定每次运行快照代理时是否为发布创建同步文件. immediate_s