又跨年了,作为DBA的第一反映是以时间作为分区键的分区表是否已经创建子分区。如果2018年的子分区没有创建,那么假如在11g以上的环境中,使用了interval分区技术,也不用担心。但如果没有采用interval分区(某些系统要求365*24,手动新增子分区可以提前校验,避免事故发生),那么当2018年数据插入的时候,会立刻报错,影响业务。
添加范围分区的界限应该高于最后一个分区的上限;如果要在中间的分区或者MAX分区上添加新的分区, 应该使用拆分(split)分区。通过实验验证:
1.首先搭建环境,建立分区表
conn as sysdba

conn sh/sh
--无MAX分区
--MAX分区

2.给无MAX分区添加新分区
添加分区前,分区表SALES_RANGE_1的分区情况

添加两个分区,一个为2018年分区,一个为2019年分区:(注意语句:分区变更时,如果没有指定 UPDATE INDEXES,则相关分区的本地索引、及全局索引都将被标记为UNUSABLE,必须重建才能生效,所以加上update indexes很重要)

查看分区结果:

sh用户默认表空间

(注意:sales_2018分区存储位置在sh用户的默认表空间里,而sales_2019存储位置在DW01,这里有坑,在生产环境一定要注意用类似sales_2019分区的语句进行添加分区。删除子分区语句:ALTER TABLE 表名 DROP PARTITION 子分区名)
3.给MAX分区添加新分区
如果给MAX分区按照上面的方法进行分区添加,那就会遇到错误。

oerr工具查看

此时,需要对MAX分区进行拆分

查看结果:

总结:添加范围分区的界限应该高于最后一个分区的上限;如果要在中间的分区或者MAX分区上添加新的分区, 应该使用拆分(split)分区。分区变更时,如果没有指定 UPDATE INDEXES,则相关分区的本地索引、及全局索引都将被标记为UNUSABLE,必须重建才能生效,所以后面必须加上 UPDATE INDEXES。添加分区时,要注意指定添加分区的表空间,避免踩坑。




