以下是针对普通表(现有表中已存在千万级数据)转分区表做的一个测试样例,测试是通过的,不过自我感觉心里还是没底,因为测试环境数据量远小于生产环境,生产环境数据量将近亿级。具体疑问已标注在相应地方,此外操作步骤是否合理、是否有遗漏还请各大神不吝指教!--1.首先对要在线重定义的表自行验证,看该表是否可以重定义,如果不可以则会提示错误信息。
execute dbms_redefinition.can_redef_table('auditdev','TEST_BAK');--2.建个和源表表结构一样的分区表,作为中间表。
create table TEST_TEMP
(
    ACCT_NO            VARCHAR2(32) not null,
  SEQ_NO             INTEGER not null,
  TRN_DATE           DATE,
...
)
tablespace FTS_DT
PARTITION BY RANGe(TRN_DATE)
(
partition p_201304 values less than(to_date('2013-05-01','yyyy-mm-dd')),
partition p_201305 values less than(to_date('2013-06-01','yyyy-mm-dd')),
partition p_201306 values less than(to_date('2013-07-01','yyyy-mm-dd')),
partition p_201307 values less than(to_date('2013-08-01','yyyy-mm-dd')),
partition p_201308 values less than(to_date('2013-09-01','yyyy-mm-dd')),
partition p_201309 values less than(to_date('2013-10-01','yyyy-mm-dd')),
partition p_201310 values less than(to_date('2013-11-01','yyyy-mm-dd')),
partition p_max values less than(maxvalue)
);--3.重定义
execute dbms_redefinition.start_redef_table('auditdev','TEST_BAK','TEST_TEMP');--4.同步原表与中间表的数据
execute dbms_redefinition.sync_interim_table('auditdev','TEST_BAK','TEST_TEMP');--5.创建索引,在线重定义只重定义数据,索引还需要单独建立。
ALTER TABLE TEST_TEMP ADD CONSTRAINT PK_TEST_TEMP PRIMARY KEY(ACCT_NO, SEQ_NO) using index global tablespace BTS_DT_IDX;
--给表建主键的时候系统会建一个同名的索引,如上述语句建的主键索引是不是全局索引,该索引名字在user_part_indexes中查不到???

CREATE INDEX IDX_TEST_TEMP ON TEST_TEMP(TRN_DATE) LOCAL tablespace BTS_DT_IDX;

--6.收集新表的统计信息(该步骤是否需要,有何意义?)
exec dbms_stats.gather_table_stats('auditdev', 'TEST_TEMP', cascade => true);--7.执行结束在线定义过程
execute dbms_redefinition.finish_redef_table('auditdev','TEST_BAK','TEST_TEMP');--8.核对原表与临时表的记录数是否相等,检查是否存在记录丢失
SELECT 'TEST_BAK',COUNT(1) FROM TEST_BAK UNION ALL
SELECT 'TEST_TEMP',COUNT(1) FROM TEST_TEMP;

--9.删除临时表
--DROP TABLE TEST_TEMP;

--10.重命名索引
ALTER INDEX TEST_TEMP RENAME TO PK_TEST_BAK;
ALTER INDEX IDX_TEST_TEMP TO IDX_TEST_BAK;
ALTER TABLE TEST_BAK RENAME CONSTRAINT TEST_TEMP TO PK_TEST_BAK;

--11.添加表和字段备注重定义分区索引dbms_redefinitiongloballocal