oracle 分割槽表move和包含分割槽表的lob move

不一樣的天空w發表於2019-03-11

建立含有lob欄位的表時,oracle會自動為lob欄位建立兩個單獨的segment,一個用來存放lob資料,另一個用來存放lob索引,並且它們都會儲存在對應表指定的表空間中。但是當我們用alter table tb_name move tablespace tbs_name;對錶做表空間之間遷移時只能遷移非lob欄位以外的segment,而如果要在移動表資料同時移動lob相關欄位,就必需用如下的含有特殊引數據的文句來完成:

alter table tb_name move tablespace tbs_name lob (column_lob1,column_lob2) store as(tablespace tbs_name);


表包含lob欄位,需要收回空間,首先move表,move表,move完表後lob的空間並不會釋放,還需要針對lob欄位進行move。


非分割槽表lob的move:

alter table  T_SEND_LOG move  lob(MESSAGE) store as (tablespace DATALOB);

分割槽表lob的move:
alter table  T_SEND_LOG move  partition p2018 lob(MESSAGE) store as (tablespace DATALOB);

分割槽表move:
alter table  T_SEND_LOG move partition p2018;

注意:move表後記得rebuild索引。


批次生成語句參考:
針對表空間:

select 'alter table  ' || a.owner || '.' || a.table_name || ' move lob(' ||

       a.COLUMN_NAME || ') store as (tablespace DATALOB);'

  from dba_lobs a, DBA_SEGMENTS b

 where a.owner in ('APP')

   and a.OWNER = b.OWNER

   and a.SEGMENT_NAME = b.SEGMENT_NAME

   and b.TABLESPACE_NAME != 'PACSLOB';


針對表:

select 'alter table  ' || a.owner || '.' || a.table_name || ' move lob(' ||

       a.COLUMN_NAME || ') store as (tablespace DATALOB);'

  from dba_lobs a, DBA_SEGMENTS b

 where a.owner in ('APP')

   and a.OWNER = b.OWNER

   and a.SEGMENT_NAME = b.SEGMENT_NAME

   and a.TABLE_NAME = 'T_SEND_LOG';


======================= =======================

ORA-14511: cannot perform operation on a partitioned object


解決:如下的sql就可以生成成百上千條語句來完成partition級別的move操作

select 'alter table ' || table_name || ' move partition ' || partition_name ||' tablespace users;'

  from dba_tab_partitions

 where table_name in('&table_name') and table_owner='&table_owner';


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

相關文章