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

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;

表已删除。

yangtingkun 发表于:2009.06.28 22:41 ::分类: ( ORACLE ) ::阅读:(272次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...