ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10g在线重定义新特性——对单独的分区进行在线重定义

10g在线重定义新特性——对单独的分区进行在线重定义

原创 Linux操作系统 作者:yangtingkun 时间:2009-06-28 22:42:02 0 删除 编辑

10g的在线重定义还增加了对单独一个分区执行在线重定义的功能。

 

 

由于分区的逻辑结构和表一致,因此对分区单独执行在线重定义的时候,是不能修改逻辑结构的,因此对分区单独执行在线重定义,只是进行物理结构的改变。所以分区在线重定义的主要意义在于不妨碍用户对表进行操作的情况下,改变分区的物理属性。

看一个简单的例子:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> CREATE TABLE T
  2  PARTITION BY RANGE (CREATED)
  3  (
  4  PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1-1', 'YYYY-MM-DD')),
  5  PARTITION P2 VALUES LESS THAN (TO_DATE('2010-1-1', 'YYYY-MM-DD')),
  6  PARTITION P3 VALUES LESS THAN (MAXVALUE)
  7  )
  8  AS SELECT ROWNUM ID, A.*
  9  FROM USER_OBJECTS A;

表已创建。

SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

表已更改。

SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME) LOCAL;

索引已创建。

SQL> CREATE TABLE T_INTER
  2  TABLESPACE TEST
  3  AS SELECT ROWNUM ID, A.*
  4  FROM USER_OBJECTS A
  5  WHERE 1 = 2;

表已创建。

SQL> CREATE INDEX IND_T_INTER_NAME ON T_INTER (OBJECT_NAME);

索引已创建。

SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T                              P1                             YANGTK
T                              P2                             YANGTK
T                              P3                             YANGTK

SQL> SELECT TABLE_NAME, TABLESPACE_NAME
  2  FROM USER_TABLES
  3  WHERE TABLE_NAME = 'T_INTER';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T_INTER                        TEST

除了LOCAL索引对应的索引需要在目标表上创建,其他关联对象都不需要创建:

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')

PL/SQL 过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER', PART_NAME => 'P1')

PL/SQL 过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER', PART_NAME => 'P1')

PL/SQL 过程已成功完成。

SQL> SELECT TABLE_NAME, PARTITION_NAME, TABLESPACE_NAME
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T                              P1                             TEST
T                              P2                             YANGTK
T                              P3                             YANGTK

SQL> SELECT TABLE_NAME, TABLESPACE_NAME
  2  FROM USER_TABLES
  3  WHERE TABLE_NAME = 'T_INTER';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T_INTER                        YANGTK

此时分区的在线重定义已经完成,不过对于GLOBAL INDEXOracle将其置为INVALID,需要手工重建:

SQL> SELECT INDEX_NAME, STATUS
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     STATUS
------------------------------ --------
PK_T                           UNUSABLE
IND_T_NAME                     N/A

SQL> SELECT INDEX_NAME, PARTITION_NAME, STATUS
  2  FROM USER_IND_PARTITIONS
  3  WHERE INDEX_NAME = 'IND_T_NAME';

INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------ ------------------------------ --------
IND_T_NAME                     P1                             USABLE
IND_T_NAME                     P2                             USABLE
IND_T_NAME                     P3                             USABLE

SQL> ALTER INDEX PK_T REBUILD;

索引已更改。

SQL> SELECT INDEX_NAME, STATUS
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     STATUS
------------------------------ --------
PK_T                           VALID
IND_T_NAME                     N/A

SQL> DROP TABLE T_INTER PURGE;

表已删除。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-607771/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10407391