设为首页 加入收藏

TOP

一次数据库相关操作卡住的排查--enq:TX-rowlockcontention(一)
2015-11-21 01:34:27 来源: 作者: 【 】 浏览:0
Tags:一次数据库 相关 操作 卡住 排查 --enq:TX-rowlockcontention
问题描述:某日客户来电某HR 系统排值班表的操作一直HANG住,一直无法完成。
这种问题,主要思路是围绕查看此操作因何HANG住。
常见的严重的HANG住有DB方面的AUDIT无空间、归档空间满以及主机方面CPU/内存使用率高或/根目录满等状况;

在此排查过程中,主机状态是第一步要查询的,如磁盘空间/CPU/内存使用情况等。
主机无异常后,查看DB状态,包括进程状态。如查看ALERT日志、确认能否登陆,查询一些V$视图、进行REDO切换等;
在这些基础的确认后再查询当前正在发生的等待事件及相关SESSION信息。

在本次问题中主要等待事件是enq: TX - row lock contention行锁问题。大致处理思路如下:
1.查询主机相关状态是否正常
2.查看DB状态
3.查看当前主要正在发生的等待事件及相关SESSION信息
4.确认相关等待事件后进一步排查何种原因引起
5.找到原因后进行处理




分析处理过程如下:

1.查询主机相关状态是正常的,此处不再多写输出。

使用命令有如下:
[oracle@ABCSRV02 ~]$ top
[oracle@ABCSRV02 ~]$ free -m
[oracle@ABCSRV02 ~]$ cat /proc/meminfo
[oracle@ABCSRV02 ~]$ df -h

2.查看DB状态

查看通过监听连接的进程数
[oracle@ABCSRV02 ~]$ ps -ef|grep LOCAL=NO|wc -l
lsnrctl status
ps -ef|grep smon

sqlplus / as sysdba登陆后查询了如下信息:
--查询实例状态
select to_char(startup_time,'yyyy/mm/dd hh24:mi:ss'),instance_name,status from v$instance;
--查询DB读写状态
select name,open_mode from v$database;
--查询数据文件及表空间状态是否正常
set linesize 160
set pagesize 1000
col tablespace_name for a22
select tablespace_name,status from dba_tablespaces;
select file#,status from v$datafile;
 select * from v$recover_file;
--进行REDO LOG切换
SQL> alter system switch logfile;
System altered.
此处确认状态正常。

3.查看当前主要正在发生的等待事件及相关SESSION信息

set linesize 200
col event for a25
col username for a10
select g.Inst_id,g.sid,g.serial#,g.event,g.username, g.sql_id
from gv$session g,v$sql s
where g.Wait_class <> 'Idle' and g.sql_hash_value=s.HASH_VALUE;

本处查询到的是TX锁相关事件,使用如下SQL语句查询:
select g.Inst_id,g.sid,g.serial#,g.event,g.username, g.sql_id
from gv$session g,v$sql s
where g.Wait_class <> 'Idle' and g.sql_hash_value=s.HASH_VALUE and g.event like '%T%';
--为了隐私实际查询的结果进行了一些修改。
INST_ID SID SERIAL# EVENT USERNAME SQL_HASH_VALUE
---------- ---------- ---------- ---------------------------------------- ---------- --------------
1 1056 397 enq: TX - row lock contention ABCHR 1828393250
1 1058 1981 enq: TX - row lock contention ABCHR 3151192798
1 1069 3802 enq: TX - row lock contention ABCHR 734455977
1 1075 397 enq: TX - row lock contention ABCHR 3627991293
1 1076 4025 enq: TX - row lock contention ABCHR 3204010047
1 1084 2990 enq: TX - row lock contention ABCHR 3636242951
1 1088 1185 enq: TX - row lock contention ABCHR 1010386057
1 1093 685 enq: TX - row lock contention ABCHR 2969205112


4.确认相关等待事件后进一步排查


查询到大量enq: TX - row lock contention后,需要查出这些会话等待在哪个会话来释放enq: TX - row lock contention行锁资源。
也就是被哪个会话的什么操作阻塞。
--使用SQL如下:
select blocking_session,sid,serial#,wait_class,seconds_in_wait
from v$session
where blocking_session is not NULL
and sid in('sid');

如下查询到是SID=1050的会话阻塞了这些SQL;
SQL> select blocking_session,sid,serial#,wait_class,seconds_in_wait
2 from v$session
3 where blocking_session is not NULL
and sid in(1056,1058,1069,1075,1076,1084,1088,1093);
4
BLOCKING_SESSION SID SERIAL# WAIT_CLASS SECONDS_IN_WAIT
---------------- ---------- ---------- ----------------------- ---------------
1050 1056 397 Application 10561
1050 1058 1981 Application 4129
1050 1069 3802 Application 8549
1050 1075 397 Application 10913
1050 1076 4025 Application 623
1050 1084 2990 Application 6234
1050 1088 1185 Application 2549
1050 1093 685 Application 8264

8 rows selected.

下一步进行查询SID=1050的会话在执行什么操作有何等待事件
SQL> set linesize 200
SQL> select sid,serial#,machine,program,EVENT,SQL_ID,STATUS from v$session where sid in('1050');

SID SERIA
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在物理dg中对RFS进程进行trace的.. 下一篇C++栈学习――顺序栈和链栈的区别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: