如何处理no free block in dictionary cache
问题现象
1、共享集群中,创建用户卡住
2、查询表或视图报错
问题的风险及影响
1、共享集群中,create table、user等,因为需要等其他节点返回消息,如果某个节点dc不够,则会卡住。
2、查询创建等报错,影响业务使用。
问题影响的版本
23.2.7.100及之前的所有版本
问题发生原因
dc pool不足
解决方法及规避方式
1、如果是sql pool占用了share pool的剩余空间,可以先清理share pool
alter system flush shared_pool;
如果有用,可以不重启。
2、如果条件允许,增大share pool :
alter system set SHARE_POOL_SIZE=8G scope=spfile;
调整dc占比:
alter system set SQL_POOL_SIZE=xx(默认50) scope=spfile;
alter system set DICTIONARY_CACHE_SIZE=xx(默认25) scope=spfile;
需要重启。
问题分析和处理过程
1、查看alert.log,发现报错
2、查看视图
v$share_pool:
可以看到share pool中 DICTIONARY CACHE POOL占用的空间,和剩余SHARE POOL 的空间。
当SQL POOL 和DICTIONARY CACHE POOL不够时,会用剩余的SHARE POOL
v$global_mpool:
可以看到SQL POOL 和DICTIONARY CACHE POOL的使用情况。
v$dict_cache:
查看各个表dc的使用情况,通过查看这个视图,发现表的dc都被占用情况,之后再分析导致该情况的原因。
ref_Count表示该表dc的引用次数,只有当ref_Count=0时,改表dc才可以淘汰使用。
memory_context_used字段代表每个dc占用的空间大小,可以用该字段看到每张表的dc占用情况。
select count(*) from v$dict_cache where ref_Count= 0 ;
select count(*) from v$dict_cache where ref_Count > 0 ;
select sum(memory_context_used) from v$dict_cache where memory_context_used is not null
dba_tab_statistics:
-- 查看上一次执行统计信息的时间
Select timestamp(LAST_ANALYZED) from dba_tab_statistics where LAST_ANALYZED is not null order by 1 desc limit 10;
3、查看run.log