ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在线重定义

在线重定义

原创 Linux操作系统 作者:wei-xh 时间:2010-09-21 12:08:12 0 删除 编辑

--------------对表T增加字段name-----------------------
------创建原始表T
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL>
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建50316行。

SQL>
SQL> COMMIT;

提交完成。

-----创建中间表T_NEW
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE ,NAME VARCHAR2(20));

表已创建。

------调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,如果表不满足重定义的条件,将会报错并给出原因。
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。


-------调用DBMS_REDEFINITION.START_REDEF_TABLE()过程,并提供下列参数:被重定义的表的名称、中间表的名称、列的映射规则、重定义方法。
SQL>  EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW','ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。


如果操作期间对表T有大量DML操作,可以执行SYNC_INTERIM_TABLE来减少finsh_redef_table的锁表时间。
SQL> EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE(user,'T','T_NEW');

PL/SQL 过程已成功完成。


-------执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()过程完成表的重定义。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW');

PL/SQL 过程已成功完成。


-------查看表T的表结构,已经增加了name列。
SQL> desc t
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 TIME                                               DATE
 NAME                                               VARCHAR2(20)

 

 


-------------把表T变为分区表-------------------------------------
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。


SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建50330行。

SQL> commit;

提交完成。


SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
  2  (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
  3  PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
  4   PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
  5  PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。


SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW','ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。


SQL> SELECT COUNT(*) FROM T PARTITION (P4);

  COUNT(*)
----------
     50330

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

下一篇: UNDO
请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2425351