【问题描述】

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

创建用户、表时卡住不动

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

image.png
【风险影响】
image.png

【影响版本】

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%,避免因配置错误无法启动。

image.png
【排查思路】

  1. 查看日志(alert.log)

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

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

    
    -- 共享池分布情况
    SELECT * FROM V$SHARE_POOL;
    -- 全局内存池使用情况
    SELECT * FROM V$GLOBAL_MPOOL;
  2. 检查 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 项可被释放,反之则会长期占用空间。

  1. 查看统计信息更新时间:
SELECT TIMESTAMP(LAST_ANALYZED)
FROM DBA_TAB_STATISTICS
WHERE LAST_ANALYZED IS NOT NULL
ORDER BY 1 DESC
LIMIT 10;

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

【经验总结】
image.png


数据库砖家
1 声望0 粉丝