从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/