在Oracle資料庫管理中,鎖定是一個常見的現象,當一個資料庫物件被使用時,Oracle系統將該物件標記為「已鎖定」狀態,以確保人們不會意外更改或刪除這個物件。不過,有時候這些鎖定可能會導致其他程式或使用者無法正常運作,這時需要刪除這些鎖定。
如何刪除Oracle鎖定?
1.查看鎖定情況:
透過以下腳本可以查看Oracle資料庫目前的鎖定情況:
SELECT c.owner,c.object_name,c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine FROM v$locked_object a ,all_objects c ,v$session b WHERE b.sid = a.session_id AND a.object_id = c.object_id;
透過上述腳本查詢到的結果可以知道目前所有鎖定的對象,以及鎖定該對象的session訊息,可以根據這些資訊決定如何進行解鎖操作。
2.手動解除鎖定:
在確認需要解除鎖定之後,我們可以透過以下步驟手動刪除Oracle鎖定:
① 確定鎖定會話的SID和SERIAL# :
SELECT SID,SERIAL# FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');
其中,USERENV('SESSIONID')是取得目前會話的ID。
②利用上述查詢到的SID和SERIAL#和KILL語句終止該session:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
③.如果有多個鎖定,需要重複上述步驟。
3.使用PL/SQL解除鎖定
在Oracle中可以使用PL/SQL解除鎖定,具體實作如下:
①.建立預存程序
CREATE OR REPLACE PROCEDURE kill_locks_table (p_username IN VARCHAR2, p_table_name IN VARCHAR2) IS l_obj_id NUMBER; l_sess_id NUMBER; l_serial# NUMBER; l_locktype VARCHAR2(32); BEGIN SELECT object_id INTO l_obj_id FROM dba_objects WHERE object_name = p_table_name and owner = p_username and object_type in ('TABLE', 'INDEX'); FOR l_rec IN (SELECT session_id, lock_type, mode_held FROM v$locked_object WHERE object_id = l_obj_id) LOOP l_sess_id := l_rec.session_id; l_locktype := l_rec.lock_type || ' ' || l_rec.mode_held; SELECT serial# INTO l_serial# FROM v$session WHERE sid = l_sess_id; dbms_output.put_line('Killing session ' || l_sess_id || ' serial# ' || l_serial# || ' which is holding lock: ' || l_locktype); EXECUTE IMMEDIATE 'alter system kill session ''' || l_sess_id || ',' || l_serial# || ''''; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('No locks found for ' || p_table_name); END kill_locks_table;
以上預存程序可以根據給定的使用者名稱和表名檢查鎖定的物件並自動終止對應的session從而實現解鎖。
②:使用預存程序解除鎖定:
call kill_locks_table('用户名', '对象名');
其中,'使用者名稱'是指表的擁有者名,'物件名稱'是指被鎖定的表的名稱,執行以上Pl/SQL語句即可解除指定資料表的所有鎖定。
總結
刪除Oracle鎖定可以透過手動解除、使用PL/SQL等方式,根據不同情況選擇最合適的方式進行解鎖操作。在操作之前一定要確定好目標對象和相關session的信息,以免出現誤操作的情況。
以上是如何刪除oracle鎖(方法淺析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!