Ошибка ORA-00020: maximum number of processes exceeded в Oracle DB
- Ошибка
ORA-00020: maximum number of processes (string) exceededпри попытке любого подключения. - Серверные процессы ОС типа
oracle<ORACLE_SID> (LOCAL=NO)заполняют таблицу процессов ОС. - Слушатель (TNS Listener) перестает принимать новые соединения и выдает TNS-12500 / TNS-12518.
1. Проверка текущей утилизации процессов
SELECT * FROM v$resource_limit WHERE resource_name = 'processes';2. Анализ процессов на уровне операционной системы (Linux)
# Подсчет запущенных процессов Dedicated Server Oracle
ps -ef | grep "oracle$ORACLE_SID (LOCAL=NO)" | wc -l3. Увеличение параметра PROCESSES в базе данных
-- Установка нового значения в SPFILE (требуется рестарт)
ALTER SYSTEM SET processes=1200 SCOPE=SPFILE;
-- Пересчет sessions (sessions = processes * 1.5 + 22)
ALTER SYSTEM SET sessions=1822 SCOPE=SPFILE;4. Проверка системных лимитов Linux (nproc / nofile)
Убедитесь, что лимиты пользователя oracle в /etc/security/limits.d/99-oracle-limits.conf не ниже значений СУБД:
oracle soft nproc 65536
oracle hard nproc 65536
oracle soft nofile 65536
oracle hard nofile 655365. Аварийное освобождение процессов (Kill)
-- Завершение конкретного зависшего серверного процесса через SQL
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- Или на уровне ОС Linux при полной недоступности базы:
kill -9 <SPID> Частые вопросы (FAQ)
Почему параметр processes нельзя изменить динамически без перезагрузки?
Массив структур процессов Process Table выделяется в статической разделяемой памяти SGA (Shared Global Area) при старте экземпляра. Изменение его размера невозможно без пересоздания области памяти.
Что произойдет, если значение processes в Oracle превысит nproc в Linux?
Фоновые процессы ядра СУБД или новые Dedicated Server процессы начнут завершаться системной ошибкой ORA-27300/ORA-27301 (OS system call failed: fork: Resource temporarily unavailable).
В чем разница между ORA-00018 и ORA-00020?
ORA-00020 указывает на исчерпание физических процессов ядра ОС и фоновых потоков СУБД. ORA-00018 указывает на исчерпание логических сессий внутри СУБД (один процесс может содержать несколько сессий при определенных архитектурах).
Как предотвратить зависание брошенных клиентских процессов?
Включите функцию Dead Connection Detection (DCD), прописав параметр SQLNET.EXPIRE_TIME = 10 в файле sqlnet.ora на сервере базы данных.