普通表转为分区表(一)-在线重定义

1. 创建示例表和索引
sql> conn scott/tiger;


sql> create table base (id number(10) primary key,name varchar2(30));


sql> insert into base select object_id, owner from dba_objects;


sql> create index name_ind on base(name);

 
2. 收集表的统计信息
sql> exec dbms_stats.gather_table_stats('scott', 'base', cascade => true);

 
3. 创建临时分区表
sql> create table  ttvv (id number primary key, name varchar2(30)) partition by range (id)
  (partition p1 values less than (10000),
  partition p2 values less than (30000),
  partition p3 values less than (50000),
  partition p4 values less than (maxvalue));


 
4. 进行重定义操作
 
4.1 检查重定义的合理性
sql> exec dbms_redefinition.can_redef_table('scott', 'base');
PL/SQL procedure successfully completed.(dbms包scott用户没有权限,可以用dba,下面同)


4.2 如果4.1 没有问题,开始重定义,这个过程可能要等一会。
 
这里要注意:如果分区表和原表列名相同,可以用如下方式进行:
SQL> BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => 'SCOTT', 
orig_table => 'base',
int_table => 'ttvv');
END;
/
       如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(
'SCOTT',
'base',
'ttvv',
'ID ID, name TIME', -- 在这里指定新的映射关系
DBMS_REDEFINITION.CONS_USE_PK);
 
这一步操作结束后,数据就已经同步到这个临时的分区表里来了。
 
4.3 同步新表,这是可选的操作
SQL> BEGIN
   dbms_redefinition.sync_interim_table(
   uname => 'SCOTT',
   orig_table => 'base',
   int_table => 'ttvv');
   END;
   /


 
4.4 创建索引,在线重定义只重定义数据,索引还需要单独建立。
sql> create index name_ind2 on ttvv(name);


 
4.5 收集新表的统计信息
sql> exec dbms_stats.gather_table_stats('scott', 'ttvv', cascade => true);


 
4.6 结束重定义
SQL> BEGIN
   dbms_redefinition.finish_redef_table(
   uname => 'SCOTT',
   orig_table => 'base',
   int_table => 'ttvv');
   END;
   /


 
结束重定义的意义:
       基表base 和临时分区表ttvv 进行了交换。 此时临时分区表ttvv成了普通表,我们的基表base成了分区表。
 
       我们在重定义的时候,基表base是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。
 
5. 删除临时表
SQL> DROP TABLE ttvv;

 
6. 索引重命名
SQL> ALTER INDEX name_ind2 RENAME TO name_ind;

 
7. 验证
sql> select partitioned from user_tables where table_name = 'UNPAR_TABLE';
par
---
yes
sql> select partition_name from user_tab_partitions where table_name = 'BASE';
partition_name
------------------------------
p1
p2
p3
p4
select partition_name from user_tab_partitions where table_name = 'TTVV';


no rows selected



关于在线重定义

使用在线重定义:DBMS_REDEFINITION
 在线重定义能保证数据的一致性,在大部分时间内,表都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。
 
关于DBMS_REDEFINITION的介绍,参考官方连接:
      http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_redefi.htm#CBBFDJBC
 
关于用在线重定义创建分区表,参考:
       How To Partition Existing Table Using DBMS_Redefinition [ID 472449.1]
       http://blog.csdn.net/tianlesoftware/archive/2011/03/02/6218693.aspx
 
这个功能只在9.2.0.4以后的版本才有,在线重定义表具有以下功能:
       (1)修改表的存储参数;
       (2)将表转移到其他表空间;
       (3)增加并行查询选项;
       (4)增加或删除分区;
       (5)重建表以减少碎片;
       (6)将堆表改为索引组织表或相反的操作;
       (7)增加或删除一个列。
 
 使用在线重定义的一些限制条件:
(1) There must be enough space to hold two copies of the table.
(2) Primary key columns cannot be modified.
(3) Tables must have primary keys.
(4) Redefinition must be done within the same schema.
(5) New columns added cannot be made NOT NULL until after the redefinition operation.
(6) Tables cannot contain LONGs, BFILEs or User Defined Types.
(7) Clustered tables cannot be redefined.
(8) Tables in the SYS or SYSTEM schema cannot be redefined.
(9) Tables with materialized view logs or materialized views defined on them cannot be redefined.
(10) Horizontal sub setting of data cannot be performed during the redefinition.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值