首页 > Linux操作系统 > Linux操作系统 > 在线重定义(普通表转换分区表)
测试过程:
SQL> CREATE TABLE b
2 (
3 id NUMBER NOT NULL PRIMARY KEY,
4 name varchar(20)
5 ) ;
Table created.
SQL> insert into b values(1,'g');
1 row created.
SQL> insert into b values(2,'g');
1 row created.
SQL> insert into b values(3,'x');
1 row created.
SQL> insert into b values(4,'x');
1 row created.
SQL> commit;
Commit complete.
SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE(user,'b');
PL/SQL procedure successfully completed.
SQL> create tablespace a1 datafile '/oradb/oradata/ggx/a1.dbf' size
50M;
create tablespace a2 datafile '/oradb/oradata/ggx/a2.dbf' size
50M;
Tablespace created.
SQL>
Tablespace created.
SQL>
SQL>
SQL> CREATE TABLE test
2 (
3 id
NUMBER NOT NULL PRIMARY KEY,
4 name varchar(20)
5 )
6
PARTITION BY LIST (name)
7 (
8 PARTITION text1 VALUES ('g')
TABLESPACE a1,
9 PARTITION text2 VALUES ('x') TABLESPACE a2
10
);
Table created.
SQL>
SQL> exec DBMS_REDEFINITION.START_REDEF_TABLE(USER,
'b','test');
PL/SQL procedure successfully completed.
SQL> exec dbms_redefinition.sync_interim_table(user,'b','test');
PL/SQL procedure successfully completed.
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;
TABLE_NAME PARTITION_NAME
TABLESPACE_NAME
------------------------------ ------------------------------
------------------------------
TEST
TEXT1 A1
TEST
TEXT2 A2
SQL> exec DBMS_REDEFINITION.FINISH_REDEF_TABLE(user, 'b','test');
PL/SQL procedure successfully completed.
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;
TABLE_NAME PARTITION_NAME
TABLESPACE_NAME
------------------------------ ------------------------------
------------------------------
B
TEXT1 A1
B
TEXT2 A2
SQL> select * from b partition(TEXT1);
ID NAME
---------- --------------------
1
g
2 g
SQL> select * from b partition(TEXT2);
ID NAME
---------- --------------------
3
x
4 x
分区表完成。
=================================================================
来解释一下:
--建议是否可以在线重定义
exec DBMS_REDEFINITION.CAN_REDEF_TABLE(user,'b');
--执行表的在线重定义
exec DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'b','test');
--自动将物化视图的记录更新到新表中
exec dbms_redefinition.sync_interim_table(user,'b','test');
-- 执行结束在线定义过程
exec DBMS_REDEFINITION.FINISH_REDEF_TABLE(user, 'b','test');
在执行 exec DBMS_REDEFINITION.START_REDEF_TABLE(USER,
'b','test');之后系统会将旧表的数据刷新到新表,同时生成一张物化视图。此后,对新表的更新都会记录在这个视图里,在执行exec
dbms_redefinition.sync_interim_table(user,'b','test');后会自动将物化视图的记录更新到新表中。
sync_interim_table的目的是为了缩短finish时锁定表的时间。在执行exec
DBMS_REDEFINITION.FINISH_REDEF_TABLE(user,
'b','test');之后,会自动删除这个物化视图。
如果中间过程出错要重新定义表的话,要放弃执行在线重定义exec
DBMS_REDEFINITION.abort_redef_table(user, 'b','test'),然后要手工删除物化视图和新表再重新定义。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25517773/viewspace-730323/,如需转载,请注明出处,否则将追究法律责任。