Oracle 11g 在线重定义 之 普通表转分区表

本文主要介绍了使用在线重定义将普通表转为分区表的操作流程。

用户授权

GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE,
DROP ANY TABLE, LOCK ANY TABLE  ,SELECT ANY TABLE,
CREATE ANY INDEX,CREATE ANY TRIGGER
TO WRP_PSS;
GRANT EXECUTE_CATALOG_ROLE TO USERNAME;

确认表是否可以做在线重定义

源表有主键:

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('USERNAME', 'TABLENAME');

源表无主键:

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('USERNAME', 'TABLENAME', dbms_redefinition.cons_use_rowid);

根据源表DDL语句,创建中间表

create table tablename_TMP
(

)
partition by range(TRANSTIME)
(

)
tablespace tablespacename
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

开始在线重定义

源表有主键:

BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('USERNAME', 'TABLENAME', 'TABLENAME_TMP');
END;
/

源表无主键:

BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('USERNAME', 'TABLENAME', 'TABLENAME_TMP', null, dbms_redefinition.cons_use_rowid);
END;
/

把原始表的触发器、权限、统计信息、物化视图在中间表上创建一份

DECLARE
num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('USERNAME', 'TABLENAME','TABLENAME_TMP',
   0, TRUE, FALSE, TRUE, FALSE, num_errors, FALSE, TRUE);
END;
/

根据源表DDL语句手工创建索引

create index IDX_NAME_TMP on tablename_TMP (#字段名)
  tablespace USERS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

同步在线差异数据

EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('USERNAME', 'TABLENAME', 'TABLENAME_TMP');

完成在线重定义

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('USERNAME', 'TABLENAME', 'TABLENAME_TMP');

重建索引(全局-->本地)

create index indexname on tablename local;

Related Posts