mysql表重构,Oracle 11g在线重构表

在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

本文永久更新链接地址:

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值