【Oracle】ORA-14400: inserted partition key does not map to any partition

神諭丶發表於2016-01-04
元旦假日後工作第一天,同事說一個遠古專案後臺查不到某表2016年以後被寫入的資料。(該專案仍在提供服務,但早已停止更新)

業務大致是這樣的:有一張表是存放“贈送禮物”的記錄表。
產品這邊贈送了一個禮物給另外一個小號,然後後臺查詢不到。

找不到文件,手動查到該表:
COMMENT ON COLUMN "*"."SEND_LOG"."SEND_TIME" IS '贈送時間';

根據SEND_TIME降序排,發現最後一個rows的日期是2015-12-31 22:53:11,的確沒有2016年的資料。
手動新增資料:
在DB執行新增資料,to_date('2016-01-01','YYYY-MM-DD'),發現報錯:
ORA-14400: inserted partition key does not map to any partition  

無法對映到任何分割槽?原來這張是分割槽表,大概是分割槽的問題。

檢查一下該表表分割槽:


  1. SELECT table_name, partition_name, high_value, partition_position, tablespace_name
  2. FROM user_tab_partitions
  3. WHERE table_name='SEND_LOG'
  4. ORDER BY partition_position



發現high_value欄位內容為:
  1. TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
  2. TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
  3. TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
  4. TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
  5. …………
  6. TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
  7. TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


並發現非MAXVALUE分割槽,直接新增分割槽。
專案遠古,文件也不知道存哪,查了一下增長資料,資料量不大,手動新增後兩年分割槽,間隔為半年。

  1. ALTER TABLE SEND_LOG ADD PARTITION p45 VALUES
  2. LESS THAN (TO_DATE('2016-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE *;

  3. ALTER TABLE SEND_LOG ADD PARTITION p46 VALUES
  4. LESS THAN (TO_DATE('2018-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE *;

……
再新增一個MAXVALUE

  1. ALTER TABLE SEND_LOG ADD PARTITION p49 VALUES LESS THAN (maxvalue) TABLESPACE *;


順便測試了一下為帶有MAXVALUE的分割槽表新增新的分割槽:
  1. CREATE TABLE partition_test(id number, create_time date)
  2. PARTITION BY RANGE(create_time)(
  3. PARTITION p1 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
  4. PARTITION p2 VALUES LESS THAN (TO_DATE('2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
  5. PARTITION p3 VALUES LESS THAN (maxvalue));

如果普通新增則會報錯:

  1. ALTER TABLE partition_test ADD PARTITION p4 VALUES
  2. LESS THAN (TO_DATE('2017-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ;

ORA-14074: partition bound must collate higher than that of the last partition



通過SPLIT PARTITION新增新分割槽:
  1. ALTER TABLE partition_test SPLIT PARTITION p3 AT (TO_DATE('2017-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
  2. INTO (partition, partition p3);

作者微信公眾號(持續更新)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1970665/,如需轉載,請註明出處,否則將追究法律責任。

相關文章