Bei der Oracle-Datenbankverwaltung ist das Sperren ein häufiges Phänomen. Wenn ein Datenbankobjekt verwendet wird, markiert das Oracle-System das Objekt als „gesperrt“, um sicherzustellen, dass dieses Objekt nicht versehentlich geändert oder gelöscht wird. Manchmal können diese Sperren jedoch verhindern, dass andere Programme oder Benutzer ordnungsgemäß funktionieren, und die Sperren müssen entfernt werden.
Wie entferne ich die Oracle-Sperre?
1. Überprüfen Sie die Sperrsituation:
Sie können die aktuelle Sperrsituation der Oracle-Datenbank mit dem folgenden Skript überprüfen:
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;
Anhand der Abfrageergebnisse des obigen Skripts können Sie alle aktuell gesperrten Objekte und die Sitzung ermitteln Informationen zum gesperrten Objekt. Diese Informationen bestimmen, wie der Entsperrvorgang durchgeführt wird.
2. Manuell entsperren:
Nachdem wir bestätigt haben, dass die Sperre entsperrt werden muss, können wir die Oracle-Sperre durch die folgenden Schritte manuell löschen:
① Bestimmen Sie die SID und die SERIENNUMMER der gesperrten Sitzung:
SELECT SID,SERIAL# FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');
Unter ihnen , USERENV('SESSIONID') Soll die ID der aktuellen Sitzung abrufen.
②Verwenden Sie die oben abgefragte SID- und SERIAL#- und KILL-Anweisung, um die Sitzung zu beenden:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
③ Wenn mehrere Sperren vorhanden sind, müssen Sie die obigen Schritte wiederholen.
3. Verwenden Sie PL/SQL zum Entsperren
Sie können PL/SQL zum Entsperren in Oracle verwenden. Die spezifische Implementierung ist wie folgt:
① Erstellen Sie eine gespeicherte Prozedur
rrreeDie oben genannte gespeicherte Prozedur kann überprüft werden Der angegebene Benutzername und Tabellenname sperrt Objekte und beendet automatisch die entsprechende Sitzung, um die Entsperrung zu erreichen.
②: Verwenden Sie zum Entsperren eine gespeicherte Prozedur:
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;
Dabei bezieht sich „Benutzername“ auf den Eigentümernamen der Tabelle und „Objektname“ auf den Namen der gesperrten Tabelle. Führen Sie die obige Pl/SQL-Anweisung aus um die Bezeichnung Alle Sperren auf dem Tisch zu entsperren.
Zusammenfassung
Das Löschen von Oracle-Sperren kann manuell, mit PL/SQL usw. erfolgen, und Sie können je nach Situation die am besten geeignete Methode zum Entsperren auswählen. Stellen Sie vor dem Betrieb sicher, dass Sie das Zielobjekt und die zugehörigen Sitzungsinformationen ermitteln, um Fehlbedienungen zu vermeiden.
Das obige ist der detaillierte Inhalt vonSo löschen Sie die Oracle-Sperre (eine kurze Analyse der Methode). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!