oracle数据库seg$的type#含义

删除表空间时发现ORA-1561异常,

通常将type#设置为3即可删除表空间,但是查seg$中没有对象。

奇怪

由于之前对 type# 不太了解,想先深入一下都有哪些segment段类型

seg$可是很底层的数据字典,如何看其说明呢?

初级DBA可能上网搜搜,看是否有人总结过

中级DBA可能去MOS找找,看看官方是否讲

高级DBA直接去rdbms目录下找bsq文件

很快就定位到了

sql 复制代码
1 = UNDO, 
2 = SAVE UNDO, 
3 = TEMPORARY, 
4 = CACHE, 
5 = DATA, 
6 = INDEX
7 = SORT  
8 = LOB   
9 = Space Header 
10 = System Managed Undo

这里得感谢2009年4月14日罗玛尼克的贡献

然后扩展看了一眼官方文档

里面有SEGMENT_TYPE

问题来了,比seg$里的多出很多

继续看定义,在catspace.sql里找到DBA_SEGMENTS

来自表sys_dba_segs,当然看这些视图的定义还可以通过

DBMS_METADATA.GET_DDL或dba_views查看,但sql文件里可能有注释

第4个字段就是类型,来自几个union all的结果,这里的so是sys_objects

基本上DBA_SEGMENTS里的前12个类型来自sys_objects,即seg里对应的

所以回到问题最初,如果想清理seg中对象是删除记录还是修改类型呢?

我看大家都习惯将type#修改为3,直接手工删除seg中记录是极不好的。

ORA-1561异常说明还有其他对象没清理,可能有别的残存信息,那就要通过10046事件来判断卡在哪里。

sql 复制代码
alter session set tracefile_identifier='my10046';
alter session set timed_statistics=true;
alter session set statistics_level=all;
alter session set max_dump_file_size=unlimited;
alter session set events '10046 trace name context forever,level 12';
drop tablespace ts1 including contents;
alter session set events '10046 trace name context off';

到trc目录下格式化输出文件

发现最后检查失败的sql是

删除表空间时检查的对象涉及很多个底层表,所以最好不要单独手工清理。

内部数据字典不一致,最好用hcheck.sql检查。

家里有26ai的朋友就省事了,可以直接执行DBMS_DICTIONARY_CHECK.full

相关推荐
IvorySQL7 小时前
改变工作方式的 PostgreSQL 实用模式
数据库·postgresql
Anarkh_Lee7 小时前
在VSCode中使用MCP实现智能问数
数据库·ide·vscode·ai·编辑器·ai编程·数据库开发
晓13137 小时前
第八章:Redis底层原理深度详细解析
数据库·redis·缓存
电商API&Tina7 小时前
电商数据采集 API 接口 全维度解析(技术 + 商业 + 合规)
java·大数据·开发语言·数据库·人工智能·json
liwulin05067 小时前
【JSON】使用com.fasterxml.jackson解析json字符串
java·数据库·json
ActionTech7 小时前
MySQL 用好 Optimizer Trace,深刻理解 SQL 优化过程!
sql·mysql·oracle
志凌海纳SmartX8 小时前
金融行业IT基础设施转型实践|450+机构部署轻量云,支持核心生产与信创业务
大数据·数据库·金融
VIP_CQCRE8 小时前
hCaptcha 验证码图像识别 API 对接教程
数据库
Mr_Xuhhh8 小时前
MySQL索引深度解析:从原理到实践
数据库·sql·mysql
爱学习的阿磊8 小时前
Python入门:从零到一的第一个程序
jvm·数据库·python