?这个特性对24*7的数据库系统来说非常重要,使用这个技术DBA可以在保持表允许DML语句的情况下修改结构,比如添加列、移动表到其他表空间、?处理表的碎片等,当然了对于表的碎片处理,在10g以后,可以考虑使用shrink操作来实现,关于shrink在这里不做讨论。
?在线重定义具有以下功能:
(1)修改表的存储参数;
(2)可以将表转移到其他表空间;
(3)在表上增加、修改或删除一列或是多列;
(4)增加并行查询选项;
(5)增加分区支持;
(6)修改分区结构;
(7)重建表以减少碎片;
(8)将堆表改为索引组织表或相反的操作;
?在线重定义的方法
1.基于主键
2.基于ROWID。ROWID的方式不能用于索引组织表,而且重定义后会存在隐藏列M_ROW$$。
?默认采用主键的方式。
?在线重定义的一些限制
1.要求原始表和中间表在同一个方案下;
2.要求有2倍甚至是多于2倍的表空间空间;
3.如果使用主键重定义的方式,原始表上要有主键;
?模拟普通表重构成分区表,添加字段操作。
--删除之前测试数据表
--在DB用户执行
SQL> DROP TABLE MXQ03;
?
?Table dropped
?SQL>? DROP TABLE MXQ04;
?
?DROP TABLE MXQ04
?
?Table dropped
--创建模拟数据
--创建普通表
SQL>? CREATE TABLE "DB"."MXQ03"
? 2? ? (? ? "ID" NUMBER(10,0),
? 3? ? ? "NAME" VARCHAR2(20),
? 4? ? ? "NEW_DATE" DATE
? 5? ? ) TABLESPACE "SMSDB_DATA";
?
?Table created
?SQL>? ? create index name_dex on MXQ03(name);
?
?Index created
?SQL>? ? alter table mxq03 add constraint pk_id_03 primary key(id);
?
?Table altered
?SQL>? INSERT INTO MXQ03 VALUES(1,'A',SYSDATE);
?
?1 row inserted
?SQL>? INSERT INTO MXQ03 VALUES(2,'B',SYSDATE);
?
?1 row inserted
?SQL>? INSERT INTO MXQ03 VALUES(3,'C',SYSDATE);
?
?1 row inserted
?SQL>? INSERT INTO MXQ03 VALUES(4,'D',SYSDATE);
?
?1 row inserted
?SQL>? INSERT INTO MXQ03 VALUES(5,'E',SYSDATE);
?
?1 row inserted
?SQL>? INSERT INTO MXQ03 VALUES(6,'F',SYSDATE);
?
?1 row inserted
?SQL> COMMIT;
?
?Commit complete
创建分区临时表
SQL>? ? CREATE TABLE "DB"."MXQ04"
? 2? ? (? ? "ID" NUMBER(10,0),
? 3? ? ? "NAME" VARCHAR2(20),
? 4? ? ? ? ? "old" varchar2(20),
? 5? ? ? "NEW_DATE" DATE)
? 6? ? partition by range(ID)
? 7? ? (partition mxq_3 values less than (3),
? 8? ? partition mxq_6 values less thAn (10)) TABLESPACE "SMSDB_DATA";
?
?Table created
--在SYS用户执行
--判断表是否支持重构
SQL> exec dbms_redefinition.can_redef_table('DB','MXQ03');
?
?PL/SQL procedure successfully completed
--启动重构表
SQL> exec dbms_redefinition.start_redef_table('DB','MXQ03','MXQ04','ID ID,NAME NAME,new_date new_date');
?
?PL/SQL procedure successfully completed
?
--复制索引、主键、触发器。。。。。
SQL> var v_log number;
?SQL> exec dbms_redefinition.copy_table_dependents('sdb','mxq03','mxq04',NUM_ERRORS => :V_log);
?
?PL/SQL procedure successfully completed
?v_log
?---------
?0
--开始同步
SQL> exec dbms_redefinition.sync_interim_table('db','mxq03','mxq04');
?
?PL/SQL procedure successfully completed
?
--完成同步
SQL> exec dbms_redefinition.finish_redef_table('db','mxq03','mxq04');
?
?PL/SQL procedure successfully completed
--源表结构已经加上了old字段
SQL> desc db.mxq03;
?Name? ? Type? ? ? ? Nullable Default Comments
?-------- ------------ -------- ------- --------
?ID? ? ? NUMBER(10)? Y? ? ? ? ? ? ? ? ? ? ? ?
?NAME? ? VARCHAR2(20) Y? ? ? ? ? ? ? ? ? ? ? ?
?old? ? ? VARCHAR2(20) Y? ? ? ? ? ? ? ? ? ? ? ?
?NEW_DATE DATE? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ?
?
?
--查询数据都已经同步
SQL> select * from db.mxq03;
?
? ? ? ? ? ID NAME? ? ? ? ? ? ? ? old? ? ? ? ? ? ? ? ? NEW_DATE
?----------- -------------------- -------------------- -----------
? ? ? ? ? 1 A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 2 B? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 3 C? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 4 D? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 5 E? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 6 F? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
?
?6 rows selected
?
?SQL> select * from db.mxq03 partition(mxq_3);
?
? ? ? ? ? ID NAME? ? ? ? ? ? ? ? old? ? ? ? ? ? ? ? ? NEW_DATE
?----------- -------------------- -------------------- -----------
? ? ? ? ? 1 A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
? ? ? ? ? 2 B? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2015/5/28 1
?
?SQL> select * from db.mxq03 partition(mxq_6);
?
? ? ? ? ? ID NAME?