Oracle将一张普通表更改为按天分区的表

目前数据库中有一张记录轨迹的表 patrol_track ,因后期数据量会增长到很大,所以想根据该表的 create_time 字段建立表分区,参考了网上的资料,作了如下处理:

  1. 查看该表是否支持重定义
SQL> exec dbms_redefinition.can_redef_table(user, 'patrol_track', dbms_redefinition.cons_use_pk);

出现如下的错误:
error
需要为该表定义一个主键

SQL> alter table patrol_track add constraint pk_patrol_track primary key(id);

定义主键后再次查看是否支持重定义,执行结果:PL/SQL过程已成功完成。

  1. 建立一个相同结构的表 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’) 即可。

  1. 插入数据,查看分区
SQL> select table_name, partition_name from user_tab_partitions where table_name = 'PATROL_TRACK_NEW';

执行完后可以看到表已经存在几个分区:
partition

  1. 执行表的在线重定义
SQL> exec dbms_redefinition.start_redef_table(user, 'patrol_track', 'patrol_track_new');
  1. 将新建的表与原表进行同步
SQL> execute dbms_redefinition.sync_interim_table(user, 'patrol_track', 'patrol_track_new');
  1. 结束表的在线重定义
SQL> exec dbms_redefinition.finish_redef_table(user, 'patrol_track', 'patrol_track_new');

到这里,再去查询原表,已经可以查到分区。

注:
如果在表的在线重定义过程中出现错误,可以在 start_redef_tablefinish_redef_table之间执行

SQL> exec dbms_redefinition.abort_redef_table(user, 'patrol_track', 'patrol_track_new');

来放弃执行在线重定义。

参考:
oracle的在线重定义(将普通表转为分区表ora9i以上版本)
ORACLE分区窗口按月按天自动分区

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值