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

相关推荐
Decay__16 分钟前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
freejackman23 分钟前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
codigger2 小时前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
倔强的石头_3 小时前
集中式与分布式怎么选?我把手头11套系统重新过了一遍秤
数据库
挖掘狂人3 小时前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
Rainmicro3 小时前
【无标题】
java·数据库·算法
Thanks_ks3 小时前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
CoderYanger9 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wafrdggh12 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿12 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库