it-swarm.com.de

So beenden Sie eine laufende SELECT-Anweisung

Wie kann ich eine laufende SELECT-Anweisung durch Beenden der Sitzung beenden?

Der Befehl gibt mir ständig eine Ausgabe basierend auf der SELECT-Anweisung. Ich möchte sie dazwischen stoppen.

44
Ashish Anand

W miarę otrzymywania stron wyników zakładam, że rozpocząłeś sesję w SQL * Plus. Jeśli tak, najłatwiej jest to zrobićctrl+breakwiele, wiele razy, aż się zatrzyma.

Bardziej skomplikowany i bardziej ogólny sposób (sposoby), które opisuję poniżej, w kolejności rosnącej zaciekłości/zła. Pierwszy z nich będzie prawdopodobnie działał dla ciebie, ale jeśli nie, możesz nadal poruszać się w dół listy.

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


1. Poziom Oracle - Zabij verarbeitet Bazie Danych

Zgodnie z odpowiedź ObiWanKenobi i dokumentacja ALTER SESSION

alter system kill session 'sid,serial#';

Aby znaleźć sid, identyfikator sesji i serial#, number seryjny, uruchom następujące zapytanie - podsumowane od 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 używasz RAC , musisz zmienić to nieco, aby wziąć pod uwagę wiele instancji, 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'

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

Jeśli używasz narzędzia takiego jak PL/SQL-Entwickler, okno sesji również pomoże Ci go znaleźć.

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

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

2. Poziom systemu operacyjnego - Wydanie a SIGTERM

kill pid

Zakłada się, że używasz Linuksa lub innego wariantu * nix. A SIGTERM to sygnał zakończenia z systemu operacyjnego do określonego procesu z prośbą o zatrzymanie działania. Próbuje zakończyć proces z wdziękiem.

Złe zrozumienie może spowodować przerwanie podstawowych procesów systemu operationjnego, dlatego należy zachować ostrożność podczas pisania.

Możesz znaleźć pid, identyfikator procesu, uruchamiając następującą kwerendę, która poinformuje cię także o użytecznych informacjach, takich jak Terminal, z którego jest uruchamiany Vorarb, oraz nazwę użytkownika, która gehen uruchamia, dzięki czemu możesz upewnić się, że wybrałeś Poprawny.

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 używasz RAC, musisz zmienić bis nieco na:

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

Zmiana klauzuli where na where s.status = 'KILLED' pomoże ci znaleźć już zabity proces, który nadal działa.

3. OS - Wydanie a SIGKILL

kill -9 pid

Używając tego samego pid pobranego w 2, a SIGKILL Sie können den Vorgang des Systems und die Ausführung des Vorgangs jederzeit ändern. Jeszcze raz bądź ostrożny podczas pisania.

To rzadko powinno być konieczne. Jeśli robiłeś DML lub DDL to zatrzyma proces wycofywania i może utrudnić odzyskać bazę danych do spójnego stanu w przypadku awarii

Wszystkie pozostałe opcje zabijają wszystkie sesje i skutkują twoją bazą danych - aw przypadku serwera 6 i 7 - stają się niedostępne. Powinny być używane tylko wtedy, gdy jest to absolutnie konieczne ...

4. Oracle - Shutdown Baza Danych

shutdown immediate

W rzeczywistości jest to politer niż SIGKILL, wählen Sie oczywiście działa auf na wszystkie procesy w bazie danych, eine nie na określony proces. Jest to zawsze dobre do bycia uprzejmym dla twojej bazy danych.

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

Zamyka bazę danych, kończy wszystkie sesje i wykonuje rollback wir wszystkich niezatwierdzonych transakcjach. Może zająć trochę czasu, jeśli masz duże niezatwierdzone transakcje, które należy wycofać.

5. Oracle - Zamknij bazę danych (mniej miły sposób)

shutdown abort

Jest to w przybliżeniu to samo co SIGKILL, chociaż ponownie we wszystkich procesach w bazie danych. Zu tun, um bazy danych, aby natychmiast zatrzymać wszystko i umrzeć - ciężki wypadek. Kończy wszystkie sesje i nie wycofuje się; z tego powodu może to oznaczać, że baza danych trwa dłużej do startup ponownie. Pomimo języka zapalającego shutdown abort nie jest czystym złem i można go normalnie używać bezpiecznie.

Jak wcześniej informuj ludzi o odpowiednich osobach.

6. OS - Uruchom ponownie 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. OS - Ostatni etap

Nie udało mi się ponownie uruchomić komputera ... Po osiągnięciu tego etapu lepiej mieć nadzieję, że używasz maszyny wirtualnej. Skończyło się na usuwaniu go ...

69
Ben

Das ist was ich benutze. Ich mache diese erste Abfrage, um die Sitzungen und die Benutzer zu finden:

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

Dies zeigt mir an, ob für denselben Benutzer mehrere Sitzungen vorhanden sind. Dann überprüfe ich normalerweise, ob eine Sitzung die Datenbank blockiert.

SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;  

Dann führe ich eine ALTER-Anweisung aus, um eine bestimmte Sitzung in diesem Format zu beenden:

ALTER SYSTEM KILL SESSION 'sid,serial#'; 

Zum Beispiel:

ALTER SYSTEM KILL SESSION '314, 2643';
4
James Drinkard

Es ist nicht notwendig, die gesamte Sitzung zu beenden. In Oracle 18c können Sie ALTER SYSTEM CANCEL verwenden:

Abbrechen einer SQL-Anweisung in einer Sitzung

Sie können eine SQL-Anweisung in einer Sitzung mit der SQL-Anweisung ALTER SYSTEM CANCEL abbrechen.

Anstatt eine Sitzung zu beenden, können Sie eine SQL-Anweisung mit hoher Last in einer Sitzung abbrechen. Wenn Sie eine DML-Anweisung abbrechen, wird die Anweisung zurückgesetzt.

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

Wenn @INST_ID nicht angegeben ist, wird die Instanz-ID der aktuellen Sitzung verwendet.

Wenn keine SQL_ID angegeben ist, wird die aktuell ausgeführte SQL-Anweisung in der angegebenen Sitzung beendet.

3
Lukasz Szozda

Um eine Sitzung in Oracle zu beenden, verwenden Sie den Befehl ALTER SYSTEM KILL SESSION.

Details hier: http://www.Oracle-base.com/articles/misc/KillingOracleSessions.php

2
ObiWanKenobi

Oh! Ich habe nur die fraglichen Kommentare gelesen, ich habe es vermisst. Lassen Sie die Antwort einfach hier sein, falls sie für eine andere Person nützlich sein kann

Ich habe "Strg + C" und "Strg + Pause" ausprobiert. Ich habe SQL Plus verwendet, das mit Oracle Client 10.2.0.1.0 geliefert wurde. SQL Plus wird von den meisten als Client für die Verbindung mit Oracle DB verwendet. Ich habe die Option Abbrechen im Menü Datei verwendet und die Ausführung wurde angehalten!

File Menu, Oracle SQL*Plus

Wenn Sie auf Datei klicken und einige Minuten warten, wird der Auswahlbefehl angehalten und das Menü erscheint. Klicken Sie auf Abbrechen.

0
Shiva