ORA-04031: Не удаётся выделить N байт разделяемой памяти
OracleЧто это значит?
Oracle не смог выделить непрерывный участок памяти запрошенного размера в пуле разделяемой памяти (обычно shared pool или large pool). Компонент SGA испытывает нехватку памяти.
Почему возникает?
Фрагментация shared pool из-за множества уникальных SQL-операторов без bind-переменных (полных литералов), недостаточный SHARED_POOL_SIZE, слишком много одновременных подключений, крупные пакеты PL/SQL или неверная настройка размеров ASMM/AMM.
Как исправить
Проверьте, к какому пулу относится сообщение об ошибке (shared pool, large pool и т. д.). Краткосрочно: ALTER SYSTEM FLUSH SHARED_POOL (осторожно: в продакшене это вынуждает повторно разбирать весь SQL, то есть вызывает временный шторм hard parse, и не устраняет фрагментацию навсегда). Постоянное решение: обеспечьте использование bind-переменных (в том числе через CURSOR_SHARING), увеличьте SGA_TARGET / SHARED_POOL_SIZE / LARGE_POOL_SIZE. Закрепите часто используемые пакеты в памяти с помощью DBMS_SHARED_POOL.KEEP. Изучите распределение памяти через V$SGASTAT.
Ещё по этой СУБД
- ORA-01017Неверное имя пользователя/пароль; вход запрещён
- ORA-01555Snapshot too old: слишком маленький номер сегмента отката
- ORA-01652Не удаётся расширить временный сегмент на N в табличном пространстве
- ORA-12154TNS: не удалось разрешить указанный connect identifier
- ORA-12514TNS: listener в данный момент не знает службу, запрошенную в connect descriptor
- ORA-00942Таблица или представление не существует
- ORA-01031Недостаточно привилегий