ORA-04301: UNABLE TO ALLOCATE XXX BYTES OF SHARED MEMORY

 Error

ORA-04031: unable to allocate nnn bytes of shared memory

Solution

  1. Need to add more memory to the Shared pool area.

Check the size of memory allocate to shared_pool_size, shared_pool_reserved_size and large_pool_size.

SQL> show parameter pool
NAME                          TYPE        VALUE
----------------------------- ----------- --------
buffer_pool_keep              string
buffer_pool_recycle           string
java_pool_size                big integer 0
large_pool_size               big integer 0
memoptimize_pool_size         big integer 0
olap_page_pool_size           big integer 0
shared_pool_reserved_size     big integer 16M
shared_pool_size              big integer 0
streams_pool_size             big integer 0

  1. Increasing the value of the INIT.ORA parameters “shared_pool_reserved_size”, “shared_pool_size” and “large_pool_size”.
ALTER SYSTEM SET shared_pool_size = 1g scope=both;
ALTER SYSTEM SET large_pool_size=100M scope=both;
ALTER SYSTEM SET shared_pool_reserved_size=512M scope=spfile;
  1. If it not set then increase the SGA_TARGET or MEMORY_TARGET parameter as you set which will allocate more space to the Shared POOL size.
SQL> show parameter sga_target

NAME            TYPE        VALUE
--------------- ----------- ------------------------------
sga_target      big integer 1536M
SQL> show parameter memory_target

NAME            TYPE        VALUE
--------------- ----------- ------------------------------
memory_target   big integer 0
-- Increase the SGA_TARGET or MEMORY_TARGET effect on next startup
ALTER SYSTEM SET SGA_TARGET=3G scope=spfile;
OR
ALTER SYSTEM SET MEMORY_TARGET=3G scope=spfile;
  1. If you have pinned lots of packages with dbms_shared_pool.keep may be the reason of limit the SHARED POOL for other use.
--Check the pinned objects:
SELECT owner, name, kept FROM v$db_object_cache where kept = 'YES' and name = 'DBMS_ALERT';
no rows selected

--Use for KEEP the object:
execute dbms_shared_pool.keep('DBMS_ALERT');

--Check the keep object
SELECT owner, name, kept FROM v$db_object_cache where kept = 'YES' and name = 'DBMS_ALERT';

OWNER      NAME            KEP
---------- --------------- ---
SYS        DBMS_ALERT      YES
SYS        DBMS_ALERT      YES
--Use for UNKEEP the objects:
EXEC DBMS_SHARED_POOL.UNKEEP ('DBMS_ALERT');

--Check again
SELECT owner, name, kept FROM v$db_object_cache where kept = 'YES' and name = 'DBMS_ALERT';
no rows selected
  1. You can also flush the shared pool for temporary fixed the issue.
alter system flush shared pool;

Related posts

Error: ORA-16765: Redo Apply is running

Khắc phục lỗi recovery khi OPEN RESETLOGS lỗi SYSTEM trong Oracle Database?

check the FRA usage and troubleshoot the issue in oracle DB