L# MACHINE PROGRAM EVENT SQL_ID STATUS
---------- ---------- -------------------- -------------------- ------------------------- ------------- --------
1050 8 ABCSRV01 JDBC Thin Client latch: cache buffers chai 62rv794fswmcy ACTIVE
ns
可以看到此会话在执行的SQLID为62rv794fswmcy,相关等待事件是:latch: cache buffers chains;
进一步得出此SQL语句的文本及相应执行计划,以及事务的相关信息。
--如下SQL语句截取了部分,并修改了表、列名信息。语句较长,有多个case when判断及嵌套多个视图等复杂查询;
SQL> select sql_text from v$sqltext where sql_id='62rv794fswmcy' order by PIECE;
SQL_TEXT
----------------------------------------------------------------
update AAAA set ts='2015-08-24 13:14:10',AAAAA = ( cas
e when ( pAAAs = 'AA' or pAAAs = 'AAAAAAAA' ) then 0 else
( select AAAA from AAAA where pk_bclbid = AAAA.p
kAAAs ) end ), if_rest = ( case when ( pAAss = 'AAAX' or pk_c
查看此SQL的执行计划等信息--这里使用了awrsqrpt报告
--从游标缓存中查询此SQL语句执行计划信息:
col plan_table_output for a100
set long 900
set pagesize 100
select * from table(dbms_xplan.display_cursor('62rv794fswmcy',0,'advanced'));
--生成awrsqrpt报告
SQL> @?/rdbms/admin/awrsqrpt.sql
---此处执行计划太长,文本型的基本不具有可读性,参考了awrsqrpt报告中的信息如下。
Stat Name Statement Total Per Execution % Snap Total
Elapsed Time (ms) 2,686,331 4.69
CPU Time (ms) 2,669,779 24.23
Executions 0
Buffer Gets 239,883,842 24.78
Disk Reads 0 0.00
Parse Calls 1 0.00
--可以看到此SQL语句目前已经执行了2686秒,Buffer Gets的数据块个数是239,883,842,2亿多个。
进一步查询此SQL对应的会话信息:
SQL> select sid,serial#,machine,program,EVENT,SADDR,STATUS from v$session where SADDR in(select SES_ADDR from v$transaction) and sid=1050;
SID SERIAL# MACHINE PROGRAM EVENT SADDR STATUS
---------- ---------- ---------- -------------------- ---------------------------------------- ---------------- ----------
1050 8 ABCSRV01 JDBC Thin Client SQL*Net more data from client 000000075B9EE930 ACTIVE
SQL> select START_TIME,STATUS,SES_ADDR from v$transaction where ses_addr='000000075B9EE930';
START_TIME STATUS SES_ADDR
-------------------- ---------- ----------------
08/24/15 10:37:21 ACTIVE 000000075B9EE930
可以看到此事务从上午10:37开始运行一直到进行处理时的14:30左右还在运行;
经观察此会话执行的SQL不只上面查出的一条且都运行时间较长,因此判断是同一事务中的多个大型SQL;
因SQL执行速度较慢且在同一事务中,在全部SQL执行完之前事务不提交也不回滚,导致TX行锁资源一直得不到释放。
进而导致其它会话的相关操作都HANG住在等待此会话释放TX锁资源。
5.找到问题原因--TX - row lock contention产生原因并进行处理 经与用户确认,决定KILL此会话;同时联系业务部门确认此会话的相关SQL执行的为何种操作并进行修正。
--KILL会话及后续查询如下:
SQL> col EVENT for a20
SQL> select sid,serial#,machine,program,EVENT,SADDR,SQL_ID,STATUS from v$session where SADDR in(select SES_ADDR from v$transaction) and sid=1050;
SID SERIAL# MACHINE PROGRAM EVENT SADDR SQL_ID STATUS
---------- ---------- ---------- ------------------------- -------------------- ---------------- ------------- ----------
1050 8 ABCSRV01 JDBC Thin Client latch free 000000075B9EE930 36mu7qg6cc5yu ACTIVE
SQL> alter system kill session '1050,8';
System altered.
SQL> select sid,serial#,machine,program,EVENT,SADDR,SQL_ID,STATUS from v$session where SADDR in(select SES_ADDR from v$transaction) and sid=1050;
no rows selected
此时还有部分事务在等待TX锁,稍等后再查询,之前被阻塞的事务全部完成。
SQL> select sid,serial#,machine,program,EVENT,SQL_ID,STATUS from v$session where SADDR in(select SES_ADDR from v$transaction);
SID SERIAL# MACHINE PROGRAM EVENT SQL_ID STATUS
---------- ---------- ---------- ------------------------- -------------------- ------------- ----------
1056 397 ABCSRV01 JDBC Thin Client |