请注意,本文编写于 791 天前,最后修改于 791 天前,其中某些信息可能已经过时。
datafile,tempfile,undo空间使用过大时可以通过 resize将空间回收到 高水位线附近(不低于高水位);
其中表段,索引段存在高水位线,表空间的高水位线就是所有表段,索引段等高水位线的最大值;
---查看所有数据文件,undo文件
占用空间大小(filesize),
空闲空间大小(freesize),
使用空间大小(usedsize),
高水位线(hwmsize),
可以回收的空间(canshirnksize),
回收resize语句(cmd)
select a.file_id,
a.file_name,
a.filesize,
b.freesize,
(a.filesize - b.freesize) usedsize,
c.hwmsize,
c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm,
a.filesize - c.hwmsize canshrinksize,
'alter database datafile ' || a.file_name || ' resize ' || c.hwmsize || 'M;' cmd
from (select file_id, file_name, round(bytes / 1024 / 1024) filesize
from dba_data_files) a,
(select file_id, round(sum(dfs.bytes) / 1024 / 1024) freesize
from dba_free_space dfs
group by file_id) b,
(select file_id, round(max(block_id) * 8 / 1024) HWMsize
from dba_extents
group by file_id) c
where a.file_id = b.file_id
and a.file_id = c.file_id
order by unsedsize_belowhwm desc;
执行此SQL前需要确保数据库统计信息是最新的
- 查出来高水位线后,就可以通过cmd列 把数据文件或者undo缩小到高水位线附近了,
alter database datafile 'datafilename' resize xxM;
alter database datafile 'undodatafilename' resize xxM;
- 查询当前数据库没有使用临时表空间时,也可以通过Resize回收临时表空间;
alter database tempfile 'tempfilename' resize xxM;
- 查看数据文件,undo,temp文件大小
select *
from (select bytes / 1024 / 1024 / 1024, file_name, tablespace_name
from dba_data_files
union all
select bytes / 1024 / 1024 / 1024, file_name, tablespace_name
from dba_temp_files)
order by 1 desc;
除此以外,临时表空间和UNDO表空间可以通过重建回收空间;
如果报错ORA-03297,说明Resize的尺寸过小,需要适当调大reisze的值;
- 查看10号数据文件中高水位线较高的区属于哪些用户以及段名,段类型
select *
from (select owner, segment_name, segment_type, block_id
from dba_extents
where file_id =
(select file_id from dba_data_files where file_id = 10)
order by block_id desc)
where rownum <= 5;
转载自chenoracle