今天遇到一个Oracle增加分区的问题,以下是我处理的步骤:
ORA-14074: 分区界限必须调整为高于最后一个分区界限
1、错误展示
收到运维人员反馈,最新查询收费信息变慢,初步判定,由于2020年新的分区没有维护,导致数据查询2020年的业务数据执行慢,
SQL>select table_name , partition_name,high_value from user_tab_partitions where table_name='JW_DF_FXMXB'
TABLE_NAME PARTITION_NAME HIGH_VALUE
-------------------- ------------------------------ --------------------------------------------------------------------------------
JW_DF_FXMXB P201912 TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
JW_DF_FXMXB P201911 TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
JW_DF_FXMXB P201910 TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
JW_DF_FXMXB PMAX TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SQL> ALTER TABLE JW_DF_FXMXB ADD PARTITION P202001 VALUES LESS THAN ('202002');;
ALTER TABLE JW_DF_FXMXB ADD PARTITION P202001 VALUES LESS THAN ('202002');
*
ERROR at line 1:
ORA-14074: partition bound must collate higher than that of the last partition
2、解决:
因为表上已经有了pmax最大分区,这个时候oracle是不直接允许增加分区的. 而是通过拆分分区实现,只要只用下列语句增加分区就不会发生该错误.
————————————————
方式一:SPLIT
1)SPLIT PARTITION
ALTER TABLE JW_DF_FXMXB SPLIT PARTITION pmax AT (202001) INTO (PARTITION P60, PARTITION PMAX) UPDATE GLOBAL INDEXES ;
ALTER TABLE JW_DF_FXMXB SPLIT PARTITION pmax AT (202002) INTO (PARTITION P70, PARTITION PMAX) UPDATE GLOBAL INDEXES ;
ALTER TABLE JW_DF_FXMXB SPLIT PARTITION pmax AT (202003) INTO (PARTITION P80, PARTITION PMAX) UPDATE GLOBAL INDEXES ;
ALTER TABLE JW_DF_FXMXB SPLIT PARTITION pmax AT (202004) INTO (PARTITION P90, PARTITION PMAX) UPDATE GLOBAL INDEXES ;
ALTER TABLE JW_DF_FXMXB SPLIT PARTITION pmax AT (202005) INTO (PARTITION P100, PARTITION PMAX) UPDATE GLOBAL INDEXES ;
但是这种用的实在别扭。
方式二:DROP PARTITION
直接删除PMAX PARTITION,再执行ADD PARTITION就行,简单实用。
ALTER TABLE JW_DF_FXMXB DROP PARTITION "PMAX" UPDATE GLOBAL INDEXES
ALTER TABLE JW_DF_FXMXB ADD PARTITION "XX" VALUES LESS THAN (100) ;
ALTER TABLE JW_DF_FXMXB ADD PARTITION "PMAX" VALUES LESS THAN (MAXVALUE);
————————————————
3、英文引用
While adding a partition to a partitioned table, got below error.
SQL> alter table dbaclass_QTAB add partition dbaclass_q4 VALUES LESS THAN (TO_DATE(’01-APR-1998′,’DD-MON-YYYY’));
alter table dbaclass_QTAB add partition dbaclass_q4 VALUES LESS THAN (TO_DATE(’01-APR-1998′,’DD-MON-YYYY’))
SOLUTION:
This error occurs when we are trying to add a partition between two partitions where MAXVALUE is defined for that table.
ERROR at line 1:
ORA-14074: partition bound must collate higher than that of the last partition
So to avoid this error, the need to split the partition, instead of adding.
SQL> select partition_name,high_value from dba_tab_partitions where table_name='DBACLASS_QTAB';