Heim  >  Artikel  >  Datenbank  >  So löschen Sie die Oracle-Sperre (eine kurze Analyse der Methode)

So löschen Sie die Oracle-Sperre (eine kurze Analyse der Methode)

PHPz
PHPzOriginal
2023-04-04 09:17:411676Durchsuche

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

rrree

Die 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn