現場有一個外網的環境表空間嚴重不足,客戶不想擴容,要清理一部分數據,都是大字段的blob. 表空間是1T,已經使用0.99T,刪除2015年之前的blob後,通過附件的基礎信息表查出還有200G的數據,不過表空間並沒有釋放(高水位線),這個時候有幾種方式處理:
1. 新建一張表,把剩下的數據導入,不可行,沒有這麼大的空間了.
2. 用數據泵或用exp導出大字段,刪除表後,然後導入.
3. 用shrink table.
最終選擇用第三種方案,以下是試驗,blob的實驗也測試過,可以收縮,如何插入blob,在此不再贅述.
select * from v$version; BANNER ------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production create user TEST_DB identified by TEST_DB default tablespace testdb_tbs temporary tablespace TEMP; grant connect to TEST_DB; grant dba to TEST_DB; grant resource to TEST_DB; grant select any dictionary to TEST_DB; create tablespace testdb_tbs datafile '/home/oracle/app/oradata/orcl/testdb_tbs.dbf' size 100m autoextend off; create table test as select * from dba_objects; insert into test select * from dba_objects;--執行多次,直到表空間使用率為90%以上 SELECT Upper(F.TABLESPACE_NAME) "表空間名", D.TOT_GROOTTE_MB "表空間大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)", F.TOTAL_BYTES "空閒空間(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '%' "使用比" FROM (SELECT TABLESPACE_NAME, Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES, Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD having DD.TABLESPACE_NAME='TESTDB_TBS' GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME;表空間名 表空間大小(M) 已使用空間(M) 空閒空間(M) 使用比
------------- ------------- ------------- ----------- ----------- TESTDB_TBS 100 97 3 97.00% select count(1) from test; COUNT(1) ---------- 802835 delete from test where rownum <=2835; commit; select count(1) from test; COUNT(1) --------- 800000
SELECT Upper(F.TABLESPACE_NAME) "表空間名", D.TOT_GROOTTE_MB "表空間大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)", F.TOTAL_BYTES "空閒空間(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '%' "使用比" FROM (SELECT TABLESPACE_NAME, Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES, Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD having DD.TABLESPACE_NAME='TESTDB_TBS' GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME; 表空間名 表空間大小(M) 已使用空間(M) 空閒空間(M) 使用比 ------------ ------------- ------------- ----------- ---------------- TESTDB_TBS 100 90.94 9.06 90.94%