Ошибка ORA-00028: your session has been killed — причины и устранение
- Клиентское приложение прерывает работу с текстом
ORA-00028: your session has been killed. - Следующие команды в том же соединении возвращают
ORA-01012: not logged on. - Внезапный разрыв длительных пакетных операций, фоновых заданий DBMS_SCHEDULER или транзакций 1С.
1. Анализ причин завершения сессии в alert.log
Откройте alert_<ORACLE_SID>.log и найдите записи за соответствующее время:
-- Просмотр пути к trace/alert файлам
SELECT value FROM v$diag_info WHERE name = 'Diag Trace';2. Проверка лимитов профиля пользователя (IDLE_TIME, CONNECT_TIME)
SELECT p.profile, p.resource_name, p.limit
FROM dba_profiles p
JOIN dba_users u ON p.profile = u.profile
WHERE u.username = 'APP_USER'
AND p.resource_name IN ('IDLE_TIME', 'CONNECT_TIME');Если сессия завершается по таймауту бездействия, увеличьте лимит:
ALTER PROFILE DEFAULT LIMIT IDLE_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT CONNECT_TIME UNLIMITED;3. Идентификация сессий в статусе KILLED / KILLED (marked for kill)
Если сессия долго остается в статусе KILLED, она откатывает незафиксированную транзакцию (Rollback):
SELECT s.sid, s.serial#, s.username, s.status, s.osuser, t.used_ublk
FROM v$session s
LEFT JOIN v$transaction t ON s.saddr = t.ses_addr
WHERE s.status = 'KILLED';4. Корректный перехват разрыва в приложении
Приложение должно корректно переподключаться к базе данных (Retry logic) при получении ORA-00028, так как дескриптор соединения становится невалидным.
Частые вопросы (FAQ)
Почему после команды ALTER SYSTEM KILL SESSION сессия переходит в статус KILLED, но не исчезает?
Сессия ожидает, пока процесс откатит (rollback) свои активные изменения в табличных пространствах Undo, или пока клиент не сделает следующий сетевой вызов, чтобы получить ошибку ORA-00028.
Может ли Resource Manager автоматически вызывать ORA-00028?
Да. Если в директивах Consumer Group настроен параметр SWITCH_TIME (например, лимит выполнения SQL более 3600 секунд) с действием KILL_SESSION, Oracle принудительно завершит выполнение тяжелого запроса.
Что происходит с транзакцией, прерванной ошибкой ORA-00028?
Ядро СУБД (процесс PMON/SMON) полностью откатывает все незафиксированные изменения транзакции до состояния на момент последнего COMMIT.
В чем разница между KILL SESSION и DISCONNECT SESSION?
KILL SESSION отправляет сигнал прерывания и ждет подтверждения от клиента, а ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION (или IMMEDIATE) принудительно уничтожает серверный процесс (OS kill) после освобождения ресурсов.