2008-09-17 15 views
53

Czy istnieje lepszy sposób na wymuszenie rozłączenia wszystkich użytkowników ze schematu bazy danych Oracle 10g niż ponowne uruchomienie usług bazy danych Oracle?Odrzucanie podłączonego użytkownika ze schematu bazy danych Oracle 10g

Mamy kilku programistów używających programistów SQL łączących się z tym samym schematem na pojedynczym serwerze Oracle 10g. Problem polega na tym, że gdy chcemy upuścić schemat, aby go odbudować, nieuchronnie ktoś jest nadal podłączony i nie możemy upuścić schematu bazy danych lub użytkownika, gdy ktoś jest nadal podłączony.

Z tego samego powodu nie chcemy zrzucać wszystkich połączeń z innymi schematami, ponieważ inne osoby mogą nadal być połączone i testować za pomocą tych schematów.

Ktoś wie o szybkim sposobie rozwiązania tego problemu?

Odpowiedz

97

Aby znaleźć sesje, jako zastosowania DBA

select sid,serial# from v$session where username = '<your_schema>'

Jeśli chcesz mieć pewność, aby uzyskać tylko sesje, które używają SQL Developer, można dodać and program = 'SQL Developer'. Jeśli chcesz tylko do zabijania sesje należące do konkretnego dewelopera, można dodać ograniczenie os_user

Następnie zabić je

alter system kill session '<sid>,<serial#>'

(np alter system kill session '39,1232')

A zapytanie generujące gotowe instrukcje kasowania może być

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

ten powróci jedno oświadczenie zabitych na sesji dla tego użytkownika - coś takiego:

alter system kill session '375,64855';

alter system kill session '346,53146';

+0

Okazało się, że w naszym środowisku RAC, zabijając sesję często lewo to wisi, ale dowiedzieć się, identyfikator procesu i zabijając go z systemu operacyjnego zawsze pracował . – Jonathan

+4

mały dodatek - dodaj natychmiast do polecenia: 'wybierz 'zmień sesję zabicia systemu' '' || sid || "," || numer seryjny || "" "natychmiastowe;" z sesji v $ gdzie nazwa_użytkownika = ''; 'to zmusi polecenie – Michael

+0

fajną odpowiedzią. Dokładnie tego, czego szukałem. –

0

Czy próbowałeś ALTER SYSTEM KILL SESSION? Pobierz SID i SERIAL # z V $ SESSION dla każdej sesji w danym schemacie, a następnie zrobić

ALTER SCHEMA KILL SESSION sid, serial #;

0

tylko moje dwa centy: najlepszy sposób (ale prawdopodobnie nie najszybszy w krótkim okresie) prawdopodobnie będzie dla każdego programisty do pracy na jego własnej instancji bazy danych (patrz rule #1 for database work).

Instalacja Oracle na stacji deweloperskiej stała się niepojęta od Oracle Database 10g Express Edition.

+0

Tylko dla systemu Windows i niektórych odmian systemu Linux. –

+0

To naprawdę nie ma znaczenia dla pytania? – Konrads

+0

To może nie być odpowiedź, której szukał i doskonale rozumiem, dlaczego nie została ona bardzo mocno przegłosowana, ale myślę, że jest bardzo istotna, biorąc pod uwagę przypadek użycia, który specjalnie wysunął. Wielu programistów pracujących na tej samej bazie danych jest bardzo złym pomysłem, a ten problem zdecydowanie nie jest najgorszy, jaki się wydarzy. – Mac

1

Upewnij się, że zmieniasz system i włączasz ograniczoną sesję, zanim je zabijesz, lub szybko zalogują się ponownie do bazy danych, zanim wykonasz swoją pracę.

+2

Może być łatwiejsze i mniej inwazyjne, aby zablokować użytkownika, który zamierza upuścić, a następnie zabić wszystkie połączone sesje tego użytkownika, a następnie upuścić i ponownie utworzyć. Nie trzeba niepotrzebnie ograniczać dostępu do innych użytkowników. –

1

wystarczy użyć SQL:

disconnect; 

conn tiger/scott as sysdba; 
15

Znajdź istniejące sesje DB przy użyciu tej kwerendy:

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

zobaczysz coś takiego jak poniżej. Oracle Sessions

Następnie uruchom poniżej zapytanie z wartościami uzyskanymi z powyższych wyników.

ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>'; 

Np ALTER SYSTEM kill sesja '93, 943' ;

7

moja propozycja jest to proste anonimowy blok:

DECLARE 
    lc_username VARCHAR2 (32) := 'your user name 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; 
/
+1

lepiej zapamiętać ospid przed zabiciem sesji, mogą utknąć – user3380585

Powiązane problemy