简单说明一下:比如你建立一张分区表,通过使用像物化视图日志这样的技术进行将生产表同步数据到新的分区表上,数据量大的话,会同步的时间长一些。数据基本同步已经差不多的时间 ,可以将业务暂停一下,将两个表的数据同步成一样,此时因为只有少量的新数据进行同步,花时较少。进行两...
显示全部简单说明一下:比如你建立一张分区表,通过使用像物化视图日志这样的技术进行将生产表同步数据到新的分区表上,数据量大的话,会同步的时间长一些。数据基本同步已经差不多的时间 ,可以将业务暂停一下,将两个表的数据同步成一样,此时因为只有少量的新数据进行同步,花时较少。进行两个表的身份互换。这样就达到你想要的结果 了。此时那个分区表就成为你的业务表了,当然做这个前需要你对业务表进行评估,再有就是充分的实验。(备份与回退方案,也是要有的。)
下面赋一个小小的例子,你可以到官网再学习一下。
基于主键的在线重定义
(1)验证是否满足基于主键在线重定义要求
exec dbms_redefinition.can_redef_table('SEC','R',dbms_redefinition.cons_user_pk);
(2)创建在线重定义中间表R_REDEF,表空间设置为目标TBS_ASSM
drop table r_redef purge;
create table r_redef tablespace tbs_assm as select * from t where 0=1;
alter table r_redef add constraint pk_r_redef primary key (x);
alter index pk_r_redef rebuild tablespace tbs_assm;
(3)查看R表和R_REDEF表以及他们主键索引所在的表空间
select segment_name,segment_type,tablespace_name from dba_segments where segment_name in ('R','PK_R','R_REDEF','PK_R_REDEF');
(4)启动在线重定义
exec dbms_redefinition.start_redef_table('SEC','R','R_REDEF');
(5)发现此时中间表的索引所在表空间发生了变化,指向默认USERS表空间
select segment_name,segment_type,tablespace_name from dba_segments where segment_name in ('R','PK_R','R_REDEF','PK_R_REDEF');
(6)在完成在线重定义之前可以手工同步数据
exec dbms_redefinition.sync_interim_table('SEC','R','R_REDEF');
(7)完成在线重定义
exec dbms_redefinition.finish_redef_table('SEC','R','R_REDEF');
(8)查看R表与主键索引的对应关系
R表与中间表R_REDEF互换后,对应的主键索引并没有互换,因此T表些时对应的主键索引名称是PK_R_REDEF。
select table_name,index_name from user_indexes where table_name='R';
(9)再次查看R表和R_REDEF表以及他们主键索引所在的表空间
select segment_name,segment_type,tablespace_name from dba_segments where segment_name in ('R','PK_R','R_REDEF','PK_R_REDEF');
可见此时,T表的表空间已经从原来的手动段空间管理表空间TBS_MSSM调整到了自动段空间管理TBS_ASSM。
(10)将R表的主键索引使用online选项调整到TBS_ASSM表空间上
alter index PK_R_REDEF rebuild tablespace TBS_ASSM online;
(11)最终结果
select segment_name,segment_type,tablespace_name from dba_segments where segment_name in ('R','PK_R','R_REDEF','PK_R_REDEF');
收起