通过在线重定义将普通标转成分区表

本文介绍如何使用Oracle DBMS_REDEFINITION包在线重定义表结构,并实现对表的分区操作。具体步骤包括验证表的重定义可行性、创建中间表、设置并行度、启动重定义过程等。

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

ORACLE在线对普通表进行分区步骤

    对于24X7的业务系统,需要更改表结构或者对表进行分区,可以使用oracle提供的DBMS_REDEFINITION包在线重定义来实现。同时DBMS_REDEFINITION包还可以完成以下工作:

修改table或者cluster的存储参数

移动table或者cluster到不同的表空间

增加、修改、删除table或者cluster的一列或列

增加或者删除分区(仅支持非cluster table)

改变分区结构

改变一个单表分区的物理属性,包括移动到同一个模式下不同的表空间

增加并行查询(parallel queries)的支持

重新创建table or cluster用来减少碎片

把堆表(heat table)变成索引组织表(IOT),或者做反向操作

转换一个关系表到一张表中的object column,或者做反向操作

转换object table到一张关系表或者表中的object column,或者做反向操作

在线重定义表有两种方式,通过key或者rowid。

 

通过key在线重定义表的步骤(scott用户下的EMP表为例,根据DEPTNO做list分区):

1, 查看原表的表结构,建表语句:

SQL>desc EMP;


SQL>select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) FROM DUAL;


    参数说明:1)对象类型,如TABLE,INDEX等;

        2)对象名称;

        3)对象所在schema;

 

2, 验证EMP是否可以在线重定义:

SQL>exec dbms_redefinition.can_redef_table('scott','emp',dbms_redefinition.cons_use_pk);

如有报错,根据错误信息具体修改。

参数说明:1)对象所在schema

      2)对象名称

      3)表示通过主键重定义,可省略,默认就是通过主键

 

3, 创建一个空的中间表EMP_TEMP,这个中间表就是期望重定义后的表结构:

SQL> CREATE TABLE EMP_TEMP

(EMPNO NUMBER(4,0) PRIMARY KEY,

 ENAME VARCHAR2(10),

 JOB VARCHAR2(9),

 MGR NUMBER(4,0),

 HIREDATE DATE,

 SAL NUMBER(7,2),

 COMM NUMBER(7,2),

 DEPTNO NUMBER(2,0))

 PARTITION BY LIST(DEPTNO)

   (PARTITION DEPT10 VALUES (10),

    PARTITION DEPT20 VALUES (20),

   PARTITION DEPT30 VALUES (30));

    注:不需要创建约束、索引等,只需要表定义即可,因为像约束、索引等这样的依赖对象会在后续步骤中自动创建和拷贝。

 

4, 对于数据量比较大的表,最好设置合理的并行度提高性能:

SQL>alter session force parallel dmp parallel 4;

SQL>alter session force parallel query parallel 4;

 

5, 执行START_REDEF_TABLE过程:

SQL>exec dbms_redefinition.start_redef_table('scott','emp','emp_temp',null);

    

这一存储过程把原表的数据拷贝至新表,并通过物化视图不断刷新,保持原表和中间表的实时同步。

    如果在重定义表的过程中报错,可以执行ABORT_REDEF_TABLE过程终止。 

SYS>exec DBMS_REDEFINITION.ABORT_REDEF_TABLE(SCOTT,EMP,EMP_TEMP); 

 

6, 复制依赖对象(索引,触发器等):

SQL> DECLARE

num_errors PLS_INTEGER;

BEGIN

DBMS_REDEFINITION.copy_table_dependents('SCOTT','EMP','EMP_TEMP',

DBMS_REDEFINITION.cons_orig_params,TRUE,TRUE,TRUE,TRUE,num_errors);

END;

上面我们把ignore_errors设为true,表示即使中间有错误发生,存储过程不会退出,会一直运行直到结束,这时你一定要记得在下一步中查看是否有错误。

 

7, 从视图DBA_REDEFINITION_ERRORS查询上一步的错误信息:

 

8, 执行SYNC_INTERIM_TABLE过程同步数据(可选):

SQL> exec  DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT', 'EMP', 'EMP_TEMP');

 

9, 执行FINISH_REDEF_TABLE过程完成重定义表:

SQL> exec DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT', 'EMP', 'EMP_TEMP');

 

 

10, 删除中间表:

SQL>DROP TABLE SCOTT.EMP_TEMP CASCADE CONSTRAINTS;

11, 检查重定义后表的各项信息:

SQL>select empno,ename,deptno from scott.emp partition (dept30);  

 

SQL>select owner,constraint_name,constraint_type,table_name from dba_constraints where owner='SCOTT' and table_name='EMP' 

注:原来的主键是PK_EMP,重定义完成后主键由系统自动生成一个名字,此时可以修改主键的名字为原来名字。

SQL>alter table scott.emp rename constraint SYS_C0010797 to PK_EMP;

 

SQL> select table_name,partition_name from user_tab_partitions where table_name='EMP';

 

 

 

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

转载于:http://blog.itpub.net/29098758/viewspace-2139432/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值