如何转换非分区表为分区表_DBMS_REDEFINITION在线重定义无缝切换

张开发
2026/4/16 12:05:59 15 分钟阅读

分享文章

如何转换非分区表为分区表_DBMS_REDEFINITION在线重定义无缝切换
ORA-14006报错主因是源表未通过CAN_REDEF_TABLE检查常见于含LONG/LOB未启用ROW MOVEMENT、函数索引、权限不足、MV LOG未失效或被FOR UPDATE锁定须先执行CAN_REDEF_TABLE验证。ORA-14006执行 DBMS_REDEFINITION.START_REDEFINITION 时报错“invalid partition name”这通常不是分区名写错了而是源表压根没被识别为“可重定义对象”——dbms_redefinition.can_redef_table 检查没过。常见原因有三源表含 LONG、LOB未启用 ENABLE ROW MOVEMENT、或函数索引非基于确定性函数用户无 EXECUTE 权限给 DBMS_REDEFINITION或对源表/目标表无 SELECT INSERT ALTER表上有未失效的物化视图日志MV LOG或正在被其他会话以 FOR UPDATE 锁住先跑一遍 CAN_REDEF_TABLE别跳过。它不报错才进下一步。如何构造正确的中间分区表结构含 PARTITION BY RANGE 和本地索引中间表不是随便建个带分区的表就行——字段顺序、数据类型、NOT NULL 约束、默认值必须和原表完全一致否则 START_REDEFINITION 会静默失败日志里只写“redefinition completed”但数据没同步。用 DBMS_METADATA.GET_DDL(TABLE, TBL_NAME) 拿原表 DDL删掉存储参数、表空间、注释保留字段定义在末尾加 PARTITION BY RANGE (create_time) (PARTITION p2023 VALUES LESS THAN (TO_DATE(2024-01-01,YYYY-MM-DD)), ...)所有索引重建时加 LOCAL全局索引不能直接搬过来得等重定义完成后再手工 CREATE INDEX ... GLOBAL特别注意DATE 分区键要用 TO_DATE 字面量别用 DATE2024-01-01——12c 及以前版本不认这种写法会报 ORA-14019。DBMS_REDEFINITION.SYNC_INTERIM_TABLE 调不调什么时候调如果原表写入压力小QPS FINISH_REDEFINITION 会自动做最后一次同步。但以下情况必须手动 SYNC原表每秒新增 200 行且重定义过程超过 10 分钟否则 FINISH 阶段锁表时间不可控业务能接受短暂双写比如凌晨维护窗口想把锁表时间压到秒级中间表已建好索引、约束但发现原表有大量未提交事务阻塞了同步建议策略先 START → 等中间表数据 copy 完 → 立即 SYNC_INTERIM_TABLE 一次 → 观察 DBA_REDEFINITION_STATUS 中 NUM_ROWS 是否趋近于 0 → 再 FINISH。这样锁表时间基本稳定在 1~3 秒。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

更多文章