oracle 資料庫鎖表處理 ORA-00031

it_newbalance發表於2012-07-12

   今日執行刪除業務系統表中的一部分待修復資料中,出現鎖表情況,具體如下:

(1) 備份待刪除表中的待刪除資料

create table  t_renewal_stats_data_20120712 tablespace tabbak as select * from t_renewal_stats_data s where s.stat_item_id>1057 and s.work_month<201206;

(2)執行資料刪除

delete from t_renewal_stats_data s where s.stat_item_id>1057 and s.work_month<201206;

執行過程中發現鎖表,語句卡起執行不了

(3)檢查是否鎖表

select sid,serial#,username,SCHEMANAME,osuser,MACHINE,
terminal,PROGRAM,owner,object_name,object_type,o.object_id
from dba_objects o,v$locked_object l,v$session s
where o.object_id=l.object_id and s.sid=l.session_id;

發現有兩個程式鎖表

931 , 12562 和 1008 , 15043

(4)oraclekill掉該session

--alter system kill session '&sid,&serial#';

SQL> alter system kill session '931,12562';

System altered.

因在查詢鎖表前已經將sid 為1008 的客戶端的plsql developer 工具關閉,但伺服器系統程式依然存在

所以kill oracle 級session中出現 ORA-00031錯誤

如下:

SQL>  alter system kill session '1008,15043';
 alter system kill session '1008,15043'
*
ERROR at line 1:
ORA-00031: session marked for kill

(5)根據sid 查出系統級的程式號並檢驗:

select spid from v$process where addr = (select paddr from v$session s where s.SID=1008);

得出 spid 為 8642

驗證該系統程式號是否對應oracle級程式

select sid  from v$session where  paddr = (select addr from v$process where spid=8642);

得出 sid 為 1008

驗證通過

(6)系統級檢視 8642 程式是否為客戶端連線資料庫程式

[oraprod@D0-XXXX ~]$ ps -ef | grep 8642
oraprod   1487  1455  0 15:59 pts/0    00:00:00 grep 8642
oraprod   8642     1  0 Jul11 ?        00:01:41 oracleXXXX (LOCAL=NO)

可確認為客戶端程式,則可殺掉 (如果為資料庫例項服務程式則不可輕易kill 掉,否則資料庫將無法修復)

(7)作業系統級killsession: (生產系統需仔細確認,然後kill)

[oraprod@D0-XXXX ~]$ kill -9 8642

檢驗是否殺掉

[oraprod@D0-XXXX ~]$ ps -ef | grep 8642
oraprod   1511  1455  0 16:00 pts/0    00:00:00 grep 8642

該系統程式被殺掉

(8)執行刪除資料操作

delete from t_renewal_stats_data s where s.stat_item_id>1057 and s.work_month<201206;

SQL>
 
228 rows deleted

刪除完成

 

 

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

相關文章