ITPUB论坛-专业的IT技术社区

标题: 除了audit以外,还有其他方法来监控sql是哪些用户执行的? [打印本页]

作者: ahlu    时间: 2006-6-23 16:11
标题: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?
除了audit以外,还有其他方法来监控sql是哪些用户执行的?
作者: lakher    时间: 2006-6-23 16:16
triger
作者: hrb_qiuyb    时间: 2006-6-23 16:42
标题: Re: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?
最初由 ahlu 发布
[B]除了audit以外,还有其他方法来监控sql是哪些用户执行的? [/B]


实话实说,Oracle这方面的功能真是很弱的,audit只能简单的记录一下在某个时点一个用户执行哪种操作了,或用到什么真的权限了等,但整个该用户的语句是没有的。所以是一个很弱的audit。

triger倒是可以完成一定的功能,但总不会对每个object都加一个triger吧,同时对于负载很大的系统这也是一个性能的问题。

用logminer分析归档日志是一个方法,但以logminer的速度如果系统不大还是可以考虑的,还要要求你的系统是开归档的。

个人认为理想的状态应该是这样的:可以在audit上加上一个特别的选项,打开这个选项,并做适当的配置后,被audit用户的所有语句或部分类别的语句可以被记录在某个表中。期待着Oracle的改善吧。

最近这半年被内控折磨着,相信这波及了IT界的大部分人士。我目前对后台要做dml操作的监测的做法是:用的时侯开放一个专门的用户,对相关的session做10046。
作者: Toms_zhang    时间: 2006-6-23 16:55
市场上有专门的监控软件。不过要花银子的。

对关键业务表, 比如DML操作较少的字典信息表,最方便的就是用个trigger了。实现起来容易些!

用logminer太不方便了,经常是当错误发现时,归档已经转移到磁带上了,分析起来太麻烦了!
作者: caoliwei    时间: 2006-6-23 16:56
标题: Re: Re: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?
最初由 hrb_qiuyb 发布
[B]

实话实说,Oracle这方面的功能真是很弱的,audit只能简单的记录一下在某个时点一个用户执行哪种操作了,或用到什么真的权限了等,但整个该用户的语句是没有的。所以是一个很弱的audit。

triger倒是可以完成一定的功能,但总不会对每个object都加一个triger吧,同时对于负载很大的系统这也是一个性能的问题。

用logminer分析归档日志是一个方法,但以logminer的速度如果系统不大还是可以考虑的,还要要求你的系统是开归档的。

个人认为理想的状态应该是这样的:可以在audit上加上一个特别的选项,打开这个选项,并做适当的配置后,被audit用户的所有语句或部分类别的语句可以被记录在某个表中。期待着Oracle的改善吧。

最近这半年被内控折磨着,相信这波及了IT界的大部分人士。我目前对后台要做dml操作的监测的做法是:用的时侯开放一个专门的用户,对相关的session做10046。 [/B]



sox
作者: ahlu    时间: 2006-6-23 17:03
标题: 呵呵,大家都遇到这个问题!
我要监控的是应用帐户,所以audit的可能性不大,量太大了,又不能对v$session做trigger,比较难啊!如果能找到v$sql和v$session之间的关系,通过定时查询记录也可起到监控作用,但是v$session中的sql_address只记录当前的sql,如update后commit,他只记录commit,而update语句就被覆盖了,这样也没有什么意义了,而v$sql又不能显示该sql最近谁再用,埃...
作者: ahlu    时间: 2006-6-23 17:11
标题: Logmnr并不能记录sql是谁操作的,而且logmnr中相关sql的语句形式也改变了
trigger记录相关表,但如何记录对该条数据操作的具体session呢?我们现在的问题是,防止其他人盗用别人帐户对数据库进行操作,所以要通过v$session来记录主机名等信息
作者: ahlu    时间: 2006-6-23 17:19
标题: Toms_zhang
能具体推荐一个专门的监控软件吗?
作者: h1yn    时间: 2006-6-23 18:31
可以写一个系统的triger
作者: cyr1974    时间: 2006-6-23 18:37
不太好实现,监控软件也有缺陷
作者: lakher    时间: 2006-6-23 19:22
可以建立对一些关键、重要表数据dml操作的triger,记录到一张表中,保存一定的时间可查询。
作者: ahlu    时间: 2006-6-23 20:16
标题: 大家可能还不明白!
不管对重要表还是对系统做trigger,都无法记录是谁在做该操作?
作者: ahlu    时间: 2006-6-25 10:53
标题: 谁有更好的主意吗?
hello
作者: cjf107    时间: 2006-6-25 10:59
看样子是难了。问问oracle有没有别的方法?
作者: lakher    时间: 2006-6-25 22:53
标题: Re: 大家可能还不明白!
最初由 ahlu 发布
[B]不管对重要表还是对系统做trigger,都无法记录是谁在做该操作? [/B]


可以阿,我们这一直用着呢,比如,oracle哪个用户修改了一张表的数据,增加、删除、修改,都能记录下来,同时把使用此用户的计算机都记录下来了,防止应用用户修改数据抵赖。
作者: ahlu    时间: 2006-6-26 11:07
标题: 楼上的可能是从应用软件内部来实现的吧
楼上的可能是从应用软件内部来实现的吧?数据库层面能实现吗?
作者: hrb_qiuyb    时间: 2006-6-26 11:28
标题: Re: 楼上的可能是从应用软件内部来实现的吧
最初由 ahlu 发布
[B]楼上的可能是从应用软件内部来实现的吧?数据库层面能实现吗? [/B]


如果要监测的表没几张,同时这个表的dml操作不是很大,加trigger在数据库层面是可以实现的。如果这个表的dml量很大,那么这个trigger 就是你性能的瓶颈,所以要合理考虑后再使用。我认为用其监测参数表还是不错的。

如下给你一个以trigger监测关銉表的例子:

[php]
CREATE OR REPLACE TRIGGER "QIUYB".TRA_TP_TRUNK
  AFTER INSERT OR UPDATE OR DELETE ON TP_TRUNK
  FOR EACH ROW
BEGIN
  IF INSERTING THEN
    INSERT INTO QIUYB_OPERATE_HISTORY
    VALUES
      ('tp_trunk',
       SYS_CONTEXT('userenv', 'session_user'),
       SYS_CONTEXT('userenv', 'ip_address'),
       SYS_CONTEXT('userenv', 'host'),
       TO_CHAR(SYSDATE, 'YYYYMMDDHHMMSS'),
       'INSERT',
       :NEW.SWITCH_CODE || ',' || :NEW.TRUNK_CODE || ',' || :NEW.TRUNK_SIDE || ',' ||
       :NEW.TRUNK_TYPE || ',' || :NEW.START_DATE || ',' || :NEW.END_DATE || ',' ||
       :NEW.COMMENTS);
  
  ELSIF UPDATING THEN
    INSERT INTO QIUYB_OPERATE_HISTORY
    VALUES
      ('tp_trunk',
       SYS_CONTEXT('userenv', 'session_user'),
       SYS_CONTEXT('userenv', 'ip_address'),
       SYS_CONTEXT('userenv', 'host'),
       TO_CHAR(SYSDATE, 'YYYYMMDDHHMMSS'),
       'UPDATE',
       :OLD.SWITCH_CODE || ',' || :OLD.TRUNK_CODE || ',' || :OLD.TRUNK_SIDE || ',' ||
       :OLD.TRUNK_TYPE || ',' || :OLD.START_DATE || ',' || :OLD.END_DATE || ',' ||
       :OLD.COMMENTS || '->' || :NEW.SWITCH_CODE || ',' || :NEW.TRUNK_CODE || ',' ||
       :NEW.TRUNK_SIDE || ',' || :NEW.TRUNK_TYPE || ',' || :NEW.START_DATE || ',' ||
       :NEW.END_DATE || ',' || :NEW.COMMENTS);
  ELSE
    INSERT INTO QIUYB_OPERATE_HISTORY
    VALUES
      ('tp_trunk',
       SYS_CONTEXT('userenv', 'session_user'),
       SYS_CONTEXT('userenv', 'ip_address'),
       SYS_CONTEXT('userenv', 'host'),
       TO_CHAR(SYSDATE, 'YYYYMMDDHHMMSS'),
       'DELETE',
       :OLD.SWITCH_CODE || ',' || :OLD.TRUNK_CODE || ',' || :OLD.TRUNK_SIDE || ',' ||
       :OLD.TRUNK_TYPE || ',' || :OLD.START_DATE || ',' || :OLD.END_DATE || ',' ||
       :OLD.COMMENTS);
  
  END IF;

END TRA_TP_TRUNK;

sssss
[/php]
作者: ahlu    时间: 2006-6-26 11:39
标题: 非常感谢
非常感谢
作者: ZALBB    时间: 2006-6-26 14:56
应该可以从监听器这个方向考虑。我测试过记录 发到数据库上的每条SQL语句。
但没有把SQL语句与执行的机器联系起来。但我想实际上监听器这一端应该可以实现
此功能。
作者: ahlu    时间: 2006-6-26 16:49
标题: 监听器?
楼上可以具体说一下思路吗?
作者: ahlu    时间: 2006-6-27 11:18
标题: hello
应该可以从监听器这个方向考虑?能否具体点!
作者: ZALBB    时间: 2006-6-27 15:01
标题: Re: hello
最初由 ahlu 发布
[B]应该可以从监听器这个方向考虑?能否具体点! [/B]


抱歉,当时是在8I的环境下作的测试,好像是在SQLNET里
设置了这几个参数 TRACE_LEVEL_CLIENT,之后
sqlnet 会输出发给监听器的sql到一个文件里, 此时分析
该文件,即可找出SQL。

以上思路是没问题的,但具体是哪几个参数,我忘记了。
另外,如何把SQL与客户端关联,当时没想过。




欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) Powered by Discuz! X3.2