Oracle联机表重定义测试简单
一、联机表重定义的特性
1.对列进行添加、删除、重命名
2.转换表数据
3.重新命名表的约束
4.改变原始表的参数
5.减少表中的碎片
6.联机创建一个常规表之外的分区表
7创建一个常规表之外的索引组织表(I0T)
8.将表移动到另一个表空间
二、联机表重定义的步骤
1.确定适合进行重定义的表
2.决定新表的结构,并创建一个简单的步骤
3.使用dbms_redefinition程序包,启动重定义过程
4.在新表中执行定期的数据同步和验证
5.完成表的重定义
三。联机表重定义的方法
可以是使用两种方法来进行联机表重定义:主键方法和ROWID方法。
ROWID方法更复杂一些,Oracle推荐使用比较容易的主键方法,该方法要求
原始表和重定义表具有形同的主键列
四、简单联机表重定义(要具备必要的权限,详细参考oracle官方文档)
1.查看原始表结构
TEST@test>desc t
名称 是否为空? 类型
----------------------------------------------------- -------- ------------------------------------
DEPTNO NOT NULL NUMBER(2)------------该表主键列
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
2.检验表的资格,使用dbms_redefinition程序包
TEST@test>begin
2 dbms_redefinition.can_redef_table(
3 uname => 'test',
4 tname => 't',
5 options_flag => dbms_redefinition.cons_use_pk
6 );
7 end;
8 /
PL/SQL 过程已成功完成。
can_redef_table过程中,三个参数解释如下
uname:表的所有者名称或解释为模式所有者名称
tname:原始表名称
optons_flag: 指定联机表重定义方法,它有两个可能的值,
如果使用主键方法,该参数值为dbms_redefinition.cons_use_pk,
如果使用ROWID方法,该蚕食值为dbms_redefinition。cons_use_rowid
如果以上过程不使用该参数,那么默认的它将使用主键方法
3.创建临时表
TEST@test>create table int_t(
2 deptno number(2) not null,
3 dname varchar2(14),
4 loc char(15) not null,--------改变了类型,并not null
5 type varchar(10)---------------添加了一列
6 );
表已创建。
4.启动重定义过程
TEST@test>begin
2 dbms_redefinition.start_redef_table(
3 uname => 'test',
4 orig_table => 't',
5 int_table => 'int_t',
6 col_mapping => 'deptno deptno,dname dname,loc loc',
7 options_flag => dbms_redefinition.cons_use_pk
8 );
9 end;
10 /
PL/SQL 过程已成功完成。
start_redef_table过程参数解释如下
uname:这是模式名称,同上过程
orig_table:这是要进行重定义的表名称
int_table:这是临时表名称
col_mapping:这个参数指定了临时表和原始表的列之间的映射关系
如果没有对此列映射参数提供任何值,原始表中的所有都将包含在临时表中
options_flag:这个参数指定重定义方法,若此过程不包含该参数,将使用默认主键方法
5.复制依赖对象,使用dbms_redefinition.copy_dependents过程,
该过程自动为临时表创建所有已有的如触发器,索引,授权已经约束等对象
TEST@test>DECLARE
2 num_errors PLS_INTEGER;
3 BEGIN
4 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('test', 't','int_t',
5 DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
6 END;
7 /
PL/SQL 过程已成功完成。
只要没有执行结束重定义过程都可以对原始表进行查询,dml操作,
用户在此期间所做的更改都被记录在实体化日志中
因此可通过并行重定义作业改进重定义进程的性能。要做到这点
在执行start_redefinition_table过程启动表重定义进程前执行
下列语句:
alter session force parallel dml parallel degree-of-parallelism(并行度);
alter session force parallel query parallel degree-of-parallelism;
6.同步临时表和原始表,使用sync_interim_table过程,这是可选的步骤
TEST@test>begin
2 dbms_redefinition.sync_interim_table(
3 uname => 'test',
4 orig_table => 't',
5 int_table => 'int_t'
6 );
7 end;
8 /
PL/SQL 过程已成功完成。
在启动重定义过程之后(通过执行start_redef_table过程),仅当用户确认原始表中
已经执行了大量的更新操作时,应当使用此过程。如果执行了大量的更新操作,通过使用
sync_interim_table过程,可以在重定义过程的最后一个阶段节省时间。如果忽略此过程,
最后执行finish_redef_table过程会同步执行。
7.完成重定义过程
TEST@test>begin
2 dbms_redefinition.finish_redef_table(
3 uname => 'test',
4 orig_table => 't',
5 int_table => 'int_t'
6 );
7 end;
8 /
PL/SQL 过程已成功完成。
在运行finish_redef_table过程时,将发生下面的事情
1.oracle读取原始表的实体化日志,向临时表添加内容
2.原始表重新被定义,并具有临时表全部的属性,如索引,约束,授权
3.涉及int_t表的任何一个参照约束都可以使用
4.定义在临时表上的任何一个新的触发器可以在新重定义表上使用
5.在独占模式下两个表暂时被锁定,以确保数据目录中必要的更改
6.实体化视图和日志将被删除
完成了表的重定义后就可以删除临时表。在删除临时表时,原始表的所有索引,出发器和约束也被删除,
因为此时原始表已将变成临时表。新表会具有所有必要的触发器,索引,授权和约束。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26861223/viewspace-757827/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26861223/viewspace-757827/