【问题描述】
在 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%,避免因配置错误无法启动。
【排查思路】
- 查看日志(alert.log)
出现 dictionary cache no free block 类报错时可作为初步判断依据。
查看共享池资源分布:
-- 共享池分布情况 SELECT * FROM V$SHARE_POOL; -- 全局内存池使用情况 SELECT * FROM V$GLOBAL_MPOOL;
- 检查 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 项可被释放,反之则会长期占用空间。
- 查看统计信息更新时间:
SELECT TIMESTAMP(LAST_ANALYZED)
FROM DBA_TAB_STATISTICS
WHERE LAST_ANALYZED IS NOT NULL
ORDER BY 1 DESC
LIMIT 10;
如存在大量未分析表,也可能加剧 DC 占用。
【经验总结】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。