本文主要介绍了使用在线重定义将普通表转为分区表的操作流程。
用户授权
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;