Oracle 11g不支持直接ALTER TABLE ... PARTITION BY,必须通过CTAS重建、DBMS_REDEFINITION在线重定义或EXPDP/IMPDP导出导入实现;其中在线重定义可零停机但门槛高,CTAS速度快但有数据一致性风险,EXPDP/IMPDP则为大表最稳的折中方案。
oracle 11g 不支持直接 alter table ... partition by,必须通过重建或重定义实现。ctas 适合可接受短时中断的场景;在线重定义(dbms_redefinition)是唯一真正“不停机”的方案,但门槛高、易卡在验证环节。
CTAS 重建法:快但有数据一致性风险
本质是用 CREATE TABLE ... AS SELECT 创建新分区表,再切换表名。它不锁原表读取,但写入会丢失——两个 RENAME 操作之间存在窗口期,新插入/更新的数据不会进入新表。
- 必须提前建好目标分区结构,例如:
PARTITION BY RANGE(time_fee) INTERVAL(NUMTOYMINTERVAL(1,'MONTH')),且首分区不能省略(如PARTITION p1 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD'))) - 加
NOLOGGING PARALLEL(DEGREE 4)能显著提速,但要求表空间为非归档模式或已启用强制日志记录(FORCE LOGGING) - 切换前需停写应用,或用触发器/应用层双写兜底;否则
RENAME后查不到刚插入的记录 - 索引、约束、触发器全部要手动重建,
COPY_TABLE_DEPENDENTS不适用
DBMS_REDEFINITION 在线重定义:零停机但条件苛刻
它靠双表同步完成切换,最后 FINISH_REDEF_TABLE 是原子操作。但第一步 CAN_REDEF_TABLE 就可能失败,且错误信息模糊(比如 ORA-12089 只说“无主键”,不提虚拟列或 LONG 字段问题)。
- 原表必须有主键或唯一约束,且目标分区键必须是原表已有物理列(不能是未物化的虚拟列)
- 禁止含
LONG、BFILE、嵌套表、对象类型字段;否则START_REDEF_TABLE会静默失败或后续同步中断 - 中间表(interim table)必须手动创建,且结构、约束、分区定义完全匹配预期,
COPY_TABLE_DEPENDENTS的copy_indexes参数建议设为0,索引单独建更可控 - 执行用户需显式授予
EXECUTE_CATALOG_ROLE和ALTER ANY TABLE等权限,仅DBA角色不够
EXPDP/IMPDP 导出导入法:大表最稳的折中选择
当 CTAS 怕不一致、在线重定义过不了 CAN_REDEF_TABLE 时,这是 Oracle 11g 下最可靠路径。它逻辑导出+物理重建,中断时间取决于数据量,但通常控制在分钟级。
- 导出用
CONTENT=DATA_ONLY EXCLUDE=INDEX,CONSTRAINT,TRIGGER PARALLEL=4 COMPRESSION=ALL,避免冗余 DDL 和 IO 压力 - 导入前必须先手工建好目标分区表,
TABLE_EXISTS_ACTION=APPEND才能向已存在分区表追加数据;若误用REPLACE,会删掉整个分区结构 -
REMAP_TABLE和REMAP_SCHEMA要写全限定名,如REMAP_TABLE=SCOTT.EMP:SCOTT.EMP_PART - 所有目录对象(
DIRECTORY)必须是数据库内已创建的目录对象(如DATA_PUMP_DIR),不能填本地路径
分区键设计本身比迁移手段更重要:用日期字段却选 LIST 分区,后续每月都要 ALTER TABLE ADD PARTITION;用高基数字段做 RANGE 分区,会导致严重数据倾斜。这些在迁移前就该定案,而不是等 FINISH_REDEF_TABLE 成功后再发现查询变慢十倍。


















