写点什么

YashanDB |报错 no free block in dictionary cache? 共享集群中的卡顿真凶找到了

作者:数据库砖家
  • 2025-05-13
    广东
  • 本文字数:778 字

    阅读完需:约 3 分钟

【问题描述】

在 YashanDB 共享集群环境下,出现以下问题:

创建用户、表时卡住不动

查询视图或表时报错:no free block in dictionary cache

【风险影响】

【影响版本】

23.2.7.100 及以下所有版本

【问题根因】

YashanDB 使用 Dictionary Cache(DC)管理表、视图等元数据信息。当:

DC 空间不足

某表 DC 长时间占用未释放(ref_count > 0)

就会导致系统报错 no free block in dictionary cache 或出现严重卡顿。

【处理方法】

方法一:尝试释放 Shared Pool(无需重启)

ALTER SYSTEM FLUSH SHARED_POOL;
复制代码

若共享池中仍有可用空间,此操作可立即缓解 DC 空间不足问题;

如操作有效,推荐定期在低峰时段执行。

方法二:调整内存参数(需重启)

增加共享池大小:

ALTER SYSTEM SET SHARE_POOL_SIZE=8G SCOPE=SPFILE;
复制代码

优化 SQL / DC 子池占比:

ALTER SYSTEM SET SQL_POOL_SIZE=40 SCOPE=SPFILE;ALTER SYSTEM SET DICTIONARY_CACHE_SIZE=30 SCOPE=SPFILE;
复制代码

两者之和建议不超过 100%,避免因配置错误无法启动。

【排查思路】

1. 查看日志(alert.log

出现 dictionary cache no free block 类报错时可作为初步判断依据。

2. 查看共享池资源分布:

-- 共享池分布情况SELECT * FROM V$SHARE_POOL;-- 全局内存池使用情况SELECT * FROM V$GLOBAL_MPOOL;
复制代码

3. 检查 DC 占用与引用情况:

-- 查看 DC 被引用情况SELECT COUNT(*) FROM V$DICT_CACHE WHERE REF_COUNT > 0;SELECT COUNT(*) FROM V$DICT_CACHE WHERE REF_COUNT = 0;-- 查看每张表占用的 DC 空间SELECT SUM(MEMORY_CONTEXT_USED) FROM V$DICT_CACHE WHERE MEMORY_CONTEXT_USED IS NOT NULL;
复制代码

REF_COUNT=0 的 DC 项可被释放,反之则会长期占用空间。

4. 查看统计信息更新时间:

SELECT TIMESTAMP(LAST_ANALYZED)FROM DBA_TAB_STATISTICSWHERE LAST_ANALYZED IS NOT NULLORDER BY 1 DESCLIMIT 10;
复制代码

如存在大量未分析表,也可能加剧 DC 占用。

【经验总结】


用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB |报错 no free block in dictionary cache?共享集群中的卡顿真凶找到了_数据库_数据库砖家_InfoQ写作社区