oracle 11g 将非分区表转换为分区表在线重定义

Posted Alex Zeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 11g 将非分区表转换为分区表在线重定义相关的知识,希望对你有一定的参考价值。

--操作的用户需要有以下的权限
GRANT CONNECT, RESOURCE TO CMIGDW;
GRANT EXECUTE ON DBMS_REDEFINITION TO CMIGDW;
GRANT ALTER ANY TABLE TO CMIGDW;
GRANT DROP ANY TABLE TO CMIGDW;
GRANT LOCK ANY TABLE TO CMIGDW;
GRANT CREATE ANY TABLE TO CMIGDW;
GRANT SELECT ANY TABLE TO CMIGDW;
GRANT CREATE ANY TRIGGER TO CMIGDW;
GRANT CREATE ANY INDEX TO CMIGDW;

--需要分区的表
select * from CMIGDW.TEST_DATE_DIM;

--表结构
create table TEST_DATE_DIM
(
  date_id   NUMBER,
  year_     NUMBER,
  half_year VARCHAR2(20),
  season_id VARCHAR2(20),
  season    VARCHAR2(20),
  month_    NUMBER,
  week      NUMBER
);

--创建一个与TEST_DATE_DIM 表字段相同,但是分区的表
create table TEST_DATE_DIM2
(
  date_id   NUMBER,
  year_     NUMBER,
  half_year VARCHAR2(20),
  season_id VARCHAR2(20),
  season    VARCHAR2(20),
  month_    NUMBER,
  week      NUMBER
) 
PARTITION BY list (month_)
(
    PARTITION P1 values (201501),
    PARTITION P2 values (201502),
    PARTITION P3 values (default)
);

--开始在线重定义
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
Connected as CMIGDW@CMIG_TEST

SQL> EXEC dbms_redefinition.start_redef_table(CMIGDW, TEST_DATE_DIM, TEST_DATE_DIM2);
begin dbms_redefinition.start_redef_table(CMIGDW, TEST_DATE_DIM, TEST_DATE_DIM2); end;
ORA-12089: 不能联机重新定义无主键的表 "CMIGDW"."TEST_DATE_DIM"
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 56
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1490
ORA-06512: 在 line 1
需要有主键
--开始执行在线重定义 SQL> EXEC dbms_redefinition.start_redef_table(CMIGDW, TEST_DATE_DIM, TEST_DATE_DIM2); PL/SQL procedure successfully completed SQL> SQL> DECLARE 2 error_count pls_integer := 0; 3 BEGIN 4 dbms_redefinition.copy_table_dependents(CMIGDW, TEST_DATE_DIM, TEST_DATE_DIM2, 5 0, true, false, true, false, 6 error_count); 7 8 dbms_output.put_line(errors := || to_char(error_count)); 9 END; 10 / PL/SQL procedure successfully completed --结束在线重定义 SQL> EXEC dbms_redefinition.finish_redef_table(CMIGDW, TEST_DATE_DIM, TEST_DATE_DIM2); PL/SQL procedure successfully completed SQL> select * from TEST_DATE_DIM PARTITION (p1); SQL> select * from TEST_DATE_DIM2; -- 删除中间表 DROP TABLE TEST_DATE_DIM2;

 

以上是关于oracle 11g 将非分区表转换为分区表在线重定义的主要内容,如果未能解决你的问题,请参考以下文章

转换为分区表时的初始扩展区大小

Oracle 12.2新特性----在线把非分区表转为分区表

Oracle在线重定义(online redefinition)--将普通表改为分区表

Oracle已有数据表建立表分区—在线重定义

oracle普通表转分区表(在线重定义方式)

oracle 11g分区表最多支持多少分区