D盘

workspace
posts - 165, comments - 53, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
标题: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-23 16:11 
除了audit以外,还有其他方法来监控sql是哪些用户执行的?

除了audit以外,还有其他方法来监控sql是哪些用户执行的?


顶部
离线 lakher
高级会员


精华贴数 0
个人空间 0
技术积分 3283 (408)
社区积分 156 (2483)
注册日期 2003-12-31
论坛徽章:6
参与2007年甲骨文全球大会(中国上海)纪念 会员2007贡献徽章 生肖徽章2007版:鸡      
           

 

发表于 2006-6-23 16:16 
triger


__________________
lakher的个人网站-------------------------------------------------------http://www.lakher.com/-------------------------------------------------------msn:lakher#hotmail.com维修IBM 小型机电源
顶部
离线 hrb_qiuyb
397分


来自 哈尔滨
精华贴数 4
个人空间 9338
技术积分 6516 (181)
社区积分 73 (3748)
注册日期 2002-4-2
论坛徽章:21
现任管理团队成员 ITPUB元老 2008北京奥运纪念徽章:棒球 2008年新春纪念徽章    
           

 

发表于 2006-6-23 16:42 
Re: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?



QUOTE:
最初由 ahlu 发布
除了audit以外,还有其他方法来监控sql是哪些用户执行的?

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

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

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

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

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


__________________
看来是老喽,对技术不狂热了。。

俺的几个地:
我的Otn|我的IT168专栏|我的旧Blog|我的新Blog
顶部
离线 Toms_zhang
会员


精华贴数 1
个人空间 0
技术积分 16423 (58)
社区积分 2027 (532)
注册日期 2002-8-31
论坛徽章:44
现任管理团队成员 管理团队2007贡献徽章 会员2007贡献徽章 2008年新春纪念徽章 ITPUB新首页上线纪念徽章  
           

 

发表于 2006-6-23 16:55 
市场上有专门的监控软件。不过要花银子的。

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

用logminer太不方便了,经常是当错误发现时,归档已经转移到磁带上了,分析起来太麻烦了!


__________________
顶部
离线 caoliwei
懒猫传说



精华贴数 0
个人空间 0
技术积分 5923 (209)
社区积分 141 (2641)
注册日期 2004-9-12
论坛徽章:12
           
           

 

发表于 2006-6-23 16:56 
Re: Re: 除了audit以外,还有其他方法来监控sql是哪些用户执行的?



QUOTE:
最初由 hrb_qiuyb 发布


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

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

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

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

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


sox


__________________
我是懒猫猫申明我不是老大我是学习来的有错给我指出来谢谢
顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 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
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-23 17:11 
Logmnr并不能记录sql是谁操作的,而且logmnr中相关sql的语句形式也改变了

trigger记录相关表,但如何记录对该条数据操作的具体session呢?我们现在的问题是,防止其他人盗用别人帐户对数据库进行操作,所以要通过v$session来记录主机名等信息


顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-23 17:19 
Toms_zhang

能具体推荐一个专门的监控软件吗?


顶部
离线 h1yn
随风漂流



精华贴数 0
个人空间 0
技术积分 1808 (841)
社区积分 80 (3590)
注册日期 2004-10-20
论坛徽章:1
授权会员          
           

 

发表于 2006-6-23 18:31 
可以写一个系统的triger


__________________
想让自己走的更远一点。。。hou_younan#hotmail.com提供BASIS, FI/CO, PP, MM.SD 服务
顶部
离线 cyr1974
淡泊明志 宁静志远


精华贴数 2
个人空间 0
技术积分 6624 (179)
社区积分 821 (957)
注册日期 2003-2-12
论坛徽章:7
ITPUB元老 会员2007贡献徽章 生肖徽章2007版:鼠 生肖徽章2007版:猴    
           

 

发表于 2006-6-23 18:37 
不太好实现,监控软件也有缺陷


__________________
cyongrui@hotmail.com业余台球爱好者互相交流 共同进步


离线 lakher
高级会员


精华贴数 0
个人空间 0
技术积分 3283 (408)
社区积分 156 (2483)
注册日期 2003-12-31
论坛徽章:6
参与2007年甲骨文全球大会(中国上海)纪念 会员2007贡献徽章 生肖徽章2007版:鸡      
           

 

发表于 2006-6-23 19:22 
可以建立对一些关键、重要表数据dml操作的triger,记录到一张表中,保存一定的时间可查询。


__________________
lakher的个人网站-------------------------------------------------------http://www.lakher.com/-------------------------------------------------------msn:lakher#hotmail.com维修IBM 小型机电源
顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-23 20:16 
大家可能还不明白!

不管对重要表还是对系统做trigger,都无法记录是谁在做该操作?


顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-25 10:53 
谁有更好的主意吗?

hello


顶部
离线 cjf107
高级会员



精华贴数 0
个人空间 0
技术积分 12735 (82)
社区积分 25380 (41)
注册日期 2003-11-11
论坛徽章:56
欧洲冠军杯纪念徽章 NBA常规赛纪念章 金色在线徽章 每周论坛发贴之星 生肖徽章2007版:兔 每日论坛发贴之星
2008年新春纪念徽章 生肖徽章2007版:鼠        

 

发表于 2006-6-25 10:59 
看样子是难了。问问oracle有没有别的方法?


__________________
我懒但想学习
顶部
离线 lakher
高级会员


精华贴数 0
个人空间 0
技术积分 3283 (408)
社区积分 156 (2483)
注册日期 2003-12-31
论坛徽章:6
参与2007年甲骨文全球大会(中国上海)纪念 会员2007贡献徽章 生肖徽章2007版:鸡      
           

 

发表于 2006-6-25 22:53 
Re: 大家可能还不明白!



QUOTE:
最初由 ahlu 发布
不管对重要表还是对系统做trigger,都无法记录是谁在做该操作?

可以阿,我们这一直用着呢,比如,oracle哪个用户修改了一张表的数据,增加、删除、修改,都能记录下来,同时把使用此用户的计算机都记录下来了,防止应用用户修改数据抵赖。


__________________
lakher的个人网站-------------------------------------------------------http://www.lakher.com/-------------------------------------------------------msn:lakher#hotmail.com维修IBM 小型机电源
顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-26 11:07 
楼上的可能是从应用软件内部来实现的吧

楼上的可能是从应用软件内部来实现的吧?数据库层面能实现吗?


顶部
离线 hrb_qiuyb
397分


来自 哈尔滨
精华贴数 4
个人空间 9338
技术积分 6516 (181)
社区积分 73 (3748)
注册日期 2002-4-2
论坛徽章:21
现任管理团队成员 ITPUB元老 2008北京奥运纪念徽章:棒球 2008年新春纪念徽章    
           

 

发表于 2006-6-26 11:28 
Re: 楼上的可能是从应用软件内部来实现的吧



QUOTE:
最初由 ahlu 发布
楼上的可能是从应用软件内部来实现的吧?数据库层面能实现吗?

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

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


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;



__________________
看来是老喽,对技术不狂热了。。

俺的几个地:
我的Otn|我的IT168专栏|我的旧Blog|我的新Blog
顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-26 11:39 
非常感谢

非常感谢


顶部
在线/呼叫 ZALBB
正在看黑山老妖


精华贴数 8
个人空间 0
技术积分 27080 (29)
社区积分 13433 (94)
注册日期 2001-10-15
论坛徽章:45
           
           

 

发表于 2006-6-26 14:56 
应该可以从监听器这个方向考虑。我测试过记录 发到数据库上的每条SQL语句。
但没有把SQL语句与执行的机器联系起来。但我想实际上监听器这一端应该可以实现
此功能。


__________________
一党专政是毒瘤,三民主义统一中国。
顶部
离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-26 16:49 
监听器?

楼上可以具体说一下思路吗?



离线 ahlu
资深会员


精华贴数 1
个人空间 0
技术积分 2679 (540)
社区积分 13 (8729)
注册日期 2003-12-26
论坛徽章:3
会员2006贡献徽章 授权会员 ITPUB新首页上线纪念徽章      
           

 

发表于 2006-6-27 11:18 
hello

应该可以从监听器这个方向考虑?能否具体点!


顶部
在线/呼叫 ZALBB
正在看黑山老妖


精华贴数 8
个人空间 0
技术积分 27080 (29)
社区积分 13433 (94)
注册日期 2001-10-15
论坛徽章:45
           
           

 

发表于 2006-6-27 15:01 
Re: hello



QUOTE:
最初由 ahlu 发布
应该可以从监听器这个方向考虑?能否具体点!

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

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


__________________
一党专政是毒瘤,三民主义统一中国。
只有注册用户登录后才能发表评论。