Maison  >  Article  >  base de données  >  Comment supprimer le verrouillage Oracle (une brève analyse de la méthode)

Comment supprimer le verrouillage Oracle (une brève analyse de la méthode)

PHPz
PHPzoriginal
2023-04-04 09:17:411676parcourir

Dans la gestion de base de données Oracle, le verrouillage est un phénomène courant lorsqu'un objet de base de données est utilisé, le système Oracle marque l'objet comme « verrouillé » pour garantir que personne ne modifie ou ne supprime pas accidentellement cet objet. Cependant, ces verrous peuvent parfois empêcher d'autres programmes ou utilisateurs de fonctionner correctement et doivent être supprimés.

Comment supprimer le verrouillage Oracle ?

1. Vérifiez la situation de verrouillage :

Vous pouvez vérifier la situation de verrouillage actuelle de la base de données Oracle via le script suivant :

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;

Grâce aux résultats de la requête du script ci-dessus, vous pouvez connaître tous les objets actuellement verrouillés et la session. informations de l'objet verrouillé. Vous pouvez utiliser Ces informations déterminent la manière dont l'opération de déverrouillage est effectuée.

2. Déverrouiller manuellement :

Après avoir confirmé que le verrou doit être déverrouillé, nous pouvons supprimer manuellement le verrou Oracle en suivant les étapes suivantes :

① Déterminez le SID et le numéro de série de la session verrouillée :

SELECT SID,SERIAL# FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');

Parmi eux , USERENV('SESSIONID') Est d'obtenir l'ID de la session en cours.

②Utilisez les instructions SID, SERIAL# et KILL interrogées ci-dessus pour mettre fin à la session :

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

③ S'il y a plusieurs verrous, vous devez répéter les étapes ci-dessus.

3. Utilisez PL/SQL pour déverrouiller

Vous pouvez utiliser PL/SQL pour déverrouiller dans Oracle. L'implémentation spécifique est la suivante :

① Créez une procédure stockée

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;

La procédure stockée ci-dessus peut être vérifiée en fonction. le nom d'utilisateur et le nom de table donnés Objets verrouillés et terminez automatiquement la session correspondante pour obtenir le déverrouillage.

② : Utilisez la procédure stockée pour déverrouiller :

call kill_locks_table('用户名', '对象名');

Parmi eux, « nom d'utilisateur » fait référence au nom du propriétaire de la table et « nom d'objet » fait référence au nom de la table verrouillée. Exécutez l'instruction Pl/SQL ci-dessus. pour déverrouiller la désignation Tous les verrous sur la table.

Résumé

La suppression des verrous Oracle peut être effectuée manuellement, en utilisant PL/SQL, etc., et la méthode la plus appropriée peut être sélectionnée en fonction de différentes situations. Avant d'utiliser, assurez-vous de déterminer l'objet cible et les informations de session associées pour éviter une mauvaise opération.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn