oracle数据库由于索引过期提示ORA-14400: inserted partition key does not map to any partition的问题说明及解决方案

问题说明:项目初期对部分数据量比较大的数据表进行了表分区,分区字段是根据日期进行的分区,当时分区只创建到3月1号,当日期切换到3月1号当天时完了,整个创建了分区的数据表都插入不进去数据了,oracle提示ORA-14400: inserted partition key does not map to any partition的错误(整个批量服务器爆炸........脑补当时的心情),幸好当时还是在准生产环境,影响不大。

解决方案:

1、手动重新创建分区(一次性创建到了年底),但是这种方法等到年底这个时间点还是会有问题。

创建语句如下:alter table 表名 add partition 分区名称 values LESS THAN (分区字段);

示例:alter table test add partition P5 values LESS THAN (TO_DATE('2020-04-01','YYYY-MM-DD'));

            alter table test1 add partition P5 values LESS THAN ('20200501');

也可以执行这样的语句:alter table test add partition pmax values less than (maxvalue);

但是这样的话后续如果之前的分区已过期的话,那么后续所有的数据都会放在pmax分区中,这样有违表分区的理念,不推荐

2、自动创建表分区(推荐,但是网上说对数据库的性能有一定影响)。

创建语句如下:

DROP TABLE  test;
-- 创建表及建立表分区
create table test
(
   ID NUMBER(20) not null,
   REMARK VARCHAR2(1000),
   create_time DATE
)PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))(partition P1 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

注:自动创建分区只适用于分区字段为日期类型的,可以按照年,月,周,日创建,具体参考该文章https://www.cnblogs.com/yuxiaole/p/9809294.html
-- 插入测试数据
INSERT INTO test VALUES(23234,'asfafaf',to_date('2019-11-01', 'yyyy-mm-dd'));
-- 测试查询
SELECT * FROM test;
SELECT * FROM test partition(P1);
-- 按分区查询
SELECT * FROM test partition(SYS_P7901);
-- 查看表分区
select partition_name from user_tab_partitions where table_name='TEST;
select * from USER_PART_TABLES  a where a.table_name=upper('TEST');

注意事项:在新建了表分区之后最好把对应表的索引重新再建一遍

执行语句:alter index 索引名称 rebuild;

猜你喜欢

转载自blog.csdn.net/u013804636/article/details/104606658