写点什么

【YashanDB 知识库】stmt 未 close,导致 YAS-00103 no free block in sql main pool part 0 报错分析

作者:YashanDB
  • 2024-07-24
    广东
  • 本文字数:604 字

    阅读完需:约 2 分钟

问题现象

问题单:YAS-00103 no free block in sql main pool part 0,YAS-00105 out of memory to allocate hash table of size = 256


现象:业务处理 sql 时,报错 YAS-00103 no free block in sql main pool part 0

问题风险及影响

业务处理报错,影响功能使用

问题影响版本

客户版本:22.2.4.1

问题发生原因

表现原因:sql pool 空间不足,申请不到报错。


根原因:stmt 使用后,未调用 close,session 长时间未关闭。open coursor 无法循环使用,导致该问题。

解决方式及规避方法

规避方法:增大 share_pool_size;alter system set share_pool_size=xxx scope=spfile;


解决方案:stmt 调用,不使用后调用 close 关闭。

问题分析和处理过程

复现方案:



如上报错


分析


查看 v$open_cursor 视图



每个 cursor 的状态都是 0,0 是 idle 状态,无法循环使用。



代码分析:


typedef enum EnAnlStmtStatus {    STMT_STATUS_IDLE = 0,    STMT_STATUS_PREPARE = 1,    STMT_STATUS_EXECUTE = 2,    STMT_STATUS_FETCH = 3,    STMT_STATUS_FREE = 4,} AnlStmtStatus;
复制代码





没有 close 的 stmt,并且执行完毕这条 sql 语句了,就是 idle。


close 的 stmt,则是 free 状态。只有 free 状态的 stmt 可以复用。


cursor 连接不会销毁,只有 session 断开连接才会销毁,每个 session 用 open_cursors 控制最大的 cursor 数量。

经验总结

v$global_mpool //查看 sql pool 使用情况


v$open_cursor //查看 stmt 的 cursor 使用状况


OPEN_CURSORS //配置 session 最大 cursor 的使用个数

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】stmt未close,导致YAS-00103 no free block in sql main pool part 0报错分析_yashandb_YashanDB_InfoQ写作社区