最近一个项目涉及到改造,其中有大表在以前没有建成分区表,现在需要做成分区表。大致步骤如下:
步骤如下:
- 检查表是否可以重定义:
使用DBMS_REDEFINITION.CAN_REDEF_TABLE确定旧表是否可以进行在线重定义。 -
创建一个与原始表结构相同的新的分区表:
创建一个新的分区表,表结构与原表一致,但不包括索引、触发器等。 -
开始重定义过程:
使用DBMS_REDEFINITION.START_REDEF_TABLE开始重定义过程。 -
同步数据:
使用DBMS_REDEFINITION.SYNC_INTERIM_TABLE同步原始表和新分区表之间的数据。 -
复制依赖对象:
将原始表的所有索引、触发器、约束和其他依赖对象复制到新分区表。 -
完成重定义:
使用DBMS_REDEFINITION.FINISH_REDEF_TABLE完成重定义过程。 -
切换表名:
如果新的分区表使用了不同的名字,在重定义完成后,将原始表重命名为其他名称,然后将新分区表重命名为原始表名。
涉及到的代码如下:
— 假设原表名为 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;
- 建议在低峰时段进行操作,以避免对业务造成影响。
- 重定义完成后,如果有基于这个大表做的物化视图,那么物化视图日志会被清除!