Oracle联机表重定义简单测试

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值