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;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章