Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Отключение конкретной сессии / всех сессий

Добрый день! Есть темповая таблица, которую необходимо альтернуть (добавить столбец). Понятное дело, при 300 активных сессиях кто-то эту таблицу использует - из за этого валится ora-14450.
Могу я как то отследить, какая именно сессия обращается к необходимой мне таблице? И alter system kill ...?
Если же это отследить невозможно - как отключить все активные сессии?


Ответ

Получить информацию о сессиях, использующих временную таблицу можно следующим запросом:
select s.* from v$lock l, dba_objects d, v$session s where d.owner='СХЕМА' and d.OBJECT_NAME='ИМЯ-ТАБЛИЦЫ' and l.id1=d.object_id and l.type='TO' and s.sid=l.sid
далее сессии можно убить с помощью ALTER SYSTEM KILL SESSION 'sid,serial#, где sid и serial# взяты из предыдущего запроса. Если сессий много, можно убить их все автоматически, следующим PL/SQL блоком (предварительно проверив то ли вы получаете, что надо, первым запросом):
begin for c1 in(select distinct s.sid, s.serial# from v$lock l, dba_objects d, v$session s where d.owner='СХЕМА' and d.OBJECT_NAME='ИМЯ-ТАБЛИЦЫ' and l.id1=d.object_id and l.type='TO' and s.sid=l.sid) loop execute immediate 'ALTER SYSTEM KILL SESSION '''||c1.sid||','||c1.serial#||''''; end loop; end; /

Комментариев нет:

Отправить комментарий