Home  >  Article  >  Database  >  Oracle 11g在线重构表

Oracle 11g在线重构表

WBOY
WBOYOriginal
2016-06-07 15:54:581184browse

在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程

在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程, 在此期间应用程序对该表的操作将失败。除了这个,如果用exp,我们也不能保证exp的时候该表的数据没有改变(除非单用户), 而imp更是一个漫长的过程。 为了解决这个问题,Oracle9i在其DBMS_REDEFINITION软件包中引入了在线重定义功能。

 这个特性对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                old                  NEW_DATE
 ----------- -------------------- -------------------- -----------
          3 C                                        2015/5/28 1
          4 D                                        2015/5/28 1
          5 E                                        2015/5/28 1
          6 F                                        2015/5/28 1

本文永久更新链接地址

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn