设为首页收藏本站language 语言切换
查看: 1047|回复: 0
收起左侧

[分享] 上课了分享Oracle分区表的move操作

[复制链接]
发表于 2017-6-7 13:49:51 | 显示全部楼层 |阅读模式

对于普通的表而言,做move操作室理所当然,oracle提供的方式很直接快捷。当然了这个命令也不是高可用的范畴。但是对于数据重组还是很方便快捷的。

一般来说,如果尝试对分区表进行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 object


这个时候可以使用如下的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 DATAS01

碰到这种问题,一般有以下的几种原因,一种需要查看quota的情况,是否在对应的表空间中含有足够的quota
一种就是查看表空间的存储情况,是否有足够的空间。
如果空间有限,而且有的分区没有数据,可以开启延迟加载的方式。启用deferred_segment


expdp/impdp
使用数据泵是一种很好的选择,可以很方便的进行数据结构的dump到处,然后在导入的时候直接做remap_tablespace,这个功能是exp/imp所无法企及的。
推荐使用impdp的remap功能。

perl/shell
当然了,可以利用exp+imp+shell/perl的方式来解析dump文件
dbms_metadata.get_ddl
如果源shema可以随时访问到,在条件允许的时候可以直接通过dbms_metadata来生成对应的创建语句,可以在此基础上进行表空间的重新手工mapping。
这个过程看似简单,其实还要考虑很多的细节。分区的分区太多,很容易就超过最大字符长度了,需要自己把握控制。
exchange partition
这种方式可能风险有些大,不过在某些情况下也是一种方案,可以通过exchange partition的形式来完成表空间的重新映射。
使用普通表来和分区做一个交换。


您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-23 16:39 , Processed in 0.058115 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表