sql >> Databasteknik >  >> RDS >> Oracle

Hur man dödar en körande SELECT-sats

När du fortsätter att få sidor med resultat antar jag att du startade sessionen i SQL*Plus. Om så är fallet är det lätta att göra att bash ctrl + paus många, många gånger tills det tar stopp.

Ju mer komplicerat och det mer generiska sättet/sätten beskriver jag nedan i ordningsföljd efter ökande grymhet/ondska. Den första kommer förmodligen att fungera för dig, men om den inte gör det kan du fortsätta att flytta ner på listan.

De flesta av dessa rekommenderas inte och kan få oavsiktliga konsekvenser.


1. Oracle-nivå - Döda processen i databasen

Enligt ObiWanKenobis svar och ALTER SESSION-dokumentationen

alter system kill session 'sid,serial#';

För att hitta sid , sessions-id och serial# , serienummer, kör följande fråga - sammanfattad från OracleBase - och hitta din session:

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'

Om du kör en RAC måste du ändra detta något för att ta hänsyn till de flera instanserna, inst_id är vad som identifierar dem:

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'

Den här frågan skulle också fungera om du inte kör en RAC.

Om du använder ett verktyg som PL/SQL Developer kommer sessionsfönstret också att hjälpa dig att hitta det.

För ett lite starkare "döda" kan du ange nyckelordet IMMEDIATE, som instruerar databasen att inte vänta på att transaktionen ska slutföras:

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

2. OS-nivå - Utfärda ett SIGTERM

kill pid

Detta förutsätter att du använder Linux eller en annan *nix-variant. En SIGTERM är en termineringssignal från operativsystemet till den specifika processen som ber det att sluta köra. Den försöker låta processen avslutas på ett elegant sätt.

Om du gör fel kan det leda till att du avslutar viktiga OS-processer så var försiktig när du skriver.

Du kan hitta pid , process-id, genom att köra följande fråga, som också ger dig användbar information som terminalen som processen körs från och användarnamnet som kör den så att du kan se till att du väljer rätt.

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

Återigen, om du kör en RAC måste du ändra detta något till:

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

Ändra where sats till where s.status = 'KILLED' hjälper dig att hitta redan dödade processer som fortfarande "körs".

3. OS - Utfärda en SIGKILL

kill -9 pid

Använder samma pid du plockade upp i 2, en SIGKILL är en signal från operativsystemet till en specifik process som gör att processen avslutas omedelbart. Återigen var försiktig när du skriver.

Detta borde sällan vara nödvändigt. Om du gjorde DML eller DDL kommer det att stoppa all återställning som bearbetas och kan gör det svårt att återställa databasen till ett konsekvent tillstånd i händelse av fel.

Alla återstående alternativ kommer att döda alla sessioner och resultera i att din databas - och i fallet med 6 och 7 server också - blir otillgänglig. De ska bara användas om det är absolut nödvändigt...

4. Oracle - Stäng av databasen

shutdown immediate

Detta är faktiskt artigare än en SIGKILL , även om det uppenbarligen verkar på alla processer i databasen snarare än din specifika process. Det är alltid bra att vara artig mot din databas.

Stängning av databasen bör endast göras med din DBAs samtycke, om du har en. Det är trevligt att berätta för personerna som använder databasen också.

Den stänger databasen, avslutar alla sessioner och gör en rollback på alla oengagerade transaktioner. Det kan ta ett tag om du har stora oengagerade transaktioner som behöver rullas tillbaka.

5. Oracle - Stäng av databasen (det mindre trevliga sättet)

shutdown abort

Detta är ungefär detsamma som en SIGKILL , dock återigen på alla processer i databasen. Det är en signal till databasen att stoppa allt omedelbart och dö - en hård krasch. Den avslutar alla sessioner och gör ingen återställning; på grund av detta kan det innebära att databasen tar längre tid att startup på nytt. Trots brandspråket avbryts shutdown abort är inte ren ondska och kan normalt användas säkert.

Som tidigare informera folk de relevanta personerna först.

6. OS - Starta om servern

reboot

Uppenbarligen stoppar detta inte bara databasen utan även servern så använd med försiktighet och med samtycke från dina systemadministratörer förutom DBA:er, utvecklare, klienter och användare.

7. OS - Sista etappen

Jag har haft omstart som inte fungerade... När du har nått det här stadiet är det bättre att hoppas att du använder en virtuell dator. Det slutade med att vi tog bort det...



  1. Hur man använder Bulk Collect-klausul med SELECT INTO-sats i Oracle Database

  2. Översikt över datakomprimering i SQL Server

  3. mysql trigger lagrad trigger används redan av satsen som anropade lagrad trigger

  4. Hur löser man tvetydiga kolumnnamn när man hämtar resultat?