Oracle表空間收縮方案

達芬奇的夢發表於2018-04-23
 
 
應用背景:
某些情況下,由於前期設計上沒有考慮全面,導致表空間預建太大,遠遠超出實際使用大小。於是,就出現了收縮表空間這樣的需求,即將這個表空間的佔用空間進行收縮。
 
處理方案:
對於表空間收縮,Oracle只提供擴大的功能,而不提供收縮。所以,要實現這樣的要求,就只能先建立一箇中間表空間,然後將待收縮表空間中的資料遷移到這個表空間下
 
處理方法:
1、找出該表空間下的所有資料物件;
select segment_type, partition_name, segment_name from dba_segments;
 
2、建立目標空間(不強制建立,但是建議)。
create tablespace dbs_temp datafile 'd:\dbs_temp01.dbf' size 100m;
 
3、根據物件型別重建或轉移對應資料;
對於table:
alter table xx move tablespace dbs_temp;
對於partition table:
alter table xx move partition xx1 tablespace dbs_temp;
對於index:
alter index ixx rebuild tablespace dbs_temp;
對於lob欄位:
alter table xx move lob(col_name) store as (tablespace dbs_temp);
一般情況下,下面語句基本可以涵蓋所有的資料物件了:
select segment_type, segment_name, partition_name,
       case segment_type
       when 'TABLE' then 'alter table ' || owner || '.' || segment_name || ' move tablespace dbs_temp;',
       when 'INDEX' then 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace dbs_temp;',
       when 'INDEX PARTITION' then 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace dbs_temp;',
       when 'TABLE PARTITION' then 'alter table ' || owner || '.' || segment_name || ' move partition ' || partition_name || 'tablespace dbs_temp;' sqltext
  from dba_segments
 where tablespace_name = 'FUND_TABLE'
   and segment_type not like 'LOB%';
 
下面是遷移lob欄位的
select table_name, column_name, 'alter table ' || owner || '.' || table_name || ' move lob(' || column_name || ') store as(tablespace dbs_temp);' sqltext
  from dba_lobs
 where tablespace_name = 'FUND_TABLE';
 
4、刪除清空後的表空間;
drop tablespace dbs_old including contents and datafiles;
下面步驟簡單了,就不一一列舉。
 
5、如果對錶空間名稱有要求,則使用原來的表空間名再次建立一個合適大小的表空間。
6、將目標表空間中的資料再遷移回新建的最終的表空間。
 
 
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31444259/viewspace-2153197/,如需轉載,請註明出處,否則將追究法律責任。

相關文章