2015-07-03 22 views
6

Sto provando lo script seguente per uccidere tutte le sessioni di oracle attive e inattive per l'utente in una sola volta ma non funziona. Lo script viene eseguito correttamente ma non uccide le sessioni per l'utente.Come uccidere tutte le sessioni oracle attive e inattive per l'utente

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; 
+2

Qual è lo stato di tali sessioni? Il fatto che tu abbia ucciso una sessione non significa che sparirà immediatamente. Se la sessione ha una certa transazione aperta, quindi prima i rollback (richiede molto tempo) e quindi si chiuderà. Quindi la mia raccomandazione è di controllare la colonna STATUS nella sessione V $. – ibre5041

+1

ho controllato lo stato della colonna e il suo mostrare poche sessioni attive. Quindi non è stato ucciso .. – Andrew

risposta

9

Il comando KILL SESSION in realtà non uccide la sessione. Si limita a chiedere alla sessione di uccidersi. In alcune situazioni, come attendere una risposta da un database remoto o eseguire il rollback delle transazioni, la sessione non si ucciderà immediatamente e attenderà il completamento dell'operazione corrente. In questi casi, la sessione avrà lo stato "contrassegnato per kill". Sarà quindi ucciso il prima possibile.

di controllare lo stato di confermare:

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

Si potrebbe anche usare IMMEDIATO clausola:

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

La clausola IMMEDIATE non influenza il lavoro svolto dal comando, ma restituisce il controllo tornare alla sessione corrente immediatamente, piuttosto che attendere la conferma dell'uccisione. Dai un'occhiata a Killing Oracle Sessions.

Aggiornamento Se si desidera interrompere tutte le sessioni, è sufficiente preparare un piccolo script.

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

Spool quanto sopra in un file .sql ed eseguirlo.

+1

Ciao lalit quello che stai dicendo è vero e so che sopra sql coomands per controllare e uccidere sessione immediatamente. Ma non è la risposta della mia domanda. Diciamo che ho 20 sessioni attive e inattive. Quindi non posso semplicemente scrivere 20 alter dichiarazioni per ucciderle. Voglio ucciderli subito. – Andrew

+0

@Rahul Quanto è difficile preparare le istruzioni sql? Posso farlo in appena 1 secondo. Guarda l'aggiornamento. –

+1

sì ma non possiamo creare ciclo o procedura per uccidere queste sessioni in una volta? Non so in futuro ci potrebbero essere più di 20 sessioni per il mio utente. – Andrew

3

eseguire questo script:

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

Sarà tabulato sqls, che dovrebbero essere eseguiti.

6
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; 

Questo dovrebbe funzionare - Ho appena cambiato lo script per aggiungere la parola chiave immediate. Come indicato nelle risposte precedenti, lo kill session contrassegna solo le sessioni di uccisione; non lo fa immediatamente ma più tardi quando è conveniente.

Dalla tua domanda, sembrava che ti aspetti di vedere immediatamente il risultato. Quindi la parola chiave immediate viene utilizzata per forzare questo.

+0

Grazie @TobySpeight, io sono nuovo a questo.Aggiornato la mia risposta con una spiegazione. –

+0

Grazie - non era chiaro cosa avresti fatto diversamente. –