ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在线重定义(普通表转换分区表)

在线重定义(普通表转换分区表)

原创 Linux操作系统 作者:gaiguoxiang 时间:2012-05-20 13:48:23 0 删除 编辑

测试过程:

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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 分区表
下一篇: 数据文件丢失
请登录后发表评论 登录
全部评论

注册时间:2011-06-22

  • 博文量
    41
  • 访问量
    106082