主题:杀会话之查找锁表的对象及相关操作
作者:基毛飞上天
场景:今天有个小哥哥跟我说:他们正在truncate一张表,但是却报了错误, 你可以帮我们看下是什么导致资源正在繁忙吗?顺便就帮我们杀掉会话吧!
报错内容如下:
处理思路:
(1)通过相关语句查找出占用该表资源的会话sid和serial#,以及process
(2)找到相关信息之后,需要杀会话,杀process进程
1. 通过 v$locked_object、 dba_objects、 v$session和 v$process等视图找出相关的信息
2. 根据SQL_ID查找对应的SQL语句
了解下这个操作是否导致资源繁忙。
3. 杀会话
杀会话也不是那么容易就能杀掉的喔,需要等待一些时间
4. 查看会话的状态
5. 查process 进程
6. 查看会话是否存在
7. 收工结束
作者:基毛飞上天
场景:今天有个小哥哥跟我说:他们正在truncate一张表,但是却报了错误, 你可以帮我们看下是什么导致资源正在繁忙吗?顺便就帮我们杀掉会话吧!
报错内容如下:
点击(此处)折叠或打开
- SQL> truncate table ZJDB.T_TABLE;
- truncate table ZJDB.T_TABLE
- *
- ERROR at line 1:
- ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
(1)通过相关语句查找出占用该表资源的会话sid和serial#,以及process
(2)找到相关信息之后,需要杀会话,杀process进程
1. 通过 v$locked_object、 dba_objects、 v$session和 v$process等视图找出相关的信息
点击(此处)折叠或打开
- select object_name ,machine ,s.program ,
- s.sid,s.serial#
- p.spid as os_pid ,
- s.sql_address,
- l.locked_mode,
- s.username,
- s.process,
- s.sql_id
- from v$locked_object l,dba_objects o ,v$session s ,v$process p
- where l.object_id=o.object_id
- and l.session_id=s.sid
- and s.paddr=p.addr
- and object_name='T_TABLE' and o.owner='ZJDB'
- order
- by 1
- ;
- OBJECT_NAME MACHINE PROGRAM sid serial# OS_PID SQL_ADDRESS LOCKED_MODE USERNAME PROCESS SQL_ID
------------- ------------- ---------------- ----- ------ --------- ------------- ----------- -------- ---------- -------------
T_TABLE RACZJ-DB01 plsqldev.~~ 5489 21743 4202874 071113A2QA1CC0 3 SCOTT 5416:7556 7qaxjdqwm4tkf
2. 根据SQL_ID查找对应的SQL语句
了解下这个操作是否导致资源繁忙。
点击(此处)折叠或打开
- SQL> SELECT SQL_TEXT FROM V$SQLTEXT WHERE SQL_ID = '7qaxjdqwm4tkf' ORDER BY PIECE;
- delete from /*+parallel(t,4)*/ from ZJDB.T_TABLE t where id=10;
杀会话也不是那么容易就能杀掉的喔,需要等待一些时间
点击(此处)折叠或打开
- SQL> alter system kill session '5489,21743';
alter system /*AP_HW_20180423_6351799*/ kill session '5389,21743'
*
ERROR at line 1:
ORA-00031: session marked for kill
*
ERROR at line 1:
ORA-00031: session marked for kill
点击(此处)折叠或打开
- SQL> select sid,serial#,status from v$session where sid =5489 and serial#=21743;
-
- SID SERIAL# STATUS
- ---------- ---------- --------
- 5389 41743 KILLED
5. 查process 进程
点击(此处)折叠或打开
- $ps -ef|grep 4392874
- 0 17:09:20 pts/0 0:00 grep 4202874
- 9 10:08:17 - 19:18 oracle RAZJDB1 (LOCAL=NO) --刷出非本地连接信息
$ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}' --刷出可以直接用于kill的信息
-9 4392874
$ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}'|xargs kill --杀process
-9 4392874
$ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}'|xargs kill --杀process
$
点击(此处)折叠或打开
- SQL> alter system kill session '5489,21743';
- alter system kill session '5489,21743'
- *
- ERROR at line 1:
- ORA-00030: User session ID does not exist.
7. 收工结束
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31092650/viewspace-2155160/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31092650/viewspace-2155160/