ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 表的联机在线重定义

表的联机在线重定义

原创 Linux操作系统 作者:BTxigua 时间:2011-12-08 22:15:50 0 删除 编辑

我拿联机在线重定义常用的作用:
1)回收高水位
2)将普通表转化为分区表


--因为对象改变了,同义词失效,相关存储过程失效
--索引名字和表空间能保持不变
--默认需要主键进行重定义,否则使用rowid

--检查是否可以在线重定义
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE (
   uname         => 'COMM',
   tname         => 'ACTION_PRESENT_RECODE',
   options_flag  => DBMS_REDEFINITION.CONS_USE_PK, --DBMS_REDEFINITION.CONS_USE_ROWID
   part_name     => NULL);
end ;
/

--按照在线重定义后的最终表结构,创建中间表
create table INT_ACTION_PRESENT_RECODE as select * from ACTION_PRESENT_RECODE WHERE 1=2 ;
实际执行的过程中,还是得把表的ddl定义给捞出来,重新执行一遍。
使用create table as的方法会丢失很多东西,比如字段的default值、comment等。
尤其是default值会导致应用出问题。

--开始重定义过程
begin
DBMS_REDEFINITION.START_REDEF_TABLE (
   uname          => 'COMM',
   orig_table     => 'ACTION_PRESENT_RECODE',
   int_table      => 'INT_ACTION_PRESENT_RECODE',
   col_mapping    => NULL,
   options_flag   => DBMS_REDEFINITION.CONS_USE_PK,
   orderby_cols   => NULL,
   part_name      => NULL);
end;
/

--将相关的表信息拷贝过去
--Automatically create any triggers, indexes, grants, and constraints.
DECLARE
num_errors PLS_INTEGER;
begin
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
   uname                    => 'COMM',
   orig_table               => 'ACTION_PRESENT_RECODE',
   int_table                => 'INT_ACTION_PRESENT_RECODE',
   copy_indexes             => 1,
   copy_triggers            => TRUE,
   copy_constraints         => TRUE,
   copy_privileges          => TRUE,
   ignore_errors            => FALSE,
   num_errors               => num_errors,
   copy_statistics          => TRUE);
end ;
/

--将重定义过程的变化量同步过去
begin
DBMS_REDEFINITION.SYNC_INTERIM_TABLE (
   uname          => 'COMM',
   orig_table     => 'ACTION_PRESENT_RECODE',
   int_table      => 'INT_ACTION_PRESENT_RECODE',
   part_name      => NULL);
end ;
/

--结束重定义
begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE (
   uname       => 'COMM',
   orig_table  => 'ACTION_PRESENT_RECODE',
   int_table   => 'INT_ACTION_PRESENT_RECODE',
   part_name   => NULL);
end ;
/

--如果有错误,用该过程强制结束重定义过程
begin
DBMS_REDEFINITION.ABORT_REDEF_TABLE (
   uname       => 'COMM',
   orig_table  => 'ACTION_PRESENT_RECODE',
   int_table   => 'INT_ACTION_PRESENT_RECODE',
  part_name    => NULL);
end ;
/

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10867315/viewspace-712992/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-31

  • 博文量
    101
  • 访问量
    279141