暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle:应用端进程异常结束没通知数据库进而导致锁释放不了-模拟

原创 四九年入国军 2025-03-11
107

           主机名    ip地址
应用  ip:  node2: 192.168.13.102
数据库ip:   orcl: 192.168.13.154

--scott 新建测试数据:
create table t1(id int);
insert into t1 values(1);
commit;
exit;



--应用段操作,不提交
update t1 set id=2 where id=1;

--数据库端操作:
update t1 set id=2 where id=1;    --由于修改同一条数据会产生行锁,这时会被前面的update阻塞


--如果这个时候如果把13.102的网卡down了,会发生什么?锁是不是永远无法释放了?

--13.102 down 网卡:
ifconfig  ens33 down

--13.154:
----查看当前等待事件
set linesize  1000
col sql_id for a20
col username for a10
col event for a30
select sid,serial#,username,sql_id,status,event,SECONDS_IN_WAIT,BLOCKING_INSTANCE,BLOCKING_SESSION from v$session where wait_class !='Idle';
       SID    SERIAL# USERNAME   SQL_ID               EVENT                          SECONDS_IN_WAIT BLOCKING_INSTANCE BLOCKING_SESSION
---------- ---------- ---------- -------------------- ------------------------------ --------------- ----------------- ----------------
       379      20022 SCOTT      5pk0nht4fa3fy        enq: TX - row lock contention             1246                 1              625
  
  379被625阻塞

--查看阻塞源的等待事件
col MACHINE for a20
select  sid,serial#,taddr,paddr,MACHINE,port,status,LAST_CALL_ET,event,sql_id  from v$session   where sid=625;
       SID    SERIAL# TADDR            PADDR            MACHINE                    PORT STATUS   LAST_CALL_ET EVENT                          SQL_ID
---------- ---------- ---------------- ---------------- -------------------- ---------- -------- ------------ ------------------------------ --------------------
       625      24031 000000008AF8E7C0 000000009242A0F8 node2                     30509 INACTIVE         1631 SQL*Net message from client
	   
	  会话625的主机名是node2(断开网卡的那个),状态是INACTIVE,已登录了1631秒,这个会话当前是空闲状态,没任何等待

--查看事务
select addr,xidusn,xidslot,xidsqn,status,start_time  from v$transaction  where addr='000000008AF8E7C0';
ADDR                 XIDUSN    XIDSLOT     XIDSQN STATUS           START_TIME
---------------- ---------- ---------- ---------- ---------------- --------------------
000000008AF8E7C0          9         16        823 ACTIVE           03/10/25 10:52:18
   
     发现这个事务是活动的

select spid from v$process p,v$session s where s.paddr=p.addr and sid=625;
SPID
------------------------
17040

--操作系统层查看:
ps -ef | grep  17040  | grep -v ssh
oracle    17040      1  0 10:51 ?        00:00:00 oracleorcl (LOCAL=NO)        --这个进程
oracle    19184  12231  0 11:26 pts/2    00:00:00 grep --color=auto 17040

   由于应用的网卡故障,导致数据库目前产生了个行锁释放不了,如果数据库进程17040 结束了,锁也就释放了
  这个进程啥时候结束?
   
ss -o state established ' dst 192.168.13.102' | grep -v ssh

[oracle@orcl:/home/oracle]$ ss -o state established ' dst 192.168.13.102' | grep -v ssh
Netid  Recv-Q Send-Q Local Address:Port                 Peer Address:Port                
tcp    0      0      [::ffff:192.168.13.154]:ncube-lm             [::ffff:192.168.13.102]:30509                 timer:(keepalive,114min,0)

    这个进程会在114分钟结束


--oracle 可以设置keepalive 探测值:
  $ORACLE_HOME/network/admin/sqlnet.ora
  sqlnet.expire_time = 10
  
  --grid用户不需要设置,实时生效,只针对新连接,设置后新连接会每10分钟发个探测包,如果失败会自动结束本机进程



--如果sqlnet.ora 设置了expire_time = 2 ,对应的keepalive如下:
tcp    0      0      192.168.13.154:ncube-lm             192.168.13.102:19789                 timer:(keepalive,1min52sec,0)
 每2分钟探测一次

--如果把客户端13.100的网卡down了,服务端的keepalive变化如下:

tcp    0      0      192.168.13.154:ncube-lm             192.168.13.102:19789                 timer:(keepalive,5.421ms,4)   --4代表重试的次数,这里是第4次重试

tcp    0      0      192.168.13.154:ncube-lm             192.168.13.102:19789                 timer:(keepalive,2.579ms,7)

tcp    0      0      192.168.13.154:ncube-lm             192.168.13.102:19789                 timer:(keepalive,1.426ms,10)  --10代表最后一次重试,这次如果还失败回收进程(不明白设置的最多9次,为啥都10次了)




--linux  keeplive 默认值
cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

tcp_keepalive_time:表示TCP连接闲置多长时间后开始发送探测报文。(单位:秒)

tcp_keepalive_probes:表示一次探测过程中最多可以重发探测报文的次数。(没有收到确认时重发次数)

tcp_keepalive_intvl:表示前一个探测报文和后一个探测报文之间的时间间隔。(即超时重传的时间间隔)(单位:秒)


  
  
  



最后修改时间:2025-03-11 08:43:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论