ORA-04031: Unable to allocate N bytes of shared memory(无法分配 N 字节共享内存)
Oracle含义
Oracle 无法在共享内存池(通常是 shared pool 或 large pool)中分配所请求大小的连续内存。某个 SGA 组件处于内存压力之下。
原因
大量未使用绑定变量(充满字面量)的唯一 SQL 语句导致 shared pool 碎片化、SHARED_POOL_SIZE 不足、并发连接过多、PL/SQL 包过大,或 ASMM/AMM 容量规划不正确。
解决方法
确认错误消息指的是哪个池(shared pool、large pool 等)。短期:ALTER SYSTEM FLUSH SHARED_POOL(注意:在生产环境中这会迫使所有 SQL 重新解析,即造成短暂的硬解析风暴,且不能永久解决碎片化)。永久解决:强制使用绑定变量(包括 CURSOR_SHARING),增大 SGA_TARGET / SHARED_POOL_SIZE / LARGE_POOL_SIZE。用 DBMS_SHARED_POOL.KEEP 将常用的包钉在内存中。通过 V$SGASTAT 查看内存分布。
同一数据库的其他条目
- ORA-01017Invalid username/password; logon denied(用户名/密码无效;登录被拒绝)
- ORA-01555Snapshot too old: rollback segment number too small(快照过旧:回滚段编号过小)
- ORA-01652Unable to extend temp segment by N in tablespace(无法在表空间中将临时段扩展 N)
- ORA-12154TNS: could not resolve the connect identifier specified(TNS:无法解析指定的连接标识符)
- ORA-12514TNS: listener does not currently know of service requested in connect descriptor(TNS:监听程序当前无法识别连接描述符中请求的服务)
- ORA-00942Table or view does not exist(表或视图不存在)
- ORA-01031Insufficient privileges(权限不足)