暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

关于普通表空间出现ORA-01652无法扩展temp段问题的分析

原创 张明轩 2022-05-12
2361

现象:在客户跑批的过程中,数据库抛出报错:




一开始看到问题,很自然的以为是用户的temp表空间满了,检查发现该用户使用的temp表空间一直没有很高的使用率。仔细观察报错,发现图中报错的TS_SCH_DATA表空间并不是一个临时表空间,而是一个永久表空间,遂产生疑问,为什么在永久表空间上也会出现扩展临时段的错误?


通过查阅资料,才知道在永久表空间中也会存在一些创建临时段的操作,如rebuild索引、copy表、create as select 操作时,都会先在perment表空间中创建临时段,


下面做一个测试:


创建一张一千二百万数据的表:

CREATE TABLE HY_million
(
    id NUMBER not null primary key,
    name NVARCHAR2(60) not null,
    score NUMBER(4,0) NOT NULL,
    createtime TIMESTAMP (6) not null
)

--插入200万数据

Insert into HY_million
 select rownum,dbms_random.string('*',dbms_random.value(6,20)),dbms_random.value(0,20),sysdate from dual
 connect by level<=2000000 

--创建第二张表
create table hy_million2 as select * from HY_million;

--插入数据
insert into hy_million2 select * from HY_million;

--重复执行5次
insert into hy_million2 select * from HY_million;

--规整主键
update hy_million2 set id=rownum where 1=1;

--给表创建主键
ALTER TABLE hy_million2 ADD CONSTRAINT constraint_million2 PRIMARY KEY (id);

--查询数据量
select count(distinct id) from hy_million2;

COUNT(DISTINCTID)
-----------------
	 12000000


现在模拟一个create table as select 大表的操作,同时观察dba_segments里该表空间的段名:

copy表:



检查dba_segments中的情况:


select SEGMENT_NAME,TABLESPACE_NAME from dba_segments where tablespace_name='HR'



在这种情况下,会在PERMENT表空间中产生一些类似xx.xxxx的临时对象。第一部分是数据文件的ID,后一段是临时段的ID。当这些操作完成的时候,这些临时段就会变成PERMENT的段。


甚至在有些时候,这些操作如果中途失败,那么这些临时段就会遗留在表空间中,不会马上被清除。pmon发现会话异常后,会通知smon在后台清理这些temporary segment,不过有时候smon会出现一些异常,无法及时清理这些对象。有可能这些对象会长期遗留下来。以前老白就遇到过有客户的表空间真正使用的量并不大,但是空闲比例很低,最后一查,发现里面有大量的temporary 段。遇到这种情况,我们可以使用event:drop_segments来手工清理这些临时段。


alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1';


其中的level是表空间的ID+1,针对存在大量临时段的表空间,需要一个个的设置drop_segments事件来手工清理。



文章部分参考原文:

https://www.modb.pro/db/41862

最后修改时间:2022-05-12 17:37:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论