手動釋放oracle資料庫中死鎖的物件鎖!
阿新 • • 發佈:2018-12-31
常常有朋友在說他要往資料庫中的某張表插入資料,現在表被別人鎖住了,半天不釋放。
首先可以看見資料庫中沒有物件被鎖定。
SQL> conn /as sysdba
已連線。
SQL> select * from v$locked_object;
未選定行
現在來鎖住hr使用者的一張表。
SQL> conn hr/hr 已連線。 SQL> select * from jobs for update; JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ---------- ----------------------------------- ---------- ---------- AD_PRES President 20000 40000 ... ... ... ... 已選擇19行。
再用scott使用者插入一條資料。
SQL> conn scott/tiger
已連線。
SQL> insert into bonus values('1','2',3,4);
已建立 1 行。
可以看見現在有兩行記錄了。
SQL> show user USER 為 "SYS" SQL> select * from v$locked_object; XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE ---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ ----------- 6 10 320 51566 150 SCOTT oracle 3027 3 3 34 313 52279 158 HR oracle 3000 3
現在sys使用者可以殺死這些會話,讓他們釋放鎖!
使用如下語句殺死會話:Kill --alter system kill session 'sid,serial#';SQL> show user USER 為 "SYS" SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode 2 from v$locked_object l,v$session s where s.sid = l.session_id; SID SERIAL# USERNAME TO_CHAR(S.LOGON_TIM PROCESS LOCKED_MODE ---------- ---------- ------------------------------ ------------------- ------------ ----------- 158 38 HR 2011-10-24 23:14:35 3000 3 150 28 SCOTT 2011-10-24 23:22:45 3027 3
SQL> alter system kill session '158,38';
系統已更改。
SQL> alter system kill session '150,28';
系統已更改。
SQL> select * from v$locked_object;
未選定行
SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode
2 from v$locked_object l,v$session s where s.sid = l.session_id;
未選定行