Як прибрати процеси неіснуючих сеансів в 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 інтерпретуватися.
Реалізувати цю техніку можна самостійно в якості вправи.
За додатковою інформацією звертайтеся в компанію Interface Ltd.