sql >> Databáze >  >> RDS >> Oracle

Jak zabít běžící příkaz SELECT

Jak stále dostáváte stránky s výsledky, předpokládám, že jste relaci zahájili v SQL*Plus. Pokud ano, je snadné provést bash ctrl + přestávka mnohokrát, dokud se nezastaví.

Složitější a obecnější způsob (způsoby) podrobně uvádím níže v pořadí zvyšující se zuřivost / zlo. První z nich bude pravděpodobně fungovat pro vás, ale pokud ne, můžete pokračovat v pohybu v seznamu.

Většina z nich se nedoporučuje a může mít nezamýšlené následky.


1. Úroveň Oracle - Zabijte proces v databázi

Podle odpovědi ObiWanKenobiho a dokumentace ALTER SESSION

alter system kill session 'sid,serial#';

Chcete-li najít sid , ID relace a serial# , sériové číslo, spusťte následující dotaz – shrnutý z OracleBase – a najděte svou relaci:

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'

Pokud provozujete RAC, musíte toto mírně změnit, aby se zohlednilo více instancí, inst_id je to, co je identifikuje:

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'

Tento dotaz by také fungoval, pokud nepoužíváte RAC.

Pokud používáte nástroj, jako je PL/SQL Developer, pak vám jej pomůže najít také okno relace.

Pro trochu silnější "zabití" můžete zadat klíčové slovo IMMEDIATE, které dá databázi pokyn, aby nečekala na dokončení transakce:

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

2. Úroveň operačního systému – Vydejte SIGTERM

kill pid

To předpokládá, že používáte Linux nebo jinou variantu *nix. SIGTERM je signál ukončení z operačního systému do konkrétního procesu, který jej žádá o zastavení běhu. Snaží se nechat proces řádně ukončit.

Pokud to uděláte špatně, může to vést k ukončení základních procesů operačního systému, takže buďte při psaní opatrní.

Můžete najít pid , ID procesu, spuštěním následujícího dotazu, který vám také sdělí užitečné informace, jako je terminál, ze kterého proces běží, a uživatelské jméno, které jej spouští, abyste se mohli ujistit, že vyberete to správné.

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

Ještě jednou, pokud provozujete RAC, musíte to mírně změnit na:

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

Změna where klauzule na where s.status = 'KILLED' vám pomůže najít již zabitý proces, který stále "běží".

3. OS - Vydejte SIGKILL

kill -9 pid

Pomocí stejného pid jste si vyzvedli za 2, SIGKILL je signál z operačního systému do určitého procesu, který způsobí okamžité ukončení procesu. Opět buďte opatrní při psaní.

To by mělo být nutné jen zřídka. Pokud jste prováděli DML nebo DDL, zastaví se zpracování jakéhokoli vrácení zpět a může znesnadňují obnovu databáze do konzistentního stavu v případě selhání.

Všechny zbývající možnosti ukončí všechny relace a povedou k tomu, že se vaše databáze – av případě serveru 6 a 7 – stane nedostupnou. Měly by být používány pouze v případě, že je to naprosto nezbytné...

4. Oracle - Vypněte databázi

shutdown immediate

To je ve skutečnosti zdvořilejší než SIGKILL , i když zjevně působí na všechny procesy v databázi spíše než na váš konkrétní proces. Je to vždy je dobré být ke své databázi zdvořilý.

Vypnutí databáze by mělo být provedeno pouze se souhlasem vašeho DBA, pokud jej máte. Je hezké to říct i lidem, kteří databázi používají.

Uzavře databázi, ukončí všechny relace a provede rollback na všechny neprovedené transakce. Pokud máte velké nepotvrzené transakce, které je třeba vrátit zpět, může to chvíli trvat.

5. Oracle - Vypněte databázi (méně pěkný způsob)

shutdown abort

To je přibližně stejné jako SIGKILL , i když ještě jednou na všechny procesy v databázi. Je to signál pro databázi, aby vše okamžitě zastavila a zemřela – tvrdý pád. Ukončí všechny relace a neprovede žádné vrácení zpět; z tohoto důvodu to může znamenat, že startup databáze trvá déle znovu. Navzdory pobuřujícímu jazyku se shutdown abort není čisté zlo a lze jej normálně bezpečně používat.

Stejně jako dříve informujte nejprve příslušné osoby.

6. OS - Restartujte server

reboot

Je zřejmé, že to zastaví nejen databázi, ale i server, takže používejte opatrně a se souhlasem vašich systémových administrátorů, správců databází, vývojářů, klientů a uživatelů.

7. OS - Poslední fáze

Nefungoval mi restart... Jakmile dosáhnete této fáze, raději doufejte, že používáte VM. Nakonec jsme to smazali...



  1. Převeďte název měsíce na číslo měsíce v SQL Server

  2. Jak vytvořit databázi v MySQL Workbench pomocí GUI

  3. Použití poddotazu v příkazu Check v Oracle

  4. Je možné uváznutí při aktualizaci a odstraňování různých řádků v tabulce?