前几天的事情,收到监控系统告警,某环境的/data空间不够了,其他同事处理后告诉我,把log表truncate后,表空间中的数据文件无法缩小。告警无法恢复。 该问题之前也遇到过,建议把该表空间的表迁移到新表空间可解决,需要注意点:需要多次查看索引是否有效,
被truncate表: DCP_YSJ.T_TOOL_LOG
原表空间YSJ_D 新表空间:YSJ_DBAK
1、将表和索引等全部迁移到新表空间中,下面语句得出执行sql,直接执行即可
select 'alter table '|| a.OWNER ||'.'||a.SEGMENT_NAME||' move tablespace YSJ_DBAK;' from dba_segments a where TABLESPACE_NAME='YSJ_D' and SEGMENT_TYPE='TABLE';
select 'alter index '|| a.OWNER ||'.'||a.SEGMENT_NAME||' rebuild tablespace YSJ_DBAK;' from dba_segments a where TABLESPACE_NAME='YSJ_D' and SEGMENT_TYPE='INDEX';
select 'alter table '|| l.OWNER ||'.'||l.table_name||' move lob('||l.column_name||') store as( tablespace YSJ_DBAK);' from dba_lobs l,dba_segments s where l.segment_name=s.segment_name and s.tablespace_name='YSJ_D';
2、设置用户使用新表空间
alter user DCP_YSJ default tablespace YSJ_DBAK;
3、收集整个用户下的所有对象统计信息
exec dbms_stats.gather_schema_stats('DCP_YSJ',options=>'gather stale',estimate_percent =>10);
4、查看原表空间和新表空间的对象
select SEGMENT_TYPE,OWNER,SEGMENT_NAME from dba_segments where TABLESPACE_NAME='YSJ_D';
select SEGMENT_TYPE,OWNER,SEGMENT_NAME from dba_segments where TABLESPACE_NAME='YSJ_DBAK';
5、查找UNUSABLE的索引重新新建
select 'alter index '|| OWNER ||'.'||index_name||' rebuild tablespace YSJ_DBAK;' from dba_indexes where owner = 'DCP_YSJ' and STATUS='UNUSABLE';