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

Socket Time out报错梳理步骤

237

Part1环境信息

数据库:Oracle 19.23.0.0.0 集群
连接池:druid

Part2问题报错

Socket Time out

Part3问题处理

Part3.1、网络方面的波动

ping 数据库IP

Part3.2、数据库的繁忙状态

总体资源
sar

CPU使用
top

磁盘IO
iostat -x 3

Part3.3、问题SQL的定位

生成AWR和ASH报告追踪

@?/rdbms/admin/awrrpt

@?/rdbms/admin/ashrpt

通过报告查看的确是有 enq: TX - row lock contention 等待事件,也抓取到了这个SQL,和他的SQL ID(1ujwkqz3a4kf5)

查看执行计划

SQL> select * from table(dbms_xplan.display_awr('1ujwkqz3a4kf5'));

Plan hash value: 2806104620
--------------------------------------------------------------------------------------------------
| Id  | Operation       | Name              | Rows  | Bytes | Cost (%CPU)| Time      |
--------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |                |    |     |     2 (100)|        |
|   1 |  UPDATE        | AAAAAAAAAAAAAA         |     |       |            |        |
|*  2 |   INDEX RANGE SCAN | AAAAAAAAAAAAAAAAAAAAAAAAAA |     1 |   947 |     1   (0)| 00:00:01  |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("AA_ID"=:74 AND "BBBB_ID"=:75 AND "CCCC_TAG"=:76 AND "DDD_GUID"=:73)
46 rows selected.

10046定位流程

select a.inst_id,b.spid, a.sid, a.serial#, a.MACHINE, a.logon_time
  from gv$session a, gv$process b
 where a.paddr = b.ADDR
   and a.username = '用户'
   and machine like '%机器名%';

这里的setospid就是上边的spid

SQL> oradebug setospid 46952
Oracle pid: 85, Unix process pid: 133506, image: oracle@cprac89 (O009)

SQL>  oradebug unlimit;
Statement processed.

SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/aaaa/aaa21/trace/aaaa_ora_73137.trc

SQL>  oradebug session_event 10046 trace name context forever ,level 12
Statement processed.

##卡死后可以结束
SQL> oradebug event 10046 trace name context off


用tkprof 格式化,
su - oracle
tkprof aaaa21_ora_73137.trc /tmp/sock_time_out

定位问题sql,查看执行信息,查看流程步骤

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.16     601.21          0          4          1           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.16     601.21          0          4          1           0

配合开发再定位,抓住问题源头

SELECT 'Instance '||s1.INST_ID||' '|| s1.username || '@' || s1.machine
|| ' ( SID= ' || s1.sid || ','|| s1.serial#||',@'||s1.INST_ID||' '||s1.status||  '  )  is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' ||s2.sql_id
FROM gv$lock l1, gv$session s1, gv$lock l2, gv$session s2
WHERE s1.sid=l1.sid AND
s1.inst_id=l1.inst_id AND
s2.sid=l2.sid AND
s2.inst_id=l2.inst_id AND
l1.BLOCK=1 AND
l2.request > 0 AND
l1.id1 = l2.id1 AND
l2.id2 = l2.id2 ;

记住SID和实例需要修改

SELECT * FROM gv$sql WHERE sql_id = (SELECT NVL(prev_sql_id,'1') FROM  gv$session WHERE sid=6165 and inst_id=1);

配合他先把这个会话干掉

alter system kill session '14545,42819' immediate;

Part4问题复盘

1、为什么用这种麻烦的方式,因为只有报socket,开发才会找我,只能是事后了,没发定位到源头

2、按照开发的说法,我一直想的是用10046定位整个连接会话,结果最后发现是源头是另一个会话的,但是也的确定位到被堵塞的SQL在一开始是被堵死的

3、唯一有用的是复现问题场景,但是查到另一个会话最后执行的是sql语句,本来想接着10046追踪的。但是开发通过查询sql最后自己定位到一个update语句,也是对这个数据库表的操作,我让他去修改业务逻辑去了(也许是差个提交?)

4、事后问大佬说是可以考虑用一下 oradebug hanganalyze 3 ,又得学习新知识了

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

评论