Oracle database 11g 重定义表

Oracle11g 的联机重定义功能

联机条件下把普通的堆表转换成分区表(11g新特性)

例:联机创建分区表:将emp表联机重定义、要求完成两个任务、使其按照 sal分区(以2500为界)、并去掉comm列、这个过程需要建立一个临时分区表emp_temp完成复制转换、

sys下执行

create table scott.emp as select * from scott.emp;

alter table scott.emp add constraint pk_emp primary key(empno);

1) 检查原始表是否具有在线重定义资格、(要求表自包含及之前没有建立实体化视图及日志)

SQL>BEGIN
      DBMS_REDEFINITION.CAN_REDEF_TABLE('scott','emp');
    END;
    /

2) 创建一个临时分区表:emp_temp, 含有7列(删去comm列)、然后range分区、两个区以sal=2500为界、

SQL>
CREATE TABLE scott.emp_temp
  (empno        number(4) not null,
   ename        varchar2(10),
   job          varchar2(9),
   mgr          number(4),
   hiredate     date,
   sal          number(7,2),
   deptno       number(2))
PARTITION BY RANGE(sal)
   (PARTITION sal_low VALUES LESS THAN(2500),
   PARTITION sal_high VALUES LESS THAN (maxvalue));

3)启动联机重定义处理过程、

SQL>
BEGIN
  dbms_redefinition.start_redef_table('scott','emp','emp_temp',
   'empno empno,
   ename ename,
   job job,
   mgr mgr,
   hiredate hiredate,
   sal sal,
   deptno deptno');
END;
/
SQL> select count(*) from scott.emp_temp;

  COUNT(*)
----------
        14
SQL> select * from scott.emp_temp partition(sal_low);

     EMPNO ENAME      JOB              MGR  HIREDATE                        SAL     DEPTNO
---------- ---------- --------- ---------- ------ -------------   ----------------  -------                     
      7369 SMITH      CLERK                7902 1980-12-17 00:00:00        800         20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        30
      7521 WARD      SALESMAN        7698 1981-02-22 00:00:00       1250        30
      7654 MARTIN   SALESMAN        7698 1981-09-28 00:00:00       1250        30
      7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450        10
      7844 TURNER   SALESMAN        7698 1981-09-08 00:00:00       1500        30
      7876 ADAMS    CLERK                7788 1987-05-23 00:00:00       1100        20
      7900 JAMES      CLERK                7698 1981-12-03 00:00:00        950         30
      7934 MILLER     CLERK                7782 1982-01-23 00:00:00       1300        10

已选择9行。

SQL> select * from scott.emp_temp partition(sal_high);

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ----------
      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975         20
      7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850         30
      7788 SCOTT      ANALYST           7566 1987-04-19 00:00:00       3000         20
      7839 KING        PRESIDENT                 1981-11-17 00:00:00       5000         10
      7902 FORD       ANALYST           7566 1981-12-03 00:00:00       3000         20

已选择5行。

这个时候emp_temp的主键、索引、触发器、授权等还没有从原始表继承过来、

SQL> select constraint_name,constraint_type,table_name from user_constraints where table_name like 'emp%';

CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME
------------------------------ --------------- ------------------------------
PK_emp                          P                emp
SYS_C009652                    C               emp_TEMP

4) 复制依赖对象、

这一步的作用是:临时分区表emp_temp继承原始表emp的全部属性、包括索引、约束和授权以及触发器、

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

SQL> select constraint_name,constraint_type,table_name from user_constraints where table_name like 'emp%';

CONSTRAINT_NAME                CONSTRAINT_TYPE      TABLE_NAME
--------------------------- --------------- ----------------------
PK_emp                            P                 emp
SYS_C009652                       C                 emp_TEMP
TMP$$_PK_emp0                     P                   emp_TEMP

这时候原始表emp还没有分区,

SQL> select table_name,partition_name,high_value from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ----------------------
emp_TEMP                      SAL_HIGH                                MAXVALUE
emp_TEMP                      SAL_LOW                                 2500

5) 完成重定义过程。(相当于原始表emp与临时分区表emp_temp互换名称。)

SQL> EXECUTE dbms_redefinition.finish_redef_table('scott','emp','emp_temp');

SQL> select table_name,partition_name,high_value from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ ---------------------------
emp                           SAL_HIGH                       MAXVALUE
emp                           SAL_LOW                        2500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为什么不问问神奇的海螺呢丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值