swingboat 发表于 2013-1-15 02:45:18

记录DB数据是被哪台数据删除的触发器

前几天遇到了一个奇怪的bug,有一条数据莫名其妙被删除了。而这条数据也不是每次都被删除,只是偶尔被删除。删除这条数据的函数在两个地方调用:1. 在主线程中,用户请求,将被删除。2. 在一个守护线程中,每隔一定的时间运行删除。由于是多台server同时运行,前面有台Load balance进行负载均衡。这样我们没有办法确定是哪台server删除了这条数据,而且也有可能是开发者直接用本地的环境连到db删除了这条数据。为了确认是哪台server删除这条数据,于是我们增加了一个触发器对这个表进行了监控:
1. 创建一个记录请求的表

create table aduitclock(terminal varchar2(250),sessionid varchar2(250),instance varchar2(250),current_user varchar2(250),current_userid varchar2(250),session_user varchar2(250),session_userid varchar2(250),proxy_user varchar2(250),proxy_userid varchar2(250),db_domain varchar2(250),db_name varchar2(250),host varchar2(250),os_user varchar2(250),external_name varchar2(250),ip_address varchar2(250),INSERTTIME varchar2(250),LOCK_PATH varchar2(4000)) 2. 增加触发器对表进行监控

CREATE OR REPLACE TRIGGERlocks_aduitdelbefore delete on wbxcore_locksfor each rowbegin insert into aduitclock select          SYS_CONTEXT('USERENV','TERMINAL') terminal,          SYS_CONTEXT('USERENV','SESSIONID') sessionid,          SYS_CONTEXT('USERENV','INSTANCE') instance,          SYS_CONTEXT('USERENV','CURRENT_USER') current_user,          SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,          SYS_CONTEXT('USERENV','SESSION_USER') session_user,          SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,          SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,          SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,          SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,          SYS_CONTEXT('USERENV','DB_NAME') db_name,          SYS_CONTEXT('USERENV','HOST') host,          SYS_CONTEXT('USERENV','OS_USER') os_user,          SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,          SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,          sysdate,          :old.lock_pathFROM DUAL; 这样我们就很容易从表aduitclock中,根据ip_address 和LOCK_PATH查出是哪个server删除了这条数据了。
页: [1]
查看完整版本: 记录DB数据是被哪台数据删除的触发器