一、場景
某天發現操作系統的空間快100%,左後檢查發現時某個表空間無限制的增大,即將達到100%,此時需要收縮表空間,但由於HWM的原因,無法直接resize,需要使用Move分區的方法進行。
二、操作步驟
1、檢查當前系統空間;
[root@alex、 ~]# df -kh
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
384G 357G 7.5G 98% /
/dev/sda1 99M 13M 82M 13% /boot
tmpfs 5.9G 2.4G 3.6G 40% /dev/shm
2、找出佔用空間最多的目錄和文件;
[root@alex oracle]# du -sh oradata/
336G oradata/
3、找出佔用空間最多的表空間;
select tablespace_name,bytes/1024/1024 from dba_data_files;
TABLESPACE_NAME BYTES/1024/1024
------------------------------ ---------------
SYSTEM 4096
SYSAUX 4096
UNDOTBS1 8192
USERS 8192
TBS_ALEX 311728
4、清除部分空間,作爲接近HWM的分區新的存儲空間,該表爲LIST分區表,包含執行時間字段,3個月前的數據可以清楚;
1)找出可以清除的數據;
SELECT 'P_'||upper(taskid) FROM TB_TASK WHERE EXECTIME <= to_date('20110901 23:59:59','yyyymmddhh24:mi:ss') AND DELFLAG='n' ORDER BY EXECTIME;
2)執行清除;
alter table tb_alex drop P_749160901374E9FAECB03B7;
此時HWM不變,表空間依然無法resize;
5、找出接近高水位上的分區,並執行MOVE;
select partition_name,block_id from dba_extents where tablespace_name='TBS_ALEX order by 2 desc;
------------------------------ ----------
P_749160901374E9FAECB03B7 3139328
1)執行分區MOVE
alter table TB_ALEX move partition P_647AF670136CD234C78255E;
2)檢查該分區新的Block_ID,應小於MOVE前的的值;
select segment_name,block_id from dba_extents where partition_name='P_647AF670136CD234C78255E';
6、回收空間
alter tablespace TBS_ALEX resize 300000m;
表空間已更改。
7、限制表空間無限擴展,設定一個最高值;
ALTER TABLESPACE TBS_ALEX AUTOEXTEND ON NEXT 100M MAXSIZE 300000m;
ALTER TABLESPACE TBS_ALEX AUTOEXTEND OFF;