ITPub博客

首页 > 数据库 > Oracle > 在线重定义表实验记录(普通表在线重定义为分区表)

在线重定义表实验记录(普通表在线重定义为分区表)

原创 Oracle 作者:cnhtm 时间:2010-01-28 15:28:21 0 删除 编辑

从oracle 9i开始,oracle提供了在线重定义表的功能。
使用这个功能,可以在不停应用的情况下,修改表的定义,
如将普通表修改为分区表,将普通表修改为索引组织表等。
下面是将一个普通表修改为分区表的实验过程。

总体步骤:

1、创建普通表
2、向普通表中插入600条记录
3、创建中间表
4、用在线重定义功能完成普通表到分区表的转换

详细操作过程:

[@more@]

1、创建普通表

1.1、创建表

普通表的表名称为test,包含两个字段id integer,name varchar2(3)

sys@CNHTM> conn scott/tiger
Connected.
scott@CNHTM> create table test
2 (id integer,
3 name varchar2(3)
4 );

Table created.

1.2、为表创建索引

scott@CNHTM> alter table test add constraint pk_test primary key(id);

Table altered.

1.3、检查表的分区状态

scott@CNHTM> select table_name,partition_name
2 from user_tab_partitions
3 where table_name='TEST';

no rows selected

证明现在的表不是分区表

2、向表中插入600条数据

scott@CNHTM> declare
2 i number;
3 begin
4 for i in 1..600 loop
5 execute immediate 'insert into test(id,name) values (:1,:2)' using i,'aaa';
6 end loop;
7 end;
8 /

PL/SQL procedure successfully completed.

scott@CNHTM> commit;

Commit complete.

scott@CNHTM> select count(1) from test;

COUNT(1)
----------
600

3、创建中间表

3.1、创建中间表,中间表为分区表

scott@CNHTM> create table test_tmp
2 (id integer,
3 name varchar2(3)
4 )
5 partition by range(id)
6 (partition p200 values less than(201),
7 partition p400 values less than(401),
8 partition pmax values less than (maxvalue)
9 );

Table created.

3.2、为中间表创建索引

scott@CNHTM> alter table test_tmp
2 add constraint pk_test_tmp
3 primary key(id)
4 using index(
5 create index pk_test_tmp on test_tmp(id)
6 local
7 (partition p200,
8 partition p400,
9 partition pmax
10 )
11 )
12 /

Table altered.

3.3、查询中间表的分区状态

scott@CNHTM> select table_name,partition_name
2 from user_tab_partitions
3 where table_name='TEST_TMP';

TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
TEST_TMP P200
TEST_TMP P400
TEST_TMP PMAX

4、用在线重定义功能完成普通表到分区表的转换

4.1、开始重定义过程

scott@CNHTM> exec dbms_redefinition.start_redef_table(user,'test','test_tmp');

PL/SQL procedure successfully completed.

4.2、检查开始重定义后,创建的对象

scott@CNHTM> col object_name for a12
scott@CNHTM> select object_name,object_type,to_char(created,'yyyy-mm-dd hh24:mi:ss') cdate
2 from user_objects
3 order by cdate desc;

OBJECT_NAME OBJECT_TYPE CDATE
------------ ------------------- -------------------
RUPD$_TEST TABLE 2010-01-28 14:31:49
MLOG$_TEST TABLE 2010-01-28 14:31:49
......

发现多出了两个对象RUPD$_TEST和MLOG$_TEST,这名是使用物化视图(mv)的方式完成原始表与中间表的数据同步。
所以如果原表的数据流很大,可能需要一定的时间来完成物化视图的同步。

4.3、模拟业务操作,向普通表插入数据

向普通表插入1条数据,看完成重定义后,表的记录数是否正确

scott@CNHTM> insert into test(id,name)values(601,'bbb');

1 row created.

scott@CNHTM> commit;

Commit complete.

4.4、完成重定义过程

scott@CNHTM> exec dbms_redefinition.finish_redef_table(user,'test','test_tmp');

PL/SQL procedure successfully completed.

4.5、检查原表是否已经变成分区表

scott@CNHTM> select table_name,partition_name
2 from user_tab_partitions
3 where table_name='TEST';

TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
TEST P200
TEST P400
TEST PMAX

4.6、检查新插入的一条记录是否已存在于同步完成的表中

scott@CNHTM> select * from test where id=601;

ID NAM
---------- ---
601 bbb

4.7、删除中间表

scott@CNHTM> drop table test_tmp;

Table dropped.

--end--

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

请登录后发表评论 登录
全部评论

注册时间:2009-07-06

  • 博文量
    104
  • 访问量
    812114