美文网首页linux redhat & Oracle
ORA-04031 large pool PX msg pool

ORA-04031 large pool PX msg pool

作者: 重庆思庄 | 来源:发表于2019-08-14 15:17 被阅读0次

    今天接到用户反映,执行一个查询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位.

    相关文章

      网友评论

        本文标题:ORA-04031 large pool PX msg pool

        本文链接:https://www.haomeiwen.com/subject/qxggjctx.html