[Oracle]在线表重定义 - 普通表到分区表(三)

2014-11-24 16:10:24 · 作者: · 浏览: 6
L03 COL03,COL04 COL04,COL05 COL05,
CASETYPE CASETYPE,HOSPRESOURCEID HOSPRESOURCEID,HOSPTIMESECTION HOSPTIMESECTION,
HOSPTREATMENTTIME HOSPTREATMENTTIME,COMMENTS COMMENTS, HOSPITALUUID HOSPITALUUID,
OPEN_TIME OPEN_TIME,SCID SCID,ESTID ESTID,CLINICTYPEUUID CLINICTYPEUUID,
SHIFTDATE OPERATIONDATE',
dbms_redefinition.cons_use_pk);
END;
这步开始拷贝数据,因此需要一些时间,在这过程中,依然可以在原表上做select查询和DML操作。
5. 拷贝依赖对象(索引,触发器等)和统计信息:
[sql]
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('p95169', 'shift_case','shift_case_interim',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/
注意:上面我们把ignore_errors设为true,表示即时有错误发生,也不会导致改存储过程失败,这时你一定要记得在下一步查看是否有错误。
6. 从视图DBA_REDEFINITION_ERRORS查询上一步的错误信息:
[sql]
SYS@TEST16>select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;
OBJECT_NAME BASE_TABLE_NAME DDL_TXT
------------------------------ ------------------------------ --------------------------------------------------------------------------------
PK_SHIFTCASE_2 SHIFT_CASE CREATE UNIQUE INDEX "P95169"."TMP$$_PK_SHIFTCASE_20" ON "P95169"."SHIFT_CASE_INT
ERIM" ("SCID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 9437184 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FL
ASH_CACHE DEFAULT)
TABLESPACE "DATA"
SYS_C009009 SHIFT_CASE ALTER TABLE "P95169"."SHIFT_CASE_INTERIM" MODIFY ("CASETYPE" CONSTRAINT "TMP$$_S
YS_C0090090" NOT NULL ENABLE NOVALIDATE)
类似以上的错误信息是因为中间表已经有主键和约束,所以导致失败,这些错误可以忽略。
7. (可选)同步中间表
[sql]
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('p95169', 'shift_case','shift_case_interim');
END;
/
8. 执行FINISH_REDEF_TABLE结束表重定义:
[sql]
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('p95169', 'shift_case','shift_case_interim');
END;
/
在这过程中,原表上有排他锁,但时间很短,对应用几乎没有影响,执行成功后,原表定义已成功改变。
9. Drop中间表
drop table shift_case_interim;