web-dev-qa-db-fra.com

Comment tuer toutes les sessions Oracle actives et inactives pour l'utilisateur

J'essaie le script ci-dessous pour supprimer toutes les sessions Oracle actives et inactives pour un utilisateur à la fois, mais cela ne fonctionne pas. Le script s'exécute correctement mais ne tue pas les sessions pour l'utilisateur.

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;
19
Andrew

Le KILL SESSION La commande n’a pas réellement kill la session. Il demande simplement à la session de se tuer. Dans certaines situations, comme attendre une réponse d'une base de données distante ou annuler des transactions, la session ne se tuera pas tout de suite et attendra la fin de l'opération en cours. Dans ces cas, le statut de la session sera " marqué pour kill ". Il sera ensuite tué le plus tôt possible.

Vérifiez le statut pour confirmer:

SELECT sid, serial#, status FROM v$session;

Vous pouvez également utiliser la clause [~ # ~] immédiate [~ # ~] :

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

La clause IMMEDIATE n'affecte pas le travail effectué par la commande, mais renvoie immédiatement le contrôle à la session en cours, au lieu d'attendre la confirmation de la suppression. Jetez un oeil à Killing Oracle Sessions .

Mise à jour Si vous voulez tuer toutes les sessions, vous pouvez simplement préparer un petit script.

SELECT 'ALTER SYSTEM KILL SESSION '||sid||','||serial#||';' FROM v$session;

Spool le ci-dessus à un .sql fichier et exécutez-le.

19
Lalit Kumar B
BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;

Cela devrait fonctionner - je viens de changer votre script pour ajouter le mot clé immediate. Comme le soulignaient les réponses précédentes, le kill session ne marque que les sessions pour avoir tué; il ne le fait pas immédiatement mais plus tard, lorsque cela convient.

D'après votre question, il semblait que vous vous attendiez à voir le résultat immédiatement. Donc, le mot clé immediate est utilisé pour le forcer.

17
noname.c

Exécutez ce script:

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';

Il va imprimer sqls, qui devrait être exécuté.

4
elkoo
BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/

Ça marche pour moi.

0
chandan gupta

Pour Oracle 11g, cela peut ne pas fonctionner car vous pouvez recevoir une erreur comme ci-dessous

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.

Pour remédier à cela, utilisez le code ci-dessous pour identifier les sessions

SQL> select inst_id,sid,serial# from gv$session ou v $ session

NOTE : v $ session n'a pas de champ inst_id

et les tuer en utilisant

alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
0
Sid133

session inactive le jour avant de tuer

begin
    for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
    LOOP
        EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]'  ||i.serial#||q'[']'||' IMMEDIATE');
    END LOOP;
end;
0
Faruk ÇEVİK