前几天遇到了一个奇怪的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 TRIGGER locks_aduitdel
before delete on wbxcore_locks
for each row
begin
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_path
FROM DUAL;
这样我们就很容易从表aduitclock中,根据ip_address 和LOCK_PATH查出是哪个server删除了这条数据了。