ITPub博客

首页 > 数据库 > 数据库开发技术 > Oracle系列|杀数据库会话和查找锁表的对象

Oracle系列|杀数据库会话和查找锁表的对象

原创 数据库开发技术 作者:小安 时间:2020-10-23 23:54:39 0 删除 编辑


来源:python自动化运维

作者:小安Sir


场景:今天有个小哥哥跟我说:他们正在truncate一张表,但是报错了,你可以帮我们看下是什么导致资源正在繁忙吗?顺便就帮我们杀掉会话吧!

我当时心想啊,来事了,来事了!一个字"爽"!


报错内容如下:

1SQL> truncate table ZJDB.T_TABLE;
2truncate table ZJDB.T_TABLE
3                       *
4ERROR at line 1:
5ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired


处理思路:
(1)通过相关语句查找出占用该表资源的会话sid和serial#,以及process等等。
(2)找到相关信息之后,需要杀会话,杀非本地链接进程。


1. 通过动态视图找出相关的信息

 1select object_name ,machine ,s.program ,
2s.sid,s.serial#
3p.spid as os_pid ,
4s.sql_address,
5l.locked_mode,
6s.username,
7s.process,
8s.sql_id
9from v$locked_object l,dba_objects o ,v$session s ,v$process p
10where l.object_id=o.object_id
11and l.session_id=s.sid
12and s.paddr=p.addr
13and object_name='T_TABLE' and o.owner='ZJDB'
14order by 1;
15
16OBJECT_NAME     MACHINE           PROGRAM     sid  serial#      OS_PID   SQL_ADDRESS   LOCKED_MODE USERNAME PROCESS     SQL_ID
17------------- ------------- ---------------- ----- ------ --------- ------------- ----------- -------- ---------- ------------- 
18T_TABLE         RACZJ-DB01       plsqldev.~~   5489 21743  4202874  071113A2QA1CC0     3       SCOTT   5416:7556  7qaxjdqwm4tkf


2.  根据SQL_ID查找对应的SQL语句
    了解下这个操作是否导致资源繁忙。

1SQL> SELECT SQL_TEXT FROM V$SQLTEXT WHERE SQL_ID = '7qaxjdqwm4tkf' ORDER BY PIECE;
2
3### 找到以下SQL 语句
4delete from /*+parallel(t,4)*/ from  ZJDB.T_TABLE t where id=10;


3. 杀会话
   杀会话也不是那么容易就能杀掉的喔,需要等待一些时间

1SQL> alter system kill session '5489,21743';
2alter system /*AP_HW_20180423_6351799*/ kill session '5389,21743'
3*
4ERROR at line 1:
5ORA-00031: session marked for kill



4. 查看会话的状态

    可以看到会话的状态已经是KILLED了。

1SQL> select sid,serial#,status from v$session where sid =5489 and serial#=21743;
2       SID SERIAL# STATUS
3---------- ---------- --------
4      5389 41743 KILLED


5. 查process进程

    在数据库层面杀完之后,别忘了在操作系统还要杀掉远程连接,不然你可能会发现某个连接挂了在服务器半年左右,是不是特别奇葩,告诉你老铁,还真有!

1$ ps -ef|grep 4392874
2 0 17:09:20 pts/0 0:00 grep 4202874
3 9 10:08:17 - 19:18 oracle RAZJDB1 (LOCAL=NO)    --刷出非本地连接信息
4$ ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}'   --刷出可以直接用于kill的信息
5 -9 4392874
6$ ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}'|xargs kill   --杀process

6. 查看会话是否存在

1SQL> alter system  kill session '5489,21743';
2alter system  kill session '5489,21743'
3
4*
5ERROR at line 1:
6ORA-00030: User session ID does not exist.


7.  收工结束

事后问下小哥哥,本次DBA服务质量怎么样,给个好评吧!


小哥哥说:大神啊~

小安Sir   :中听!


Python

自动化运维

长按识别上方二维码,

关注Python自动化运维喔!


原文作者:Python自动化运维;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-10-07

  • 博文量
    47
  • 访问量
    17920