关于分区表的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