oracle数据库由于索引过期提示ORA | 您所在的位置:网站首页 › oracle报错ora-14400 › oracle数据库由于索引过期提示ORA |
问题说明:项目初期对部分数据量比较大的数据表进行了表分区,分区字段是根据日期进行的分区,当时分区只创建到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;
|
CopyRight 2018-2019 实验室设备网 版权所有 |