Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да убия работещ оператор SELECT

Докато продължавате да получавате страници с резултати, предполагам, че сте започнали сесията в SQL*Plus. Ако е така, лесното нещо, което трябва да направите, е да ударите ctrl + прекъсване много, много пъти, докато спре.

Колкото по-сложен и по-общ начин(и) описвам по-долу в реда на нарастване на свирепост/зло. Първият вероятно ще работи за вас, но ако не стане, можете да продължите да се движите надолу по списъка.

Повечето от тях не се препоръчват и могат да имат непредвидени последици.


1. Ниво на Oracle - Убийте процеса в базата данни

Според отговора на ObiWanKenobi и документацията ALTER SESSION

alter system kill session 'sid,serial#';

За да намерите sid , идентификатор на сесията и serial# , сериен номер, изпълнете следната заявка - обобщена от OracleBase - и намерете своята сесия:

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'

Ако използвате RAC, тогава трябва да промените това леко, за да вземете предвид множеството екземпляри, inst_id е това, което ги идентифицира:

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'

Тази заявка ще работи и ако не използвате RAC.

Ако използвате инструмент като PL/SQL Developer, прозорецът на сесиите също ще ви помогне да го намерите.

За малко по-силно „убиване“ можете да посочите ключовата дума IMMEDIATE, която инструктира базата данни да не чака транзакцията да завърши:

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

2. Ниво на ОС - Издайте SIGTERM

kill pid

Това предполага, че използвате Linux или друг вариант *nix. A SIGTERM е сигнал за прекратяване от операционната система към конкретния процес, който го моли да спре да работи. Опитва се да позволи на процеса да приключи грациозно.

Неправилното приемане на това може да доведе до прекратяване на основни процеси на ОС, така че бъдете внимателни, когато пишете.

Можете да намерите pid , идентификатор на процеса, като изпълните следната заявка, която също ще ви каже полезна информация като терминала, от който се изпълнява процесът, и потребителското име, което го изпълнява, за да можете да сте сигурни, че сте избрали правилния.

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

Още веднъж, ако използвате RAC, трябва леко да промените това на:

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

Промяна на where клауза до where s.status = 'KILLED' ще ви помогне да намерите вече убит процес, който все още "работи".

3. ОС - Издайте SIGKILL

kill -9 pid

Използване на същия pid взехте в 2, SIGKILL е сигнал от операционната система към конкретен процес, който кара процеса да приключи незабавно. Още веднъж бъдете внимателни, когато пишете.

Това рядко трябва да се налага. Ако сте правили DML или DDL, това ще спре обработката на всяко връщане назад и може затрудняват възстановяването на базата данни до последователно състояние в случай на повреда.

Всички останали опции ще убият всички сесии и ще доведат до това, че вашата база данни - и в случай на 6 и 7 сървър също - ще стане недостъпна. Те трябва да се използват само ако е абсолютно необходимо...

4. Оракул - Изключете базата данни

shutdown immediate

Това всъщност е вежливо от SIGKILL , въпреки че очевидно действа върху всички процеси в базата данни, а не върху вашия конкретен процес. Това е винаги добре е да бъдете учтиви към вашата база данни.

Изключването на базата данни трябва да става само със съгласието на вашия DBA, ако имате такъв. Хубаво е да кажете и на хората, които използват базата данни.

Той затваря базата данни, прекратява всички сесии и прави rollback за всички неизвършени транзакции. Може да отнеме известно време, ако имате големи незаети транзакции, които трябва да бъдат отменени.

5. Оракул - Изключете базата данни (по-малко хубавият начин)

shutdown abort

Това е приблизително същото като SIGKILL , но още веднъж за всички процеси в базата данни. Това е сигнал към базата данни да спре всичко незабавно и да умре - тежък срив. Той прекратява всички сесии и не прави връщане назад; поради това може да означава, че startup на базата данни отнема повече време отново. Въпреки запалителния език shutdown abort не е чисто зло и обикновено може да се използва безопасно.

Както преди, информирайте хората първо съответните хора.

6. ОС - Рестартирайте сървъра

reboot

Очевидно това не само спира базата данни, но и сървъра, така че използвайте с повишено внимание и със съгласието на вашите системни администратори в допълнение към администраторите на база данни, разработчиците, клиентите и потребителите.

7. ОС - Последният етап

Имах рестартиране не работи... След като стигнете до този етап, по-добре се надявате, че използвате VM. Накрая го изтрихме...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите века от дата в Oracle

  2. ORA-12505, TNS:слушателят в момента не знае за SID, даден в connect des

  3. Активиране на SSL или TLS в Oracle Apps R12

  4. Какво всъщност използва LISTAGG с ORDER BY NULL като критерии за поръчка?

  5. Функция ABS() в Oracle