主机名 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




