码迷,mamicode.com
首页 > 数据库 > 详细

Oracle-在线重定义操作文档

时间:2015-10-08 18:20:53      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

Oracle-在线重定义操作文档

2015年10月8日

15:51

在线重定义的大致操作流程如下:

(1)创建基础表A,如果存在,就不需要操作。

(2)创建临时的分区表B。

(3)开始重定义,将基表A的数据导入临时分区表B。

(4)结束重定义,此时在DB的 Name Directory里,已经将2个表进行了交换。即此时基表A成了分区表,我们创建的临时分区表B 成了普通表。 此时我们可以删除我们创建的临时表B。它已经是普通表。

 

下面看一个示例:

 

1. 创建基本表和索引

SQL> create table unpar_table (id number(10) primary key,create_date date); 

 

Table created.

 

SQL>  insert into unpar_table select rownum, created from dba_objects;

 

72491 rows created.

 

SQL> create index create_date_ind on unpar_table(create_date);

 

Index created.

 

SQL> commit;

 

Commit complete.

 

2. 收集表的统计信息

SQL> exec dbms_stats.gather_table_stats(ownname=>‘dev‘,tabname=>‘unpar_table‘, cascade => true);

 

PL/SQL procedure successfully completed.

 

3. 创建临时分区表

SQL> create table par_table (id number primary key, time date) partition by range (time) (partition p1 values less than (to_date(‘2004-7-1‘, ‘yyyy-mm-dd‘)),partition p2 values less than (to_date(‘2005-1-1‘, ‘yyyy-mm-dd‘)),partition p3 values less than (to_date(‘2005-7-1‘, ‘yyyy-mm-dd‘)),partition p4 values less than (maxvalue));

 

Table created.

 

4. 进行重定义操作

4.1 检查重定义的合理性

SQL> exec dbms_redefinition.can_redef_table(uname=>‘dev‘,tname=>‘unpar_table‘);

 

PL/SQL procedure successfully completed.

 

4.2 如果4.1 没有问题,开始重定义,这个过程可能要等一会。

这里要注意:如果分区表和原表列名相同,可以用如下方式进行:

SQL>  BEGIN

    DBMS_REDEFINITION.start_redef_table(

    uname => ‘dev‘,

    orig_table => ‘unpar_table‘,

    int_table => ‘par_table‘);

    end;

    /

 BEGIN

*

ERROR at line 1:

ORA-42016: shape of interim table does not match specified column mapping

ORA-06512: at "SYS.DBMS_REDEFINITION", line 52

ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646

ORA-06512: at line 2

 

 

如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘dev‘,‘unpar_table‘,‘par_table‘,‘ID  ID, create_date  TIME‘,DBMS_REDEFINITION.CONS_USE_PK);

 

PL/SQL procedure successfully completed.

 

这一步操作结束后,数据就已经同步到这个临时的分区表里来了。

 

4.3 同步新表,这是可选的操作

SQL> begin

    dbms_redefinition.sync_interim_table(

    uname => ‘DEV‘,

    orig_table => ‘unpar_table‘,

    int_table => ‘par_table‘);

    end;

    /

 

PL/SQL procedure successfully completed.

 

 

4.4 创建索引,在线重定义只重定义数据,索引还需要单独建立。

SQL>  create index create_date_ind2 on par_table(time);

 

Index created.

 

4.5 收集新表的统计信息

SQL> exec dbms_stats.gather_table_stats(ownname=>‘dev‘,tabname=>‘par_table‘, cascade => true);

 

PL/SQL procedure successfully completed.

 

4.6 结束重定义

SQL> begin

    dbms_redefinition.finish_redef_table(

    uname => ‘dev‘,

    orig_table => ‘unpar_table‘,

    int_table => ‘par_table‘);

    end;

    /

 

PL/SQL procedure successfully completed.   

 

结束重定义的意义:

基表unpar_table 和临时分区表par_table 进行了交换。 此时临时分区表par_table成了普通表,我们的基表unpar_table成了分区表。

我们在重定义的时候,基表unpar_table是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。

 

5. 删除临时表

SQL> DROP TABLE par_table;

表已删除。

6. 索引重命名

SQL> ALTER INDEX create_date_ind2 RENAME TO create_date_ind;

索引已更改。

 

7. 验证

SQL>  select partitioned from user_tables where table_name = ‘UNPAR_TABLE‘;

 

PAR

---

YES

 

SQL>  select partition_name from user_tab_partitions where table_name = ‘UNPAR_TABLE‘;

 

PARTITION_NAME

------------------------------

P1

P2

P3

P4

 

SQL>  select count(*) from unpar_table;

 

  COUNT(*)

----------

     72500

 

SQL> select count(*) from unpar_table partition (p4);

 

  COUNT(*)

----------

     72500

 

SQL> select count(*) from par_table;

 

  COUNT(*)

----------

     72500

 

SQL> select count(*) from unpar_table partition (p1);

 

  COUNT(*)

----------

         0

 

SQL> select count(*) from unpar_table partition (p2);

 

  COUNT(*)

----------

         0

 

已使用 Microsoft OneNote 2010 创建
一个用于存放所有笔记和信息的位置

Oracle-在线重定义操作文档

标签:

原文地址:http://www.cnblogs.com/iyoume2008/p/4861577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!