Страницы

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

среда, 5 февраля 2020 г.

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

#sql #база_данных #oracle #plsql #plsql_developer


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

Могу я как то отследить, какая именно сессия обращается к необходимой мне таблице? 
И
 alter system kill ...?

Если же это отследить невозможно - как отключить все активные сессии?
    


Ответы

Ответ 1



Получить информацию о сессиях, использующих временную таблицу можно следующим запросом: 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; /

Ответ 2



В таких случаях часто бывает достаточным просто установить DDL_LOCK_TIMEOUT перед выполнением DDL: alter session set ddl_lock_timeout=600; Если в течении 10 минут (600 секунд) объект освободится даже на очень короткий промежуток времени, то Oracle сможет выполнить DDL

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

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