目前数据库中有一张记录轨迹的表 patrol_track ,因后期数据量会增长到很大,所以想根据该表的 create_time 字段建立表分区,参考了网上的资料,作了如下处理:
- 查看该表是否支持重定义
SQL> exec dbms_redefinition.can_redef_table(user, 'patrol_track', dbms_redefinition.cons_use_pk);
出现如下的错误:
需要为该表定义一个主键
SQL> alter table patrol_track add constraint pk_patrol_track primary key(id);
定义主键后再次查看是否支持重定义,执行结果:PL/SQL过程已成功完成。
- 建立一个相同结构的表 patrol_track_new ,并且按天分区
SQL> create table patrol_track_new (id number(19), create_time date)
partition by range(create_time) interval (numtodsinterval(1, 'day'))
(partition p_day_1 values less than (to_date('2020-04-30', 'yyyy-MM-dd')));
这是支持按天自增分区的,如果想按月分区的话,把 numtodsinterval(1, ‘day’) 替换为 numtoyminterval(1, ‘month’) 即可。
- 插入数据,查看分区
SQL> select table_name, partition_name from user_tab_partitions where table_name = 'PATROL_TRACK_NEW';
执行完后可以看到表已经存在几个分区:
- 执行表的在线重定义
SQL> exec dbms_redefinition.start_redef_table(user, 'patrol_track', 'patrol_track_new');
- 将新建的表与原表进行同步
SQL> execute dbms_redefinition.sync_interim_table(user, 'patrol_track', 'patrol_track_new');
- 结束表的在线重定义
SQL> exec dbms_redefinition.finish_redef_table(user, 'patrol_track', 'patrol_track_new');
到这里,再去查询原表,已经可以查到分区。
注:
如果在表的在线重定义过程中出现错误,可以在 start_redef_table 和 finish_redef_table之间执行
SQL> exec dbms_redefinition.abort_redef_table(user, 'patrol_track', 'patrol_track_new');
来放弃执行在线重定义。