Typickým příkladem je situace, kdy vývojář spustí v databázi nějaký nevyladěný dotaz a ten začne neúměrně spotřebovávat zdroje v databázi. Nejčastěji se jedná o CPU. Vy to zjistíte například přes databázovou konzoli. V takovém případě je nejjednodušší dané připojení „killnout“ pomocí příkazu:ALTER SYSTEM KILL SESSION ‚sid,serial#‘ IMMEDIATE;nebo ve verzi 11g je i další příkazALTER SYSTEM DISCONNECT SESSION ‚sid,serial#‘ IMMEDIATE;

Přesto se může stát, že dané připojení stále visí v databázi a to i přestože je označené jako KILLED. Tohle je obvyklé, je-li potřeba provést ROLLBACK, ale trvá-li daný rollback nepřiměřeně dlouho je jasné, že nemáte na výběr a musíte session odstranit na úrovni operačního systému. V unixech vám k tomu dopomůže příkaz kill.

1) Nejdříve však musíte dané připojení jednoznačně identifikovat.

SQL> SET LINESIZE 100COLUMN spid FORMAT A10COLUMN username FORMAT A10COLUMN program FORMAT A45SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,s.programFROM gv$session sJOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_idWHERE s.type != ‚BACKGROUND‘ and sid=287;INST_ID SID SERIAL# SPID USERNAME PROGRAM———- ———- ———- ———- ———- ———————————————1 287 25938 18146 TEST SQL DeveloperSQL> select username, status from v$session where status=’KILLED‘;USERNAME STATUS———- ——–TEST KILLED

2) Odstranění procesu z OS

oracle@test:~> ps -ef | grep 18146oracle 18146 1 95 Mar15 ? 21:31:08 oracleprod (LOCAL=NO)oracle 18418 14337 0 07:54 pts/0 00:00:00 grep 18146oracle@test:~> kill -9 18146

3) Kontrola, že je session opravdu odstraněná

SQL> select username, status from v$session where status=’KILLED‘;no rows selectedSQL> SQL> SET LINESIZE 100COLUMN spid FORMAT A10COLUMN username FORMAT A10COLUMN program FORMAT A45SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,s.programFROM gv$session sJOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_idWHERE s.type != ‚BACKGROUND‘ and sid=287;no rows selected



Komentáře