Oracle 11G CRUD操作监控单个表

Oracle 11G CRUD操作监控单个表

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

前言:
    线上oracle数据库有张表的数据有些乱,依据应用db的log和应用的log也没有检查出来谁改动了。所以决定把这张单表做个具体的insert、update、delete监控。



一:使用数据库自带的审计功能
1,查看审计功能是否启动

SQL> show parameter audit                                                                                                                                                                      







NAME     TYPE VALUE


———————————— ———– ——————————


audit_file_dest     string /oracle/app/oracle/admin/power


des/adump


audit_sys_operations     boolean FALSE


audit_syslog_level     string


audit_trail     string NONE


SQL> 


没有开启审计功能。须要自己去开启一下。






2,开启审计功能

须要用sysdba,注意audit_trail要为DB_EXTENDED才记录运行的具体语句…


alter system set audit_sys_operations=TRUE scope=spfile;


SQL> alter system set audit_sys_operations=TRUE scope=spfile;                                                                                                                                  


                                                                                                                                                                                               


System altered.






SQL>



再次查看审计功能是否启动


SQL> show parameter audit;                                                                                                                                                                     






NAME     TYPE VALUE


———————————— ———– ——————————


audit_file_dest     string /oracle/app/oracle/admin/power


des/adump


audit_sys_operations     boolean FALSE


audit_syslog_level     string


audit_trail     string NONE


SQL>          






须要重新启动实例才干看到状态。






3。关闭审计功能

SQL> alter system set audit_trail = none scope=spfile;






4,针对某张表的审计功能

AUDIT UPDATE,DELETE,INSERT ON T_TEST by access;






5。对该张表进行各种DML操作測试





6,查询审计的信息

select EXTENDED_TIMESTAMP,SESSION_ID,SQL_TEXT from DBA_COMMON_AUDIT_TRAIL ORDER BY EXTENDED_TIMESTAMP DESC;






二,採用触发器
        看到线上数据库load比曾经添加蛮多的。为了单张表的监控开启审计比較消耗资源。有些不划算。所以能够採用第二种办法来做。就是在表上建立触发器。



1。先建立建立測试表:
查看已经建立的表 aaa_test与trig_sql。
SQL> describe plas.aaa_test;                                                                                                                                                                   
 Name   Null?    Type
 —————————————– ——– —————————-
 ID    NUMBER
 NAME    VARCHAR2(100)
 LOGIN_TIME    DATE


SQL>
SQL> describe plas.trig_sql;                                                                                                                                                                   
 Name   Null?    Type
 —————————————– ——– —————————-
 LT    DATE
 SID    NUMBER
 SERIAL#    NUMBER
 USERNAME    VARCHAR2(30)
 OSUSER    VARCHAR2(64)
 MACHINE    VARCHAR2(32)
 TERMINAL    VARCHAR2(16)
 PROGRAM    VARCHAR2(64)
 SQLTEXT    VARCHAR2(2000)
 STATUS    VARCHAR2(30)
 CLIENT_IP    VARCHAR2(60)


SQL> 


2,而且在 trig_sql表上面加入索引:
 create index  idx_time on plas.trig_sql (LT);
  
3。建立触发器
create or replace trigger pri_test
  after insert or update or delete on plas.aaa_test
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF inserting THEN
    INSERT INTO plas.trig_sql
        select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
               s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
               ‘INSERT’,
              sys_context(‘userenv’,’ip_address’)
          from v$sql q, v$session s
         where s.audsid=(select userenv(‘SESSIONID’) from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF deleting  then
      INSERT INTO plas.trig_sql
           select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                       s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                       ‘DELETE’,
                       sys_context(‘userenv’,’ip_address’)
             from v$sql q, v$session s
            where s.audsid=(select userenv(‘SESSIONID’) from dual)
             and s.prev_sql_addr=q.address
             AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF updating then
    INSERT INTO plas.trig_sql
         select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                     s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                     ‘UPDATE’,
                     sys_context(‘userenv’,’ip_address’)
           from v$sql q, v$session s
          where s.audsid=(select userenv(‘SESSIONID’) from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
   END IF;
END;

4,開始进行数据操作測试:
           insert into plas.aaa_test1 select 2,’tom’,sysdate from dual;
           update plas.aaa_test1 a set a.name=’tom_up’ where a.id=2;
  update plas.aaa_test a set a.name=’tom_up1′ where a.id=1;
……
           commit;


5,去查看表记录,会发现例如以下
SQL> select * from plas.trig_sql;
LT                 SID    SERIAL# USERNAME                       OSUSER                                                           MACHINE                          TERMINAL         PROGRAM                                                          SQLTEXT                                                                          STATUS                         CLIENT_IP
———– ———- ———- —————————— —————————————————————- ——————————– —————- —————————————————————- ——————————————————————————– —————————— ————————————————————
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     DELETE                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1352      40155 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     UPDATE                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     UPDATE                         192.168.170.110
2014/10/29          25      39527 SYS                            oracle                                                           localhost.localdomain            pts/1            sqlplus@localhost.localdomain (TNS V1-V3)                        update plas.aaa_test a set a.name=’tom_update’ where id=2                        UPDATE                         
2014/10/29          25      39527 SYS                            oracle                                                           localhost.localdomain            pts/1            sqlplus@localhost.localdomain (TNS V1-V3)                        update plas.aaa_test a set a.name=’tom_update3′ where id=3                       UPDATE                         
8 rows selected


SQL> 


PS:看到SQLTEXT有些都为   begin :id := sys.dbms_transaction.local_transaction_id; end; 的,是由于我运行的insert、delete、update语句在plsqldev.exe客户端运行的,所以没有记录下运行的sql语句。而有些通过sqlplus@localhost.localdomain (TNS V1-V3)客户端连接运行的,会记录下运行过的update语句。


6。统计下当前都有哪些用户以及ip运行了dml操作。


SQL> select username,client_ip from plas.trig_sql group by username,client_ip;
USERNAME                       CLIENT_IP
—————————— ————————————————————
PLAS                           192.168.170.180
DESKER                         192.168.170.110


SQL> 


Oracle 11G CRUD操作监控单个表—————————————————————————————————————-

<版权全部,文章同意转载。但必须以链接方式注明源地址,否则追究法律责任!>
原博客地址:   http://blog.itpub.net/26230597/viewspace-1312184/
原作者:黄杉 (mchdba)

Oracle 11G CRUD操作监控单个表—————————————————————————————————————-


參考文章:
http://blog.csdn.net/edcvf3/article/details/7865688

http://blog.itpub.net/29320885/viewspace-1158915/


版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117689.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rabbitmq集群搭建_mongodb集群搭建

    rabbitmq集群搭建_mongodb集群搭建先来介绍一下RabbitMQ集群RabbitMQ集群有两种模式,一种是普通模式,即默认的集群模式,另外一种为镜像模式,可以把队列做成镜像队列我们在学习两种模式之前,先来了解下一些关于RabbitMQ集群的概念元数据:包括队列元数据,交换器元数据,交换器元数据,vhost元数据(1)队列元数据:队列名称和它的属性;(2)交换器元数据:交换器名称、类型和属性;(3)绑定元数据:一张简…

    2025年9月5日
    6
  • 池化层的作用[通俗易懂]

    maxpooling是CNN当中的最大值池化操作,其实用法和卷积很类似tf.nn.max_pool(value,ksize,strides,padding,name=None)参数是四个,和卷积很类似:第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是featuremap,依然是[batch,height,width,channels]这样的shape第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1,height,width,1],

    2022年4月10日
    51
  • idea中类中显示成员变量和方法

    idea中类中显示成员变量和方法idea默认是没有显示一个类中的方法和成员变量的。通过勾选Show Members就会显示类中方法。

    2022年6月13日
    117
  • Java Double转Bigdecimal丢失精度原因学习

    Java Double转Bigdecimal丢失精度原因学习记录学习Double转Bigdecimal丢失精度的原因注意事项:不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值实际上并不真的等于0.1如该方式将0.1转换为Bigdecimal得到的结果是0.1000000000000000055511151231257827021181583404541015625这是为什么呢,以往只是知道结论知道不能这么用,也大概知道是因为do

    2022年6月4日
    33
  • jupyter的代码能用pycharm运行吗_pycharm project interpreter

    jupyter的代码能用pycharm运行吗_pycharm project interpreter最近在学CS231n的课程,打算把作业做一下。由于…

    2022年8月29日
    4
  • Linux文件系统目录结构详解

    Linux文件系统目录结构详解引言对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识。在Linux或Unix操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。linux

    2022年5月13日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号