2011-05-09 10 views

risposta

9

È impossibile disconnettersi da un database Oracle senza eseguire commit o rollback. È possibile che l'applicazione client si sia arrestata in modo anomalo o terminata forzatamente e non abbia avuto la possibilità di disconnettersi lasciando una sessione sul server in cui sono presenti alcuni blocchi. In questo caso, il DBA dovrebbe uccidere quella sessione.

Se sei il DBA e non sei sicuro di quello che la sessione ha bisogno di essere ucciso, è possibile eseguire la seguente query per ottenere informazioni circa le varie sessioni che sono in possesso di serrature che bloccano altre sessioni

SELECT ses.sid, ses.serial#, ses.username, ses.program, ses.osuser, ses.machine 
    FROM v$session ses, 
     dba_blockers blk 
WHERE blk.holding_session = ses.sid 

una volta identificato quale sessione (s) di uccidere

ALTER SYSTEM KILL SESSION '<<sid>>, <<serial#>>' 
+0

Grazie a @JustinCave per la risposta. Per chiarire, se la sessione non viene terminata in modo esplicito, non si interromperà mai automaticamente? –

+1

@RussellSilva - Dipende da cosa intendi per "automatico". Se l'applicazione client si arresta in modo anomalo, è possibile abilitare il rilevamento della connessione guasto (DCD) sul server del database. Ciò farà sì che il database esegua periodicamente il ping del client per determinare se è ancora attivo e per terminare la sessione in caso di arresto anomalo del client. Ciò accade in tempi relativamente brevi, tuttavia, quindi non era correlato alla domanda originale. È possibile configurare Oracle per terminare le sessioni se sono inattività troppo a lungo. In entrambi i casi, la sessione viene terminata esplicitamente con un 'rollback', è appena terminato dal database. –

3

Se la sessione non ha rollback esplicitamente, se il server di database non può più raggiungere un cliente la sua attività verrà eseguito il rollback automaticamente, e poi lo farà terminare la sessione.

Il server è spesso abbastanza felice se il cliente non ne fa richiesta per ore e ore. Verifica se SQLNET.EXPIRE_TIME è impostato su qualsiasi cosa sul server. Se si tratta di un valore diverso da zero, è quindi il numero di minuti che dovrà attendere prima di verificare se una connessione client è morta. Se è zero, non controllerà e sarà a conoscenza solo se trova che il client è morto quando risponde a una richiesta del client.

Inoltre, il rollback potrebbe richiedere del tempo. Se un sacco di lavoro è stato fatto, potrebbe richiedere ore. Qualunque cosa in attesa di quella sessione continuerà ad aspettare fino al completamento del rollback

Problemi correlati