首页 > 数据库 > Oracle > 普通表转分区表-在线重定义
原表非分区表:T_EC_EVENT_CONTENT
创建中间表:INIT_T_EC_EVENT_CONTENT
创建中间分区表
create table INIT_T_EC_EVENT_CONTENT
(
EVENTID VARCHAR2(50),
JHDATE DATE not null,
FWQBH VARCHAR2(8),
SENDER VARCHAR2(50),
RECEIVER VARCHAR2(50),
NODEID VARCHAR2(8),
ACTIONTYPE VARCHAR2(100),
EVENTSIZE NUMBER(30),
EVENTTYPE VARCHAR2(2),
MEMO VARCHAR2(2000),
MESSAGEID VARCHAR2(50),
EVENTCONTENT CLOB,
CLIENTIP VARCHAR2(50),
CLIENTOS VARCHAR2(50),
MBFWQBH VARCHAR2(8),
ID VARCHAR2(50) not null,
KSSJ TIMESTAMP(6),
JSSJ TIMESTAMP(6)
)partition by range (JHDATE)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION MT1 VALUES LESS THAN (TO_DATE('2020-01-01 00:00:00','YYYY-MM-DD hh24:mi:ss'))
storage
(
initial 8M
next 100M
minextents 1
maxextents unlimited
)
)storage
(
initial 8M
next 100M
minextents 1
maxextents unlimited
);
--验证是否可以进行在线重定义,验证原表是否有主键
exec dbms_redefinition.can_redef_table('test', 'T_EC_EVENT_CONTENT');======所有操作之前要先验证
--开始重定义,把原表数据复制到中间表数据
exec dbms_redefinition.start_redef_table('test', 'T_EC_EVENT_CONTENT', 'INIT_T_EC_EVENT_CONTENT');
--迁移权限对象
SQL> declare
num_errors PLS_INTEGER;
begin
dbms_redefinition.copy_table_dependents('TEST', 'T_EC_EVENT_CONTENT', 'INIT_T_EC_EVENT_CONTENT',
dbms_redefinition.cons_orig_params, TRUE, TRUE, TRUE, TRUE, num_errors);
end;
/
PL/SQL procedure successfully completed
--同步临时表与原始表中的数据,差异数据同步
exec dbms_redefinition.sync_interim_table('test', 'T_EC_EVENT_CONTENT', 'INIT_T_EC_EVENT_CONTENT');
--结束重定义,自动把两张表互换名称
exec dbms_redefinition.finish_redef_table('test', 'T_EC_EVENT_CONTENT', 'INIT_T_EC_EVENT_CONTENT');
--取消重定义
exec dbms_redefinition.abort_redef_table('test', 'T_EC_EVENT_CONTENT', 'INIT_T_EC_EVENT_CONTENT');
--查询是否有错
select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22967847/viewspace-3056959/ ,如需转载,请注明出处,否则将追究法律责任。