Wiki source code of Универсальный скрипт отстрела всех сессий
Last modified by Александр Таболин on 2023/11/03 23:12
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | Это скрипт на языке PL/SQL, который используется для работы с базами данных Oracle. Скрипт предназначен для уничтожения всех сеансов того же кассира, которые имеют транзакцию более двух минут и неактивны тоже более двух минут. | ||
| 2 | |||
| 3 | (% style="font-size: 14px; font-family: Consolas; background-color:#fbfdff" %) | ||
| 4 | begin | ||
| 5 | for cSes in | ||
| 6 | ( select | ||
| 7 | s.sid | ||
| 8 | /*, s.serial# | ||
| 9 | , s.module, s.program | ||
| 10 | , s.action, s.client_info | ||
| 11 | , (sysdate-t.start_date) day(3) to second(0) as | ||
| 12 | tran_dur*/ | ||
| 13 | from v$session me, v$session s, v$transaction t | ||
| 14 | where me.sid = sys_context('userenv', 'sid') -- я-- | ||
| 15 | and s.username = me.username -- та же схема-- | ||
| 16 | and decode(s.client_info, me.client_info, '=') = '=' | ||
| 17 | -- тот же пользователь программы-- | ||
| 18 | and s.status = 'INACTIVE' -- неактивная сессия-- | ||
| 19 | and t.addr = s.taddr -- есть транзакция-- | ||
| 20 | and (sysdate-t.start_date) day(3) to second(0) > | ||
| 21 | interval '2' minute -- длительность транзакции-- | ||
| 22 | and s.LAST_CALL_ET/60 > 2 -- длительность неактивности (минут)-- | ||
| 23 | ) loop | ||
| 24 | dbms_output.put_line('Killing sid='||cSes.sid); | ||
| 25 | un$adm.autokill(p_sid=>cSes.sid, p_force=>true); | ||
| 26 | end loop; | ||
| 27 | end; | ||
| 28 | |||
| 29 | |||
| 30 | Скрипт использует следующие объекты и функции: | ||
| 31 | |||
| 32 | • v$session - это представление, которое содержит информацию о текущих сеансах базы данных, такую как идентификатор сеанса (sid), имя пользователя (username), статус сеанса (status), информация о клиенте (client_info) и т.д. | ||
| 33 | |||
| 34 | • v$transaction - это представление, которое содержит информацию о текущих транзакциях базы данных, такую как адрес транзакции (addr), дата начала транзакции (start_date) и т.д. | ||
| 35 | |||
| 36 | • sys_context - это функция, которая возвращает значение атрибута контекста, такого как идентификатор текущего сеанса (sid) или имя текущего пользователя (user). | ||
| 37 | |||
| 38 | • decode - это функция, которая сравнивает два значения и возвращает третье значение в зависимости от результата сравнения. Например, decode(s.client_info, me.client_info, '=') возвращает '=', если значения s.client_info и me.client_info равны, и null, если они не равны. | ||
| 39 | |||
| 40 | • interval - это тип данных, который представляет собой интервал времени, такой как '2' minute или '3' hour. Интервалы можно использовать для вычисления разницы между двумя датами или для добавления или вычитания интервалов к датам. | ||
| 41 | |||
| 42 | • dbms_output.put_line - это процедура, которая выводит строку в стандартный выходной поток. Это может быть полезно для отладки или логирования скриптов. | ||
| 43 | |||
| 44 | • un$adm.autokill - это процедура, которая уничтожает сеанс по его идентификатору (p_sid) и принимает параметр p_force, который указывает, нужно ли принудительно завершить сеанс или нет. | ||
| 45 | |||
| 46 | Скрипт работает следующим образом: | ||
| 47 | |||
| 48 | • Сначала он находит идентификатор текущего сеанса (me.sid) с помощью функции sys_context. | ||
| 49 | |||
| 50 | • Затем он выбирает все сеансы, которые удовлетворяют следующим условиям: | ||
| 51 | |||
| 52 | • Они имеют то же имя пользователя (s.username), что и текущий сеанс. | ||
| 53 | |||
| 54 | • Они имеют ту же информацию о клиенте (s.client_info), что и текущий сеанс. Это может означать, что они принадлежат тому же кассиру. | ||
| 55 | |||
| 56 | • Они неактивны (s.status = 'INACTIVE'). | ||
| 57 | |||
| 58 | • Они имеют транзакцию (t.addr = s.taddr). | ||
| 59 | |||
| 60 | • Длительность транзакции больше двух минут ((sysdate-t.start_date) day(3) to second(0) > interval '2' minute). | ||
| 61 | |||
| 62 | • Длительность неактивности больше двух минут (s.LAST_CALL_ET/60 > 2). | ||
| 63 | |||
| 64 | • Для каждого такого сеанса он выводит его идентификатор (cSes.sid) с помощью процедуры dbms_output.put_line и вызывает процедуру un$adm.autokill с параметрами p_sid=cSes.sid и p_force=true, чтобы уничтожить сеанс. |