在线重定义实现 Oracle 表分区实践

来源:这里教程网 时间:2026-03-03 23:05:40 作者:

在生产系统中,随着业务数据量不断累积,单表数据规模持续扩大,逐渐出现查询性能下降、维护难度增加、统计信息采集缓慢等问题。通过引入分区表结构,可以在逻辑上对数据进行拆分,有效提升 Oracle 在大数据量场景下的查询效率和可维护性。

但在生产环境中直接将普通表改为分区表,通常意味着停机调整,这在核心业务系统上基本不可接受。Oracle 提供的 DBMS_REDEFINITION 包支持在线重定义功能,可以在业务连续运行的前提下完成结构转换,是生产系统进行表分区改造的理想方案。本文基于一次真实生产操作记录,完整整理了通过在线重定义方式实现普通表到分区表改造的全过程。 

一、实施目标

本次实施目标是将业务表 CWSF3.CW_MZSFMX 改造成按日期字段 SFSJ 进行范围分区的分区表结构,改善历史数据检索效率并为后期归档提供条件支持。

二、操作步骤

步骤一:创建中间分区表

create table CWSF3.CW_MZSFMX_INTERIM
(
  JLID   NUMBER(10),
  BMID   NUMBER(4),
  ZKID   NUMBER(4),
  BRBH   VARCHAR2(28),
  BRXM   VARCHAR2(20),
  DWDM   VARCHAR2(5),
  ZHID   NUMBER(8),
  XMID   NUMBER(8),
  FLM    VARCHAR2(8),
  TJM    VARCHAR2(4),
  MC     VARCHAR2(100),
  KZJB   VARCHAR2(1),
  YZLB   VARCHAR2(2),
  DJ     NUMBER(8,2),
  SL     NUMBER(4),
  ZFJE   NUMBER(9,2),
  JZJE   NUMBER(9,2),
  JMJE   NUMBER(9,2),
  ZLJE   NUMBER(9,2),
  ZFBL   NUMBER(3,2),
  YSID   NUMBER(5),
  JYID   NUMBER(10),
  SFYQ   VARCHAR2(2),
  ZTBZ   VARCHAR2(1) default '1',
  ZLHDID NUMBER(9) default 0,
  JMID   NUMBER(8),
  SFLX   VARCHAR2(1),
  SFRYID NUMBER(8),
  SFSJ   DATE,
  SPBZ   VARCHAR2(1) default '0',
  BZDM   VARCHAR2(2),
  BAFLM  VARCHAR2(3)
)
partition by range(SFSJ)
(
  partition CW_MZSFMX_p1  values less than (to_date('2011-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p2  values less than (to_date('2012-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p3  values less than (to_date('2013-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p4  values less than (to_date('2014-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p5  values less than (to_date('2015-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p6  values less than (to_date('2016-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p7  values less than (to_date('2017-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p8  values less than (to_date('2018-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p9  values less than (to_date('2019-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p10 values less than (to_date('2020-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p11 values less than (to_date('2021-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p12 values less than (to_date('2022-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p13 values less than (to_date('2023-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p14 values less than (to_date('2024-01-01','yyyy-mm-dd')),
  partition CW_MZSFMX_p15 values less than (to_date('2025-01-01','yyyy-mm-dd'))
);

步骤二:验证原表是否支持在线重定义

exec dbms_redefinition.can_redef_table('CWSF3','CW_MZSFMX');

该步骤用于确认原表结构符合在线重定义要求。

步骤三:启动在线重定义

exec dbms_redefinition.start_redef_table(
  'CWSF3','CW_MZSFMX','CW_MZSFMX_INTERIM'
);

执行后,中间分区表会自动加载原始表数据。此时新增数据不会自动同步,需在后续步骤手动触发同步。

步骤四:复制索引、约束及相关对象

DECLARE
num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    'CWSF3',
    'CW_MZSFMX',
    'CW_MZSFMX_INTERIM',
    num_errors => num_errors
  );
END;
/

步骤五:同步增量数据

BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
    'CWSF3',
    'CW_MZSFMX',
    'CW_MZSFMX_INTERIM'
  );
END;
/

该步骤建议在切换前多执行几次,确保中间表数据与原表保持一致。

步骤六:完成在线重定义切换

exec dbms_redefinition.finish_redef_table(
  'CWSF3',
  'CW_MZSFMX',
  'CW_MZSFMX_INTERIM'
);

切换过程中会产生短暂锁表,实际影响时间通常较短。

三、收尾工作

一)约束状态修正

select
'alter table cwsf3.'||table_name||
' enable validate constraint '||constraint_name||';'
from dba_constraints
where table_name = 'CW_MZSFMX';

生成语句后逐条执行。

二)收集统计信息

exec DBMS_STATS.GATHER_TABLE_STATS(
  OWNNAME => 'CWSF3',
  TABNAME => 'CW_MZSFMX',
  ESTIMATE_PERCENT => 1,
  METHOD_OPT => 'for all columns size repeat',
  DEGREE => 8,
  GRANULARITY => 'ALL',
  CASCADE => TRUE
);

三)监控临时表空间与对象状态

select TEMPORARY_TABLESPACE from dba_users where username='CWSF3';
select * from dba_temp_free_space;
select * from dba_redefinition_objects;
select * from dba_redefinition_errors;

四、异常处理

如需中断在线重定义:

exec dbms_redefinition.abort_redef_table(
  'CWSF3',
  'CW_MZSFMX',
  'CW_MZSFMX_INTERIM'
);

五、总结

本次实施验证了 DBMS_REDEFINITION 在生产环境中进行表结构改造的可靠性。通过在线重定义机制,可以在不中断业务的前提下完成复杂结构调整,为后期数据治理、性能优化与归档策略提供基础保障。

在实际实施过程中,需要重点关注临时表空间、redo/undo 增长速度以及同步时机的选择,并提前制定回退方案,确保变更过程可控。

作者:Digital Observer(施嘉伟) Oracle ACE Pro PostgreSQL ACE Partner Oracle  OCM、KCM、PGCM、YCP、DB2 、MySQL OCP、PCTP、PCSD、OCI、PolarDB技术专家、达梦师资认证,从业11年+ ITPUB认证专家、崖山YVP、KWDB MVP、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师 公众号/墨天轮/金仓社区/IF Club:Digital Observer;CSDN/PGfans:施嘉伟;ITPUB:sjw1933

hhh7.jpg

相关推荐