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

相关推荐
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希4 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神4 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员4 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU5 小时前
三大范式和E-R图
数据库