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

元旦假日后工作第一天,同事说一个远古项目后台查不到某表2016年以后被写入的数据。(该项目仍在提供服务,但早已停止更新)

业务大致是这样的:有一张表是存放“赠送礼物”的记录表。
产品这边赠送了一个礼物给另外一个小号,然后后台查询不到。

找不到文档,手动查到该表:
COMMENT ON COLUMN "*"."SEND_LOG"."SEND_TIME" IS '赠送时间';

根据S END_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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29773961/viewspace-1970665/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值