В этой статье мы рассмотрим причину возникновения исключительной ситуации ORA-00020, а также будет рассмотрен вариант решения.
Описание ошибки
ORA-00020: exceeded maximum number of processes specified in initialization parameter
Превышено максимальное количество процессов
Эта ошибка возникает, когда Oracle не может выделить новый процесс, так как достигнут лимит, заданный параметром PROCESSES.
Причина:
- Достигнут лимит процессов, заданный параметром PROCESSES
- Много фоновых процессов или пользовательских сеансов
- Утечка процессов (не закрываются должным образом)
Пример обработки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
-- Проверка текущих процессов SELECT program, status, COUNT(*) FROM v$session GROUP BY program, status; -- Пример обработки в PL/SQL DECLARE v_retry_count NUMBER := 0; v_max_retries NUMBER := 3; v_success BOOLEAN := FALSE; BEGIN WHILE v_retry_count < v_max_retries AND NOT v_success LOOP BEGIN -- Попытка выполнения операции, требующей новый процесс EXECUTE IMMEDIATE 'CREATE OR REPLACE PROCEDURE test_proc AS BEGIN NULL; END;'; v_success := TRUE; EXCEPTION WHEN OTHERS THEN IF SQLCODE = -20 THEN v_retry_count := v_retry_count + 1; DBMS_OUTPUT.PUT_LINE('Ошибка: Превышен лимит процессов. Попытка ' || v_retry_count); DBMS_LOCK.SLEEP(5); -- Пауза перед повторной попыткой ELSE RAISE; END IF; END; END LOOP; IF NOT v_success THEN DBMS_OUTPUT.PUT_LINE('Не удалось выполнить операцию после ' || v_max_retries || ' попыток'); END IF; END; / -- Увеличение лимита процессов ALTER SYSTEM SET processes=500 SCOPE=SPFILE; |
Решение:
- Увеличить параметр PROCESSES в файле параметров
- Проверить активные сеансы и завершить неиспользуемые
- Оптимизировать приложение для использования меньшего числа процессов
- Настроить пул соединений в приложении