Ошибка ORA-00018: maximum number of sessions exceeded в Oracle Database
- Клиенты и пулы соединений получают ошибку
ORA-00018: maximum number of sessions exceededпри попытке подключения. - Администратор не может войти под обычной учетной записью (вход возможен только через
sqlplus / as sysdbaлокально через операционную систему). - В
alert.logрегистрируются предупреждения о достижении системного лимита сессий.
1. Диагностика текущего количества сессий и лимитов
Подключитесь через SYSDBA на сервере СУБД:
sqlplus / as sysdbaВыполните запрос к представлению v$resource_limit:
SELECT resource_name, current_utilization, max_utilization, initial_allocation, limit_value
FROM v$resource_limit
WHERE resource_name IN ('sessions', 'processes');2. Анализ распределения сессий по пользователям и программам
SELECT username, program, machine, status, COUNT(*)
FROM v$session
GROUP BY username, program, machine, status
ORDER BY COUNT(*) DESC;3. Увеличение лимита сессий в SPFILE
Формула по умолчанию в Oracle: sessions = (1.5 * processes) + 22. Для изменения параметров выполните:
ALTER SYSTEM SET processes=1000 SCOPE=SPFILE;
ALTER SYSTEM SET sessions=1522 SCOPE=SPFILE;Примечание: Изменение параметров processes и sessions требует перезапуска экземпляра базы данных (SHUTDOWN IMMEDIATE / STARTUP).
4. Принудительное завершение зависших неактивных сессий
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session
WHERE status = 'INACTIVE' AND last_call_et > 7200; Частые вопросы (FAQ)
Почему ORA-00018 блокирует подключение даже при наличии свободной памяти на сервере?
Лимит сессий является жестко зафиксированным статическим параметром в управляющих структурах SGA. Даже если сервер имеет терабайты свободной RAM, Oracle не выделит дескриптор новой сессии сверх лимита sessions.
Как настроить автоматическое отключение зависших неактивных сессий?
Используйте профили пользователей (Profiles): настройте параметр IDLE_TIME (например, ALTER PROFILE app_profile LIMIT IDLE_TIME 60;) и включите resource_limit (ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;).
Как подключиться к базе, если лимит полностью исчерпан?
Подключение через 'sqlplus / as sysdba' на локальном хосте резервирует специальный системный слот и работает даже при исчерпании лимита sessions.
Связаны ли между собой параметры processes и sessions?
Да, при выделенном сервере (Dedicated Server) каждому процессу операционной системы соответствует как минимум одна сессия. В shared server конфигурации одна сессия может разделяться между пулами.