重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3823|回复: 1
打印 上一主题 下一主题

[原创] ORA-04031 large pool PX msg pool 不足错误解决

[复制链接]
跳转到指定楼层
楼主
发表于 2016-10-12 10:46:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
ORA-04031 large pool PX msg pool 不足错误解决
今天接到用户反映,执行一个查询select * from xxx,就会挂起,后端报警文件在报大池无法分配的问题,具体如下:
Tue Oct 11 15:26:06 2016
Errors in file c:\app\administrator\diag\rdbms\cdal\cdal\trace\cdal_p040_4128.trc  (incident=113581):
ORA-04031: 无法分配 268512 字节的共享内存 ("large pool","unknown object","large pool","PX msg pool")
可以看出以上是因为并行查询导致了大池不足造成。
可先了解下 large pool:
大池是SGA中的一块可选内存池,大池主要提供了大内存段,大池最大大小为4G。根据需要时配置,主要用到大池的情况:
  1.  用于共享服务(Shared Server MTS方式中)的会话内存和Oracle分布式事务处理的Oracle XA接口
  2.  使用并行查询(Parallel Query Option PQO)时
  3. I/O服务器进程用的内存(缓冲)
  4. Oracle备份和恢复操作(启用了RMAN时)
大池没有LRU列表。这和共享池中的保留空间不同,保留空间和共享池中其他分配的内存使用同样的LRU列表。
大块内存从不会换出大池中,内存必须是显式的被每个会话分配并释放。
解决过程:1.检查是否开启了并行.
            select * from dba_tables where degree<>1;
            select * from dba_indexes where degree<>1;
          2.发现是表开启了并行,因此可关闭并行:
            ALTER TABLE XX.XXX NOPARALLEL;
          3.如果large pool大小不足,可根据实际需求调整大小:
            ALTER SYSTEM SET LARGE_POOL_SIZE=xxM scope=spfile;
            
后通过检查,该语句执行,执行计划一直走并行:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2873591275
--------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          |     1 |    12 |     2   (0)| 00:00:01
|   1 |  PX COORDINATOR      |          |       |       |            |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |     1 |    12 |     2   (0)| 00:00:01
|   3 |    PX BLOCK ITERATOR |          |     1 |    12 |     2   (0)| 00:00:01
|   4 |     TABLE ACCESS FULL| xxx      |     1 |    12 |     2   (0)| 00:00:01
--------------------------------------------------------------------------------
Note
-----
   - Degree of Parallelism is 2 because of table property
15 rows selected
SQL> select table_name,degree from user_tables where table_name='xxx';
TABLE_NAME       DEGREE
--------------- --------------------
xxx              2
去掉该表的并行度,后,再去执行,之后就不走并行了.
alter table xxx noparallel;
后话:
    总觉得很蹊跷,内存怎么会不够呢,物理机器有128g内存,检查数据库发现,只分配了800m给memory_target,再一检查,操作系统是32位,
    问题已经很清楚了.根本解决办法,就是升级到64位.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

沙发
发表于 2016-10-13 22:04:58 | 只看该作者
128G内存,系统却只装32位的,这就有点尴尬了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-11-28 01:52 , Processed in 0.120319 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表