#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
Комментариев нет:
Отправить комментарий