发表于: 2009.06.28 22:41
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/486617
---------------------------------------------------------------
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 INDEX,Oracle将其置为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;
表已删除。











