大家好,有个棘手的问题想向大家请教下:
有个数据量非常大的表做数据迁移,数据量9亿。方案是通过建分区表按该表的维护日期字段(mdate)进行分区。
首先,创建分区表table1,将不分区的表table2进行交换分区动作,table1和table2的表结构一样,脚本如下
alter table table1 exchange partition all_data with table table2;
但是问题出现了主键约束失效了,必须要重建索引才能保证主键约束valid,但是数据量非常大,重建的话需要很长的时间,直接导致失败。
随即上网搜索了下,方法1通过建本地索引的方式才可以不会引起索引失效,随即脚本改变了下:
alter table table1 exchange partition all_data with table table2 including indexs without validation; 
但是问题又出现了,普通的索引建成本地索引没问题,但是分区表的主键约束要建成本地索引的话,主键约束必须要在主键列的基础上加上分区列(即mdate字段),
但就不能保证主键约束了,毕竟多加了一个mdate字段,对应用测试有影响,这种方式不行,否定掉!
然后我又上网搜了下,方法2加一个update indexes动作,脚本如下:
alter table table1 exchange partition all_data with table table2 update indexes;
我自己用几条数据做了测试,对于数据量小的表是没有问题的,主键约束没有失效,但是对于数据量大的表,执行一个小时后报oracle会话出现致命错误的错误,按我的理解
是update indexes动作和rebuild动作是一样的,都是重建全局索引,这个语句执行实在是太慢了,引发了上边这个错误(oracle会话出现致命错误),现在在叫DBA看看oracle后台这个update indexes在做什么动作,趁这个时间上网问问大家看有没有好的方案可以提供,先谢谢了!

解决方案 »

  1.   

    数据量太大不要用REBUILD索引,
    直接删除DROP索引,然后重新CREATE,
      

  2.   

    谢谢3楼的回答,重新drop掉在create的话和重建是一样的效果的,重建索引就是噩梦啊~~,呵呵!
      

  3.   

    update就是update
    你用少数据量做个测试就知道了,瞬间结束,不是rebuilt