殺會話之查詢鎖表的物件及相關操作

dbasdk發表於2018-05-30
主題:殺會話之查詢鎖表的物件及相關操作
作者:基毛飛上天

場景:今天有個小哥哥跟我說:他們正在truncate一張表,但是卻報了錯誤,你可以幫我們看下是什麼導致資源正在繁忙嗎?順便就幫我們殺掉會話吧
報錯內容如下:

點選(此處)摺疊或開啟

  1. SQL> truncate table ZJDB.T_TABLE;
  2. truncate table ZJDB.T_TABLE
  3.                        *
  4. ERROR at line 1:
  5. 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等檢視找出相關的資訊

點選(此處)摺疊或開啟

  1. select object_name ,machine ,s.program ,
  2. s.sid,s.serial#
  3. p.spid as os_pid ,
  4. s.sql_address,
  5. l.locked_mode,
  6. s.username,
  7. s.process,
  8. s.sql_id
  9. from v$locked_object l,dba_objects o ,v$session s ,v$process p
  10. where l.object_id=o.object_id
  11. and l.session_id=s.sid
  12. and s.paddr=p.addr
  13. and object_name='T_TABLE' and o.owner='ZJDB'
  14. order
  15. by 1
  16. ;
  17. 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語句
    瞭解下這個操作是否導致資源繁忙。

點選(此處)摺疊或開啟

  1. SQL> SELECT SQL_TEXT FROM V$SQLTEXT WHERE SQL_ID = '7qaxjdqwm4tkf' ORDER BY PIECE;
  2. delete from /*+parallel(t,4)*/ from  ZJDB.T_TABLE t where id=10;
3. 殺會話
   殺會話也不是那麼容易就能殺掉的喔,需要等待一些時間

點選(此處)摺疊或開啟

  1. 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
4. 檢視會話的狀態

點選(此處)摺疊或開啟

  1. SQL> 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)    --刷出非本地連線資訊
$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
$
6. 檢視會話是否存在

點選(此處)摺疊或開啟

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

7.  收工結束

















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2155350/,如需轉載,請註明出處,否則將追究法律責任。

相關文章