基础介绍
Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入、删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delete操作。
对一般的DDL过程而言,Oracle都会给数据对象一个独占表锁。也就是说,在进行DDL操作的过程中,我们是不能对数据表进行DML(增加、修改和删除操作)。只有等待DDL结束,才能够继续操作。
也就是说,如果一个DDL持续时间很长,比如数据表海量大小,那么在这个长时间中,系统数据表其实是不能对外提供服务的。
Oracle在线重定义提供了解决问题的途径。我们如果需要对一个数据表进行重定义,需要定义一个中间目标表Interim。在Interim表中定义好目标结构,比如期望的存储、分区、字段关系。在线重定义使用的主要是dbms_redefinition包的对应方法。
在线重定义最大的特点是,当进行online操作的时候,我们还可以对数据表进行DML操作。结束定义过程时,期间进行的操作都是可以反馈到目标数据表中的。
目前,Oracle在线重定义支持下列种类的重定义动作:
- 插入、删除数据表列和对一个存在的数据表列改名
- 修改字段类型;
- 消除数据表段中的碎片块
- 索引、约束等对象的重定义
- 分区表转变;
查看DBMS_REDEFINITION包的使用
desc DBMS_REDEFINITION PROCEDURE ABORT_REDEF_TABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN PART_NAME VARCHAR2 IN DEFAULT PROCEDURE CAN_REDEF_TABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN TNAME VARCHAR2 IN OPTIONS_FLAG BINARY_INTEGER IN DEFAULT PART_NAME VARCHAR2 IN DEFAULT PROCEDURE COPY_TABLE_DEPENDENTS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN COPY_INDEXES BINARY_INTEGER IN DEFAULT COPY_TRIGGERS BOOLEAN IN DEFAULT COPY_CONSTRAINTS BOOLEAN IN DEFAULT COPY_PRIVILEGES BOOLEAN IN DEFAULT IGNORE_ERRORS BOOLEAN IN DEFAULT NUM_ERRORS BINARY_INTEGER OUT COPY_STATISTICS BOOLEAN IN DEFAULT COPY_MVLOG BOOLEAN IN DEFAULT PROCEDURE FINISH_REDEF_TABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN PART_NAME VARCHAR2 IN DEFAULT PROCEDURE REGISTER_DEPENDENT_OBJECT Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN DEP_TYPE BINARY_INTEGER IN DEP_OWNER VARCHAR2 IN DEP_ORIG_NAME VARCHAR2 IN DEP_INT_NAME VARCHAR2 IN PROCEDURE START_REDEF_TABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN COL_MAPPING VARCHAR2 IN DEFAULT OPTIONS_FLAG BINARY_INTEGER IN DEFAULT ORDERBY_COLS VARCHAR2 IN DEFAULT PART_NAME VARCHAR2 IN DEFAULT PROCEDURE SYNC_INTERIM_TABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN PART_NAME VARCHAR2 IN DEFAULT PROCEDURE UNREGISTER_DEPENDENT_OBJECT Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- UNAME VARCHAR2 IN ORIG_TABLE VARCHAR2 IN INT_TABLE VARCHAR2 IN DEP_TYPE BINARY_INTEGER IN DEP_OWNER VARCHAR2 IN DEP_ORIG_NAME VARCHAR2 IN DEP_INT_NAME VARCHAR2 IN
DBMS_REDEFINITION包:
- ABSORT_REDEF_TABLE:清理重定义的错误和中止重定义;
- CAN_REDEF_TABLE:检查表是否可以进行重定义,存储过程执行成功代表可以进行重定义;
- COPY_TABLE_DEPENDENTS:同步索引和依赖的对象(包括索引、约束、触发器、权限等);
- FINISH_REDEF_TABLE:完成在线重定义;
- REGISTER_DEPENDENTS_OBJECTS:注册依赖的对象,如索引、约束、触发器等;
- START_REDEF_TABLE:开始在线重定义;
- SYNC_INTERIM_TABLE:增量同步数据;
- UNREGISTER_DEPENDENT_OBJECT:不注册依赖的对象,如索引、约束、触发器等;
举例说明
下面,我们通过一个简单的例子,去看看如何使用dbms_redefinition包进行重定义操作。
现有一张用户MIS_AUDIT下的业务表audit_log需要添加一字段,数据量为6361345,考虑到由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock。在此使用Oracle提供的DBMS_REDEFINITION包执行在线重定义表.
1. 查看原表信息
select count(*) from audit_log; #数据量 COUNT(*) ---------- 6361345 desc audit_log #表结构 Name Null? Type --------------------------------------------- -------- ----------------------------------- AUDIT_LOG_ID NOT NULL NUMBER(38) PROCEDURE_ID NOT NULL NUMBER(38) PROCEDURE_DATE DATE PROCESS_ID NOT NULL NUMBER(38) JOB_ID NOT NULL NUMBER(38) TASK_ID NOT NULL NUMBER(38) TYPE NOT NULL VARCHAR2(32) MESSAGE VARCHAR2(2000) STATUS NOT NULL VARCHAR2(32) CREATE_TIME NOT NULL DATE CREATED_BY NOT NULL VARCHAR2(64) column INDEX_NAME format a25 column INDEX_TYPE format a20 column TABLE_OWNER format a20 column TABLE_NAME format a20 column TABLE_TYPE format a20 select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG'; #该表对应的索引 INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS ------------------------- ---------------- ---------------- ---------------- ---------------- ------------------------ IDX_AUDIT_LOG_TYPE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID IDX_ALOG_PROCESS_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID IDX_ALOG_PROCEDURE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID PK_AUDIT_LOG NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID column CONSTRAINT_NAME format a15 column CONSTRAINT_TYPE format a15 column INVALID format a15 column TABLE_NAME format a15 column OWNER format a15 select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG'; #该表对应的约束 CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER --------------- --------------- ---------------- ----------- --------------- SYS_C0011415 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011416 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011417 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011418 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011419 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011420 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011421 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011422 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011423 C ENABLED AUDIT_LOG MIS_AUDIT PK_AUDIT_LOG P ENABLED AUDIT_LOG MIS_AUDIT #该表拥有一个主键约束 10 rows selected.
2. 赋予用户MIS_AUDIT拥有在线重新定义表的权限
使用Online Redefinition在线重定义需要用到DBMS_REDEFINITION程序包,EXECUTE_CATALOG_ROLE角色默认被赋予该PL/SQL Package的执行权限。除了执行该程序包的权限外,用户还需要拥有以下权限:
- CREATE ANY TABLE
- ALTER ANY TABLE
- DROP ANY TABLE
- LOCK ANY TABLE
- SELECT ANY TABLE
若要执行COPY_TABLE_DEPENDENTS存储过程则还需要以下权限:
- CREATE ANY TRIGGER
- CREATE ANY INDEX
grant EXECUTE_CATALOG_ROLE,CREATE ANY TABLE,ALTER ANY TABLE,DROP ANY TABLE,LOCK ANY TABLE,SELECT ANY TABLE,CREATE ANY TRIGGER,CREATE ANY INDEX to mis_audit;
3. 查看该业务表是否支持在线重定义
有两种在线重定义的方法.
- 第一种是我们较为推荐的方式,采用Primary Key主键或者pseudoprimary key伪主键实施重定义(从Oracle 10g开始支持pseudoprimary key伪主键)。 这里pseudoprimary key伪主键要求是唯一键且所有的成员列均是非空NOT NULL。使用该种方式,重定义前和重定义后版本的表均必须有相同的Primary Key主键或者pseudoprimary key伪主键列。不管是从性能角度,还是从操作的复杂度考虑,常规场景中都推荐尽可能使用此种方式
- 第二种方式是使用rowid进行redefinition。首先索引组织表index-organized table (IOT)不支持使用rowid的重定义方式。此外,若使用该种redefinition方式,最终会有一个隐藏的字段M_ROW$$被加入到重定义后版本的表上,Oracle官方推荐在重定义完成后将该M_ROW$$字段drop掉或者标记为unused。
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_ROWID); #查看该表是否支持primary key方式重定义 PL/SQL procedure successfully completed. EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_PK); #查看该表是否支持ROWID方式重定义 PL/SQL procedure successfully completed.
4. 获取业务表的ddl语句
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE); EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',True); EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true); select dbms_metadata.get_ddl('TABLE','AUDIT_LOG','MIS_AUDIT') from dual; #获取业务表的DDl语句 DBMS_METADATA.GET_DDL('TABLE','AUDIT_LOG','MIS_AUDIT') -------------------------------------------------------------------------------- CREATE TABLE "MIS_AUDIT"."AUDIT_LOG" ( "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE, "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE, "PROCEDURE_DATE" DATE, "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE, "JOB_ID" NUMBER(*,0) NOT NULL ENABLE, "TASK_ID" NUMBER(*,0) NOT NULL ENABLE, "TYPE" VARCHAR2(32) NOT NULL ENABLE, "MESSAGE" VARCHAR2(2000), "STATUS" VARCHAR2(32) NOT NULL ENABLE, "CREATE_TIME" DATE NOT NULL ENABLE, "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE, CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATIS TICS NOLOGGING TABLESPACE "TOOL" ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS NOLOGGING TABLESPACE "TOOL" ; select dbms_metadata.get_ddl('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT') from dual; #获取表的创建主键约束的语句 DBMS_METADATA.GET_DDL('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT') -------------------------------------------------------------------------------- ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY K EY ("AUDIT_LOG_ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE S TATISTICS NOLOGGING TABLESPACE "TOOL" ENABLE;
5.创建中间表AUDIT_LOG_TEMP
修改建表语句,增加字段location,这里不要创建任何索引和主键约束信息,只要创建基本的表结构对象
CREATE TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP"( "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE, "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE, "PROCEDURE_DATE" DATE, "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE, "JOB_ID" NUMBER(*,0) NOT NULL ENABLE, "TASK_ID" NUMBER(*,0) NOT NULL ENABLE, "TYPE" VARCHAR2(32) NOT NULL ENABLE, "MESSAGE" VARCHAR2(2000), "STATUS" VARCHAR2(32) NOT NULL ENABLE, "CREATE_TIME" DATE NOT NULL ENABLE, "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE, "LOCATION" VARCHAR2(256) );
6.开始重定义过程
set timing on begin DBMS_REDEFINITION.START_REDEF_TABLE(uname => 'MIS_AUDIT', orig_table => 'AUDIT_LOG', int_table => 'AUDIT_LOG_TEMP', col_mapping => 'AUDIT_LOG_ID AUDIT_LOG_ID, PROCEDURE_ID PROCEDURE_ID, PROCEDURE_DATE PROCEDURE_DATE, PROCESS_ID PROCESS_ID, JOB_ID JOB_ID, TASK_ID TASK_ID, TYPE TYPE, MESSAGE MESSAGE, STATUS STATUS, CREATE_TIME CREATE_TIME, CREATED_BY CREATED_BY', options_flag => DBMS_REDEFINITION.CONS_USE_PK); end; / PL/SQL procedure successfully completed. Elapsed: 00:02:01.18 select count(*) from audit_log_temp; COUNT(*) ---------- 6361345
select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP'; no rows selected Elapsed: 00:00:00.05
若在完成重定义(执行finish_redef_table)之前希望中断在线重定义表,则需要使用DBMS_REDEFINITION.ABORT_REDEF_TABLE明确手动中断abort
begin dbms_redefinition.abort_redef_table(uname => 'MIS_AUDIT', orig_table => 'AUDIT_LOG', int_table => 'AUDIT_LOG_TEMP'); end; / PL/SQL procedure successfully completed.
6.调用COPY_TABLE_DEPENDENTS过程克隆依赖对象
(自动在AUDIT_LOG_TEMP表上创建触发器,索引,物化视图日志,授权和约束)
DECLARE num_errors PLS_INTEGER; BEGIN DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname => 'MIS_AUDIT', orig_table => 'AUDIT_LOG', int_table => 'AUDIT_LOG_TEMP', copy_indexes => DBMS_REDEFINITION.cons_orig_params, copy_triggers => TRUE, copy_constraints => TRUE, copy_privileges => TRUE, copy_statistics => TRUE, ignore_errors => FALSE, num_errors => num_errors ); END; / DECLARE * ERROR at line 1: ORA-01442: column to be modified to NOT NULL is already NOT NULL ORA-06512: at "SYS.DBMS_REDEFINITION", line 1015 ORA-06512: at "SYS.DBMS_REDEFINITION", line 1907 ORA-06512: at line 4 Elapsed: 00:01:49.43
可以通过DBA_REDEFINITION_ERRORS视图来判断在使用COPY_TABLE_DEPENDENTS存储过程克隆依赖对象过程中是否产生了错误。该视图记录了重定义过程中在克隆依赖对象时产生的错误。 克隆对象可能因缺少系统资源或原表的一个逻辑结构变化而失败。在我们成功克隆这些依赖对象后,相关错误将会从该视图中被移除。 我们可以反复执行COPY_TABLE_DEPENDENTS尝试重新克隆依赖对象。
column OBJECT_TYPE format a15 column OBJECT_NAME format a15 column DDL_TXT format a150 select OBJECT_TYPE,OBJECT_NAME,DDL_TXT from DBA_REDEFINITION_ERRORS; OBJECT_TYPE OBJECT_NAME DDL_TXT --------------- --------------- ------------------------------------------------------------------------------------------------------------------------------------------------------ CONSTRAINT SYS_C0011622 ALTER TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP" MODIFY ("JOB_ID" CONSTRAINT "TMP$$_SYS_C00116220" NOT NULL ENABLE NOVALIDATE)
由于之前指定了主键,所以已经是not null 了,检查可以看到索引已经创建成功。
select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP'; INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------ TMP$$_IDX_AUDIT_LOG_TYPE_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID TMP$$_IDX_ALOG_PROCESS_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID TMP$$_IDX_ALOG_PROCEDURE_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID TMP$$_PK_AUDIT_LOG0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID Elapsed: 00:00:00.00
此时查看临时表的约束,发现主键约束并没有同步过来,
select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP'; CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER --------------- --------------- ------------------------ --------------- --------------- SYS_C0011656 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011657 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011658 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011659 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011660 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011661 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011662 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011663 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011664 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT 9 rows selected. Elapsed: 00:00:00.00
7. 利用sync_interim_table过程同步临时表的数据减少finish_redef_table的耗时
BEGIN DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP'); END; / PL/SQL procedure successfully completed. Elapsed: 00:00:00.07
8. 执行finish_redef_table过程完成重定义
最后使用finish_redef_table来将两个表的名互换,以实现功能重定义的功能。原表更名为了中间表AUDIT_LOG_TEMP,可以Drop掉了。
BEGIN DBMS_REDEFINITION.FINISH_REDEF_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP'); END; / PL/SQL procedure successfully completed. Elapsed: 00:00:03.21
9. 查看原表信息确认在线定义已经完成
desc audit_log Name Null? Type ----------------------------------------------------- -------- ------------------------------------ AUDIT_LOG_ID NOT NULL NUMBER(38) PROCEDURE_ID NOT NULL NUMBER(38) PROCEDURE_DATE DATE PROCESS_ID NOT NULL NUMBER(38) JOB_ID NOT NULL NUMBER(38) TASK_ID NOT NULL NUMBER(38) TYPE NOT NULL VARCHAR2(32) MESSAGE VARCHAR2(2000) STATUS NOT NULL VARCHAR2(32) CREATE_TIME NOT NULL DATE CREATED_BY NOT NULL VARCHAR2(64) LOCATION VARCHAR2(256) MIS_AUDIT@userdata>select count(*) from audit_log; COUNT(*) ---------- 6361345 Elapsed: 00:00:00.49 select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG'; INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------ IDX_AUDIT_LOG_TYPE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID IDX_ALOG_PROCESS_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID IDX_ALOG_PROCEDURE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID PK_AUDIT_LOG NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
10.删除临时表的主键约束并添加主键约束到原表
select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG'; CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER --------------- --------------- ------------------------ --------------- --------------- SYS_C0011656 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011657 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011658 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011659 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011660 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011661 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011662 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011663 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011664 C ENABLED AUDIT_LOG MIS_AUDIT 9 rows selected. Elapsed: 00:00:00.05 select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP'; CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER --------------- --------------- ------------------------ --------------- --------------- SYS_C0011622 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011623 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011624 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011625 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011626 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011627 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT PK_AUDIT_LOG P ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011619 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011620 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT SYS_C0011621 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT 10 rows selected. Elapsed: 00:00:00.00 alter table AUDIT_LOG_TEMP drop constraint PK_AUDIT_LOG; Table altered. ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID"); Table altered. Elapsed: 00:00:00.09 select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG'; CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER --------------- --------------- ------------------------ --------------- --------------- PK_AUDIT_LOG P ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011656 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011657 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011658 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011659 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011660 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011661 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011662 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011663 C ENABLED AUDIT_LOG MIS_AUDIT SYS_C0011664 C ENABLED AUDIT_LOG MIS_AUDIT 10 rows selected. Elapsed: 00:00:00.01
参考
http://blog.itpub.net/23135684/viewspace-1765128/
http://www.askmaclean.com/archives/know-oracle-online-redefinition.html
http://debugo.com/%E4%BD%BF%E7%94%A8%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%AE%9A%E4%B9%89%E6%94%B9%E5%8F%98%E8%A1%A8%E7%9A%84%E6%89%80%E5%9C%A8%E8%A1%A8%E7%A9%BA%E9%97%B4/
http://blog.itpub.net/24930246/viewspace-2063727/