在线重定义
在线重定义概念:
在线重定义(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的表结构、约束信息与中间表的互相交换,二者数据量一致。
可以普通表转为分区表;
分区表也可以重定义
注:转载