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

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

2. 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;

3. 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;

4. 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

5. You can also flush the shared pool for temporary fixed the issue.

alter system flush shared pool;

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.