Esiste un modo migliore per disconnettere forzatamente tutti gli utenti da uno schema di database Oracle 10g piuttosto che riavviare i servizi di database Oracle?
Abbiamo diversi sviluppatori che utilizzano SQL Developer connettendosi allo stesso schema su un singolo server Oracle 10g. Il problema è che quando vogliamo eliminare lo schema per ricostruirlo, inevitabilmente qualcuno è ancora connesso e non possiamo eliminare lo schema del database o l'utente mentre qualcuno è ancora connesso.
Allo stesso modo, non vogliamo eliminare tutte le connessioni ad altri schemi perché altre persone potrebbero essere ancora connesse e testare con quegli schemi.
Qualcuno sa di un modo rapido per risolvere questo?
Per trovare le sessioni, utilizzare come DBA
select sid,serial# from v$session where username = '<your_schema>'
Se vuoi essere sicuro solo di ottenere le sessioni che utilizzano SQL Developer, puoi aggiungere and program = 'SQL Developer'
. Se desideri eliminare solo le sessioni appartenenti a uno sviluppatore specifico, puoi aggiungere una limitazione su os_user
Quindi uccidili con
alter system kill session '<sid>,<serial#>'
(per esempio.
alter system kill session '39,1232'
)
Potrebbe essere una query che produce istruzioni kill predefinite
select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'
Ciò restituirà un'istruzione kill per sessione per quell'utente - qualcosa del tipo:
alter system kill session '375,64855';
alter system kill session '346,53146';
Trova le sessioni esistenti su DB usando questa query:
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
vedrai qualcosa di simile al di sotto.
Quindi, esegui sotto la query con i valori estratti dai risultati precedenti.
ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>';
Esempio: ALTER SYSTEM KILL SESSION '93, 943 ';
la mia proposta è questo semplice blocco anonimo:
DECLARE
lc_username VARCHAR2 (32) := 'user-name-to-kill-here';
BEGIN
FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username)
LOOP
EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE');
END LOOP;
END;
/
Assicurarsi di modificare il sistema e abilitare la sessione limitata prima di ucciderli o che accederanno rapidamente al database prima di completare il lavoro.
basta usare SQL:
disconnect;
conn tiger/scott as sysdba;
Hai provato ALTER SYSTEM KILL SESSION? Ottieni il SID e il SERIAL # da V $ SESSION per ogni sessione nello schema indicato, quindi esegui
ALTER SCHEMA KILL SESSION sid, numero seriale;
Solo i miei due centesimi: il modo migliore (ma probabilmente non il più veloce a breve termine) sarebbe probabilmente quello di far lavorare ciascuno sviluppatore sulla propria istanza di database (vedi regola n. 1 per il lavoro di database ).
L'installazione di Oracle su una stazione di sviluppo è diventata un gioco da ragazzi da Oracle Database 10g Express Edition .