使用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表上有新增的列, 两个不同的人在同时做这两件事时, 真的很难预先想到这一点.
留言 (2)
纯属自己添乱. :)
不过我碰到一例真实的故障.
故事是这样的, SQL generate script 成批Online Redefin,单机数据库啥问题也没有.
4 Nodes RAC, run batch script on node3, redefin like 100 tables.
after successfully FINISH_REDEF_TABLE, no errors on node3.
But node1 can't see 3 of them.
于是引起网站不能注册新用户,关联到一些辅助表 和 审计表.
I never thought it's a RAC bug, after 2 hours fighting, restart all the nodes, got sync.
彻底摧毁了我对Oracle的信任,引脑撞击桌子角.
Posted by 木匠 | Mar 22, 2007 1:46 PM
Oracle 10.1.0.4 on Linux, RHAS3.0, Hugh memory kernal. 3.7G SGA.
Posted by 木匠 | Mar 22, 2007 1:47 PM