Як прибрати процеси в oracle

Як прибрати процеси неіснуючих сеансів

На розхожому нині жаргоні заголовок міг би звучати так: "Як прибрати трупи (убитих сеансів)". Цікаво, що таке назва звучала б точно.

Як відомо, кожен сеанс зв'язку клієнтської програми з СУБД Oracle реалізується за допомогою "серверного процесу", що виникає на комп'ютері, де працює СУБД. Але сеанс може перерватися аварійно (наприклад, через ненормального завершення роботи клієнтської програми або в результаті видачі адміністратором БД команди ALTER SYSTEM KILL SESSION) і тоді, за логікою речей серверний процес, який обслуговував сеанс, повинен прірву. Іноді, однак, цього не відбувається, і адміністратор спостерігає на сервері все зростаючий перелік "мертвих" серверних процесів. Чому - окрема розмова, і у розробників Oracle знайдеться, мабуть, своє виправдання, але так далеко заходити не всі адміністратори мають можливість. Важливо, що "мертві" серверні процеси як мінімум витрачають оперативну пам'ять, якій колись може не вистачити, і що з цим можна боротися.

З процедурної точки зору кожна конкретна програма під назвою "екземпляр СУБД Oracle" складається з "набору взаємодіючих процесів" (документація). Кожен активний сеанс зв'язку клієнтської програми з екземпляром СУБД реалізується одним таким процесом (серверним).

Список процесів в складі СУБД можна подивитися в динамічної таблиці V $ PROCESS:

SELECT addr, spid, program, pga_used_mem
FROM v $ process;

Список сеансів зв'язку, встановлених клієнтськими програмами з СУБД можна подивитися в динамічної таблиці V $ SESSION:

SELECT sid, serial #, paddr, status, terminal, program
FROM v $ session;

Якщо з'єднати дві таблиці за умовою V $ PROCESS.ADDR = V $ SESSION.PADDR, отримаємо інформацію про сеанси, їх станах і номери фізичних процесів СУБД для них:

SELECT p.spid, p.program, s.program, s.terminal, s.status
FROM v $ process p, v $ session s
WHERE p.addr = s.paddr;

(Бажаючі можуть видати і інші поля, впоравшись про їхній зміст в документації).

Звільнення марно зайнятих ресурсів СУБД досягається шляхом видалення в ОС процесу (нитки), що реалізує процес Oracle, відповідний "убитому" сеансу. Для такого видалення в складі ПО Oracle є спеціальна програма orakill, параметрами якої даються номер процесу (нитки) ОС (беремо з поля V $ PROCESS.SPID) і ім'я екземпляра СУБД (ORACLE_SID):

orakill ORACLE_SID номер_процесса_ (нитки)

Як скористатися цією програмою - справа техніки. Наприклад, можна побудувати запит типу

SELECT 'HOST orakill' || i.instance_name || '' || p.spid
FROM v $ process p, v $ session s, v $ instance i
WHERE p.addr = s.paddr AND
s.status = 'KILLED';

і окайміть його командами SQL * Plus SPOOL і START (а також відключити видачу заголовка) і вийшов таким чином сценарій SQL * Plus запускати зовнішніми засобами (cron, або програмою at, або за допомогою консолі Oracle Enterprise Manager) з бажаною регулярністю. Цим сценарієм результат запиту вище буде надходити в файл у вигляді, приблизно таке:

HOST orakill teacher 2056
HOST orakill teacher 1628
HOST orakill teacher 1604
HOST orakill teacher 1556
.

а потім командою START інтерпретуватися.

Схожі статті