【YashanDB 知识库】stmt 未 close,导致 YAS-00103 no free block in sql main pool part 0 报错分析
问题现象
问题单: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 状态,无法循环使用。
代码分析:
没有 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 的使用个数
评论