sql >> Database teknologi >  >> RDS >> Oracle

Sådan dræber du en kørende SELECT-sætning

Mens du bliver ved med at få sider med resultater, antager jeg, at du startede sessionen i SQL*Plus. Hvis det er tilfældet, er den nemme ting at gøre at bash ctrl + pause mange, mange gange, indtil det stopper.

Jo mere kompliceret og jo mere generisk måde(r) beskriver jeg nedenfor i rækkefølge efter stigende vildskab / ondskab. Den første vil sandsynligvis fungere for dig, men hvis den ikke gør det, kan du blive ved med at flytte ned på listen.

De fleste af disse anbefales ikke og kan have utilsigtede konsekvenser.


1. Oracle-niveau - Dræb processen i databasen

I henhold til ObiWanKenobis svar og ALTER SESSION-dokumentationen

alter system kill session 'sid,serial#';

For at finde sid , sessions-id og serial# , serienummer, kør følgende forespørgsel - opsummeret fra OracleBase - og find 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'

Hvis du kører en RAC, skal du ændre dette lidt for at tage højde for de mange forekomster, inst_id er det, der identificerer 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'

Denne forespørgsel ville også fungere, hvis du ikke kører en RAC.

Hvis du bruger et værktøj som PL/SQL Developer, vil sessionsvinduet også hjælpe dig med at finde det.

For et lidt stærkere "dræb" kan du angive IMMEDIATE nøgleordet, som instruerer databasen om ikke at vente på, at transaktionen er fuldført:

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

2. OS-niveau - Udsted en SIGTERM

kill pid

Dette forudsætter, at du bruger Linux eller en anden *nix-variant. En SIGTERM er et termineringssignal fra operativsystemet til den specifikke proces, der beder det stoppe med at køre. Den forsøger at lade processen afslutte elegant.

Hvis du tager fejl, kan det resultere i, at du afslutter væsentlige OS-processer, så vær forsigtig, når du skriver.

Du kan finde pid , proces-id, ved at køre følgende forespørgsel, som også vil fortælle dig nyttige oplysninger som den terminal, processen kører fra, og det brugernavn, der kører den, så du kan sikre dig, at du vælger den rigtige.

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

Endnu en gang, hvis du kører en RAC, skal du ændre dette lidt til:

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

Ændring af where klausul til where s.status = 'KILLED' vil hjælpe dig med at finde allerede dræbte processer, der stadig "kører".

3. OS - Udsted et SIGKILL

kill -9 pid

Bruger den samme pid du hentede i 2, en SIGKILL er et signal fra styresystemet til en bestemt proces, der får processen til at afslutte med det samme. Endnu en gang vær forsigtig, når du skriver.

Dette skulle sjældent være nødvendigt. Hvis du lavede DML eller DDL, vil det stoppe enhver tilbagerulning, der behandles og kan gøre det vanskeligt at genoprette databasen til en konsistent tilstand i tilfælde af fejl.

Alle de resterende muligheder vil dræbe alle sessioner og resultere i, at din database - og i tilfælde af 6 og 7 server også - bliver utilgængelig. De bør kun bruges, hvis det er absolut nødvendigt...

4. Oracle - Luk databasen

shutdown immediate

Dette er faktisk høfligere end et SIGKILL , selvom det naturligvis virker på alle processer i databasen i stedet for din specifikke proces. Det er altid godt at være høflig over for din database.

Nedlukning af databasen bør kun ske med samtykke fra din DBA, hvis du har en. Det er også rart at fortælle de personer, der bruger databasen.

Den lukker databasen, afslutter alle sessioner og foretager en rollback på alle uforpligtede transaktioner. Det kan tage et stykke tid, hvis du har store uforpligtede transaktioner, der skal rulles tilbage.

5. Oracle - Luk databasen (den mindre pæne måde)

shutdown abort

Dette er omtrent det samme som en SIGKILL , dog endnu en gang på alle processer i databasen. Det er et signal til databasen om at stoppe alt med det samme og dø - et hårdt nedbrud. Det afslutter alle sessioner og foretager ingen rollback; på grund af dette kan det betyde, at databasen tager længere tid at startup en gang til. På trods af det brændende sprog afbrydes en shutdown abort er ikke ren ondskab og kan normalt bruges sikkert.

Som før informere folk de relevante personer først.

6. OS - Genstart serveren

reboot

Dette stopper naturligvis ikke kun databasen, men også serveren, så brug med forsigtighed og med samtykke fra dine systemadministratorer ud over DBA'er, udviklere, klienter og brugere.

7. OS - Den sidste fase

Jeg har haft genstart ikke virkede... Når du har nået dette stadie, må du hellere håbe, at du bruger en VM. Vi endte med at slette det...



  1. Træk timer fra nu()-funktionen

  2. Sådan gendannes Galera Cluster- eller MySQL-replikation fra Split Brain Syndrome

  3. Sådan tjekker du MySQL-versionen

  4. Indstil standardværdien for en heltalskolonne SQLite