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;
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.
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.
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é.
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.
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;
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;