在线重定义

在线重定义概念: 

      在线重定义(online Table RedefinItion),在重定义表结构的过程中不影响使用者,使用者仍然可以进行存取、新增、修改、删除等操作,是实现数据库高可用性一个很重要的方法。

在oracle数据库提供一个 DBMS_REDEFINITION套件,下面是该套件里重要的程序:

CAN_REDEF_TABLE

START_REDEF_TABLE

FINISH_REDEF_TABLE

SYNC_INITERIM_TABLE

ABSORT_REDEF_TABLE

COPY_TABLE_DEPENDENTS

REGISTER_DEPENDENTS_OBJECTS

源表:
create table  teacher(
  TNO    NUMBER(4),
  TNAME  VARCHAR2(10),
  SAL      NUMBER(10)
  )
tablespace  temp

  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

那么该表想进行变更:

1.增加索引 TNO  

2.字段名称修改SAL 为TSAL 

 

具体操作实践:

1、验证能否表进行在线重定义

 默认为主键在线重定义的方式

begin
 dbms_redefinition.can_redef_table('EPASSPORT','TEACHER');
 end;

这种方式有时会提示错误:

ORA-12089: 不能联机重新定义无主键的表 "EPASSPORT"."TEACHER"
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1479
ORA-06512: 在 line 2

那么试试以rowid重定义

  begin
    dbms_redefinition.can_redef_table('EPASSPORT','TEACHER',2);
   end;

    /

    或者

    begin
    dbms_redefinition.can_redef_table('EPASSPORT','TEACHER',dbms_redefinition.cons_use_rowid );
    end;

注: 

    cons_use_pk      CONSTANT PLS_INTEGER := 1;---主键重定义
    cons_use_rowid  CONSTANT PLS_INTEGER := 2;---rowid重定义

2、创建中间表
create table TEACHER_temp
(
  TNO   NUMBER(4) not null,
  TNAME VARCHAR2(10),
  TSAL   NUMBER(10)
)
tablespace temp

  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table TEACHER_temp
  add constraint TEACHER_INDEX1 primary key (TNO)
  using index
  tablespace temp
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

3、开始进行重定义

execute dbms_redefinition.start_redef_table('epassport','TEACHER','TEACHER_temp',null,2);

注:输入参数说明        PROCEDURE start_redef_table

                              (uname        IN VARCHAR2,----用户名
                              orig_table   IN VARCHAR2,----源表名
                              int_table    IN VARCHAR2,----中间表名
                              col_mapping  IN VARCHAR2 := NULL,---源表和中间表列之间的映射,map;
                              options_flag IN BINARY_INTEGER := 1,---重定义方式
                              orderby_cols IN VARCHAR2 := NULL,---对于分区表重定义的时候,分区列名
                              part_name    IN VARCHAR2 := NULL);---对于分区表重定义的时候,需要重定义的分区。其中最后2个参数没用到,因为这里是由普通表转换为分区表

有时报错:

ORA-00942: 表或视图不存在
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 50
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1343
ORA-06512: 在 line 1

这个可能是权限问题

4、保证数据的一致性

execute dbms_redefinition.sync_interim_table ('epassport','TEACHER','TEACHER_temp');

5、完成重定义
execute dbms_redefinition.finish_redef_table('epassport','TEACHER','TEACHER_temp');

desc TEACHER

/

6、删除中间表

DROP TABLE epassport.'TEACHER_temp 

注:

结论:

重定义的方式有2个按照rowid、主键;

重定义的过程中可以对表进行DML操作;

重定义的速度还是挺快的;

重定义需要用户有一定系统权限(不知道是不是合适这么说)、需要一个中间表(中间表的结构、列名可以与be_organized的表不同)、重定义开始到重定义结束需要在中间表上建一系列约束;重定义完成之后的效果是:

be_organized的表结构、约束信息与中间表的互相交换,二者数据量一致。

可以普通表转为分区表;

分区表也可以重定义

注:转载

 

 

   

 

 

 

 

 

 

 

posted on 2012-01-13 18:11  half-acre  阅读(2208)  评论(0编辑  收藏  举报