Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zabić uruchomioną instrukcję SELECT

Ponieważ wciąż otrzymujesz strony wyników, zakładam, że rozpocząłeś sesję w SQL*Plus. Jeśli tak, najłatwiej jest wcisnąć ctrl + przerwa wiele, wiele razy, aż się zatrzyma.

Bardziej skomplikowane i bardziej ogólne sposoby opisuję poniżej w kolejności wzrastającej zaciekłości/zła. Pierwsza z nich prawdopodobnie będzie dla Ciebie odpowiednia, ale jeśli nie, możesz przesuwać się w dół listy.

Większość z nich nie jest zalecana i może mieć niezamierzone konsekwencje.


1. Poziom Oracle - Zabij proces w bazie danych

Zgodnie z odpowiedzią ObiWanKenobi i dokumentacją ALTER SESSION

alter system kill session 'sid,serial#';

Aby znaleźć sid , identyfikator sesji i serial# , numer seryjny, uruchom następujące zapytanie — podsumowane z OracleBase — i znajdź swoją sesję:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

Jeśli korzystasz z RAC, musisz to nieco zmienić, aby uwzględnić wiele wystąpień, inst_id jest tym, co je identyfikuje:

select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

To zapytanie zadziała również, jeśli nie korzystasz z RAC.

Jeśli używasz narzędzia takiego jak PL/SQL Developer, okno sesji również pomoże ci je znaleźć.

Dla nieco silniejszego „zabicia” możesz określić słowo kluczowe IMMEDIATE, które instruuje bazę danych, aby nie czekała na zakończenie transakcji:

alter system kill session 'sid,serial#' immediate;

2. Poziom systemu operacyjnego - Wydaj SIGTERM

kill pid

Zakłada to, że używasz Linuksa lub innego wariantu *nix. SIGTERM jest sygnałem zakończenia z systemu operacyjnego do określonego procesu, proszącym go o zatrzymanie działania. Próbuje pozwolić, aby proces zakończył się pomyślnie.

Pomyłka może spowodować zakończenie podstawowych procesów systemu operacyjnego, więc zachowaj ostrożność podczas pisania.

Możesz znaleźć pid , identyfikator procesu, uruchamiając następujące zapytanie, które poda również przydatne informacje, takie jak terminal, z którego uruchomiony jest proces, i nazwa użytkownika, który go uruchamia, dzięki czemu możesz upewnić się, że wybrałeś właściwy.

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Jeszcze raz, jeśli korzystasz z RAC, musisz to nieco zmienić, aby:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Zmiana where klauzula where s.status = 'KILLED' pomoże Ci znaleźć już zabity proces, który wciąż "działa".

3. System operacyjny - Wydaj SIGKILL

kill -9 pid

Używając tego samego pid odebrałeś w 2, SIGKILL jest sygnałem z systemu operacyjnego do określonego procesu, który powoduje natychmiastowe zakończenie procesu. Jeszcze raz zachowaj ostrożność podczas pisania.

Rzadko powinno to być konieczne. Jeśli robiłeś DML lub DDL, zatrzyma to przetwarzanie cofania i może utrudniać odzyskanie bazy danych do spójnego stanu w przypadku awarii.

Wszystkie pozostałe opcje zabiją wszystkie sesje i spowodują, że Twoja baza danych - aw przypadku serwerów 6 i 7 również - stanie się niedostępna. Powinny być używane tylko wtedy, gdy jest to absolutnie konieczne...

4. Wyrocznia - Zamknij bazę danych

shutdown immediate

To jest właściwie grzeczniejsze niż SIGKILL , choć oczywiście działa na wszystkie procesy w bazie danych, a nie na konkretny proces. To zawsze dobrze być uprzejmym dla swojej bazy danych.

Wyłączanie bazy danych powinno odbywać się wyłącznie za zgodą administratora bazy danych, jeśli taką posiadasz. Miło jest również powiedzieć ludziom, którzy korzystają z bazy danych.

Zamyka bazę danych, przerywając wszystkie sesje i wykonuje rollback na wszystkich niezrealizowanych transakcjach. Może to trochę potrwać, jeśli masz duże niezatwierdzone transakcje, które należy wycofać.

5. Wyrocznia - Zamknij bazę danych (mniej przyjemny sposób)

shutdown abort

To mniej więcej to samo, co SIGKILL , choć ponownie na wszystkich procesach w bazie danych. To sygnał do bazy danych, aby natychmiast wszystko zatrzymać i zginąć – ciężki krach. Kończy wszystkie sesje i nie wycofuje; z tego powodu może to oznaczać, że startup bazy danych trwa dłużej ponownie. Pomimo języka zapalającego shutdown abort nie jest czystym złem i można z niego normalnie korzystać.

Tak jak poprzednio, najpierw poinformuj ludzi o odpowiednich ludziach.

6. System operacyjny - Zrestartuj serwer

reboot

Oczywiście to nie tylko zatrzymuje bazę danych, ale także serwer, więc używaj go ostrożnie i za zgodą administratorów, oprócz administratorów baz danych, programistów, klientów i użytkowników.

7. System operacyjny - Ostatni etap

Ponowne uruchomienie nie działało ... Po osiągnięciu tego etapu lepiej mieć nadzieję, że używasz maszyny wirtualnej. Skończyło się na usunięciu go...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Miej dane wyjściowe PL/SQL w czasie rzeczywistym

  2. Jak ręcznie skonfigurować Glassfish Server w środowisku Eclipse?

  3. cx_Oracle:Jak mogę otrzymać każdy wiersz jako słownik?

  4. Wydajność SUBSTR na CLOB

  5. Jak zmniejszyć tabelę temp w Oracle?