表在线重定义原理:
oracle表的在线重定义是通过,prebuilt物化视图实现的,在执行DBMS_REDEFINITION.START_REDEF_TABLE()后,我们可以通过查询,user_mviews与user_mview_logs和查看prebuilt物化视图,发现增加了对应的物化视图和物化视图日志,而SYNC_INTERIM_TABLE(),其实也只是物化视图的增量刷新,最终执行FINISH_REDEF_TABLE()的时候,将锁定原表,防止表上的DML,物化视图执行刷新,完成刷新后,将删除物化视图和对应的日志,将中间表rename成目标表。注意:如果业务系统比较繁忙,那么在最后一步会阻塞业务。
begin DBMS_REDEFINITION.CAN_REDEF_TABLE('chunqiu','WL_FLOW_INFO', DBMS_REDEFINITION.CONS_USE_PK); end;
begin dbms_redefinition.start_redef_table('chunqiu','WL_FLOW_INFO','WL_FLOW_INFO_tmp'); end;
begin dbms_redefinition.sync_interim_table('chunqiu','WL_FLOW_INFO','WL_FLOW_INFO_tmp'); end;
begin dbms_redefinition.finish_redef_table('chunqiu','WL_FLOW_INFO','WL_FLOW_INFO_tmp'); end;
如果操作失败,查找原因,后续处如下处理后可以再次重做:
begin DBMS_REDEFINITION.abort_redef_table('chunqiu','WL_FLOW_INFO','WL_FLOW_INFO_tmp') ; end;