使用在线重定义将大表改造为分区表

最近一个项目涉及到改造,其中有大表在以前没有建成分区表,现在需要做成分区表。大致步骤如下:

步骤如下:

  1. 检查表是否可以重定义:
    使用DBMS_REDEFINITION.CAN_REDEF_TABLE确定旧表是否可以进行在线重定义。

  2. 创建一个与原始表结构相同的新的分区表:
    创建一个新的分区表,表结构与原表一致,但不包括索引、触发器等。

  3. 开始重定义过程:
    使用DBMS_REDEFINITION.START_REDEF_TABLE开始重定义过程。

  4. 同步数据:
    使用DBMS_REDEFINITION.SYNC_INTERIM_TABLE同步原始表和新分区表之间的数据。

  5. 复制依赖对象:
    将原始表的所有索引、触发器、约束和其他依赖对象复制到新分区表。

  6. 完成重定义:
    使用DBMS_REDEFINITION.FINISH_REDEF_TABLE完成重定义过程。

  7. 切换表名:
    如果新的分区表使用了不同的名字,在重定义完成后,将原始表重命名为其他名称,然后将新分区表重命名为原始表名。

涉及到的代码如下:

— 假设原表名为 big_table,我们想要将其分区

— Step 1: 创建新的分区表结构

CREATE TABLE big_table_part
    ( /* columns must match the big_table columns exactly */ )
    PARTITION BY RANGE (date_column) 
    (
        -- 定义分区结构
    );

— Step 2: 开始重定义

BEGIN
    DBMS_REDEFINITION.CAN_REDEF_TABLE('your_schema', 'big_table'); //这一步是检查这个表是否可以做在线重定义
    DBMS_REDEFINITION.START_REDEF_TABLE('your_schema', 'big_table', 'big_table_part');
END;
/

— Step 3: 数据同步(如果在重定义过程中数据有变动)

BEGIN
    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('your_schema', 'big_table', 'big_table_part');
END;
/

— Step 4: 复制索引和触发器等到新分区表
— 此步骤需要复制所有相关的数据库对象。

— Step 5: 完成重定义

BEGIN
    DBMS_REDEFINITION.FINISH_REDEF_TABLE('your_schema', 'big_table', 'big_table_part');
END;
/

— Step 6: 重命名表

RENAME big_table TO big_table_old;
RENAME big_table_part TO big_table;

— Step 7: 根据需要删除或归档旧表

DROP TABLE big_table_old;
  1. 建议在低峰时段进行操作,以避免对业务造成影响。
  2. 重定义完成后,如果有基于这个大表做的物化视图,那么物化视图日志会被清除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注