一. 需求
近期有一个日志库,占用了比较多的空间,需要将历史的清理,然后收缩空间。
如下图所示,4T的空间已经差不多用完。
二. 解决方案
首先想到的是清理掉超过半年的数据,然后resize 表空间。
2.1 清理过期数据
因为业务的表是 tablename_yearmonth格式,例如 log_202204,每个月一个表,所以直接进行truncate即可。
找到大表:
select t.segment_name,t.BYTES/1024/1024/1024 GB,t.segment_type
from user_segments t
where t.segment_type in ('TABLE','TABLE PARTITION')
order by nvl(t.BYTES/1024/1024/1024,0) desc;
truncate 大表:
select 'truncate table '|| t.TABLE_NAME ||';'
from user_tables t
where t.TABLE_NAME like 'LOG%';
2.2 收缩表空间
select a.tablespace_name,
a.file_name,
a.totalsize as totalsize_MB,
b.freesize as freesize_MB,
'ALTER DATABASE DATAFILE ''' || a.file_name || ''' RESIZE ' ||
round((a.totalsize - b.freesize) + 200) || '