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

本文介绍如何使用Oracle的在线重定义表功能将普通表转换为分区表,包括创建普通表、插入数据、创建中间分区表及完成重定义的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从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博客 ” ,链接:http://blog.itpub.net/22049049/viewspace-1030959/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22049049/viewspace-1030959/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值