使用Online Redefination技术可极少停机时间, 不过也发生过一些小故事. 首先来看一下表能不能支持联机重定义:

SQL>  exec dbms_redefinition.can_redef_table( USER, 'T_DEF1') ;

PL/SQL procedure successfully completed.

    接下来正式开始进行联机重定义:

SQL> exec dbms_redefinition.START_REDEF_TABLE( USER, 'T_DEF1', 'T_DEF1_TMP');

PL/SQL procedure successfully completed.

    在将要结束前, 先同步一下变更的记录, 可以常跑这个过程, 以让结束时更快一些.

SQL> exec dbms_redefinition.sync_interim_table( USER, 'T_DEF1', 'T_DEF1_TMP');

PL/SQL procedure successfully completed.

    可是现在我在表上面加一个列呢?

SQL> alter table t_def1 add col1000 number;

Table altered.

    现在正式结束联机重定义:

SQL> exec dbms_redefinition.FINISH_REDEF_TABLE(USER, 'T_DEF1', 'T_DEF1_TMP');

PL/SQL procedure successfully completed.

    再来查查表结构?

SQL> desc T_DEF1
Name                   Null?    Type
---------------------- -------- -----------------
OBJECT_ID              NOT NULL NUMBER
......
SECONDARY                       VARCHAR2(1)

SQL> desc T_DEF1_TMP
Name                   Null?    Type
---------------------- -------- ------------------
OBJECT_ID              NOT NULL NUMBER
......
SECONDARY                       VARCHAR2(1)
COL1000                         NUMBER

    只有Temp表上有新增的列, 两个不同的人在同时做这两件事时, 真的很难预先想到这一点.