ITPub博客

首页 > 数据库 > Oracle > 【Oracle】ORA-14400: inserted partition key does not map to any partition

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

原创 Oracle 作者:神谕丶 时间:2016-01-04 13:10:32 0 删除 编辑
元旦假日后工作第一天,同事说一个远古项目后台查不到某表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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号:fantasy-life-

注册时间:2014-07-28

  • 博文量
    159
  • 访问量
    971049