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

Проблема


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


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


Інформація про процеси і сеансах


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


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


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


Тут поле ADDR – адреса процесу в оперативній пам'яті, SPID – номер процесу ОС, що реалізує конкретний процес Oracle (власне процесу в Unix, або ж нитки в Windows). Поля PROGRAM і PGA_USED_MEM (обсяг власної пам'яті даних процесу) наведені для наочності.


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


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


Тут ADDR – адреса процесу, що реалізує даний сеанс, STATUS – стан сеансу; інші поля наведені для наочності (пара SID, SERIAL # – складовою ідентифікатор сеансу, на який і потрібно посилатися при його знищенні командою ALTER SYSTEM KILL SESSION). Якщо STATUS = "KILLED", сеанс уже "убитий", і такі-то сеанси іноді й доводиться "зачищати".


Якщо з'єднати дві таблиці за умовою 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 інтерпретуватися.


Реалізувати цю техніку можна самостійно як вправи.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*