带 maxvalue 分区的范围表不能直接 add partition,因 oracle 将 maxvalue 视为“无穷大”,无法定义更大边界,必须用 split partition 拆分;否则报 ora-14074。

带 MAXVALUE 分区的范围表不能直接用 ADD PARTITION,必须用 SPLIT PARTITION;没有 MAXVALUE 的才可直接添加。
为什么不能直接对 MAXVALUE 分区 ADD PARTITION
Oracle 规定:只要分区策略是 PARTITION BY RANGE 且末分区用了 VALUES LESS THAN (MAXVALUE),就构成“封闭式边界”,不允许在它之后追加新分区——DDL 会报错 ORA-14074: partition bound must collate higher than that of the last partition。
这不是权限或语法问题,而是 Oracle 内部校验逻辑强制要求:所有 VALUES LESS THAN 边界值必须严格递增且可静态排序,MAXVALUE 被视为“无穷大”,无法再定义一个比它大的边界。
- 错误示例:
ALTER TABLE goods ADD PARTITION p2024 VALUES LESS THAN (TO_DATE('01-JAN-2025','DD-MON-YYYY'));→ 报 ORA-14074 - 正确路径只有两个:要么先
DROP PARTITION p_max(风险高,不推荐),要么用SPLIT拆分它
用 SPLIT PARTITION 添加新分区(推荐做法)
SPLIT 是安全、原子、可回滚的操作,本质是把一个现有分区按新边界切开,生成两个新分区,原分区消失。适用于有 MAXVALUE 分区的表。
以当前有 p_max 的表 goods 为例,想新增 2024 年分区:
ALTER TABLE goods SPLIT PARTITION p_max INTO (
PARTITION p2024 VALUES LESS THAN (TO_DATE('01-JAN-2025','DD-MON-YYYY')),
PARTITION p_max_new VALUES LESS THAN (MAXVALUE)
);
- 拆分后,原
p_max不复存在,数据自动重分布:时间 p2024,其余进p_max_new - 必须显式命名新分区(如
p2024和p_max_new),不能省略 - 边界值必须用静态日期字面量,如
DATE '2025-01-01'或TO_DATE(...),不能写ADD_MONTHS(...)或变量 - 操作期间该分区不可写,建议在低峰期执行;若数据量极大,考虑加
NOLOGGING降低 redo 压力(需评估归档需求)
没有 MAXVALUE 分区时,直接 ADD PARTITION 即可
如果建表时没设 MAXVALUE,比如只定义了 p2020、p2021、p2022,且最新分区边界是 TO_DATE('01-JAN-2023',...),那么可以直接追加:
ALTER TABLE goods ADD PARTITION p2023 VALUES LESS THAN (TO_DATE('01-JAN-2024','DD-MON-YYYY'));
- 前提是新边界的值 > 上一分区的
VALUES LESS THAN值,否则报 ORA-14074 - 可以一次加多个:
ADD PARTITION ... , PARTITION ... - 若指定了表空间,记得加上
TABLESPACE xxx,否则继承上一分区的表空间
容易被忽略的细节
分区维护不是“做完就完事”。真正影响业务的是后续行为:
- 新增或拆分后,必须立即执行
DBMS_STATS.GATHER_TABLE_STATS,否则优化器可能因统计信息陈旧而放弃分区裁剪,导致全表扫描 - 如果原
MAXVALUE分区已存大量历史数据(比如几年日志),SPLIT会触发物理数据移动,耗时长、锁表久——上线前务必在测试库用真实数据量压测 - 应用层代码若硬编码了分区名(如
SELECT * FROM goods PARTITION(p2022)),新增分区后这类语句会失效,应避免直接引用分区名











