Oracle分區表的move操做

關於分區表的move操做仍是很值得深究的一個問題。若是分區表中含有lob字段,難度還會加大。
對於普通的表而言,作move操做室理所固然,oracle提供的方式很直接快捷。固然了這個命令也不是高可用的範疇。可是對於數據重組仍是很方便快捷的。


sql

通常來講,若是嘗試對分區表進行move操做,會獲得以下的錯誤警告。
SQL> alter table charge move tablespace large_data;
alter table charge move tablespace large_data
            *
ERROR at line 1:
ORA-14511: cannot perform operation on a partitioned objectshell

 
這個時候可使用以下的sql語句生成動態sql來作partition級別的move操做。
好比對下面3個大表,以下的sql就能夠生成成百上千條語句來完成partition級別的move操做。

select 'alter table '||table_name||' move partition '||partition_name||' tablespace large_data;' from user_tab_partitions where table_name in ('CHARGE','MEMO','CHARGE_REL')

若是表中含有lob字段,可能會碰到以下的問題

alter table memo move partition xxxx tablespace large_data;數據結構

           *
ERROR at line 1:
ORA-01658: unable to create INITIAL extent for segment in tablespace DATAS01oracle

 碰到這種問題,通常有如下的幾種緣由,一種須要查看quota的狀況,是否在對應的表空間中含有足夠的quota
一種就是查看錶空間的存儲狀況,是否有足夠的空間。
若是空間有限,並且有的分區沒有數據,能夠開啓延遲加載的方式。啓用deferred_segmentapp


expdp/impdp
使用數據泵是一種很好的選擇,能夠很方便的進行數據結構的dump處處,而後在導入的時候直接作remap_tablespace,這個功能是exp/imp所沒法企及的。
推薦使用impdp的remap功能。

perl/shell
固然了,能夠利用exp+imp+shell/perl的方式來解析dump文件
能夠參考以下的博文。
http://blog.itpub.net/23718752/viewspace-1160404/
裏面詳細討論瞭解析dump文件的一些細節。

dbms_metadata.get_ddl
若是源shema能夠隨時訪問到,在條件容許的時候能夠直接經過dbms_metadata來生成對應的建立語句,能夠在此基礎上進行表空間的從新手工mapping。
這個過程看似簡單,其實還要考慮不少的細節。分區的分區太多,很容易就超過最大字符長度了,須要本身把握控制。


exchange partition
這種方式可能風險有些大,不過在某些狀況下也是一種方案,能夠經過exchange partition的形式來完成表空間的從新映射。
使用普通表來和分區作一個交換。

不過以上的方法都不太適合高可用的狀況,不過downtime的時間也是須要考慮的,須要最大程度的減小操做時間,畢竟使用分區表的環境中,數據都是很大的,這個也須要你們斟酌。表空間的變動是目的,可是數據的重組就牽扯了數據的導出,導入之類的工做,大道至簡,可是細節太多,仍是須要多加註意。ide

From:http://blog.itpub.net/23718752/viewspace-1266689/spa

相關文章
相關標籤/搜索