元旦假日后工作第一天,同事说一个远古项目后台查不到某表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
无法映射到任何分区?原来这张是分区表,大概是分区的问题。
检查一下该表表分区:
发现 high_value字段内容为:
并发现非MAXVALUE分区,直接添加分区。
项目远古,文档也不知道存哪, 查了一下增长数据,数据量不大,手动添加后两年分区,间隔为半年。
……
再添加一个MAXVALUE
顺便测试了一下为带有MAXVALUE的分区表添加新的分区:
如果普通添加则会报错:
ORA-14074: partition bound must collate higher than that of the last partition
通过SPLIT PARTITION添加新分区:
作者微信公众号(持续更新)
业务大致是这样的:有一张表是存放“赠送礼物”的记录表。
产品这边赠送了一个礼物给另外一个小号,然后后台查询不到。
找不到文档,手动查到该表:
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
无法映射到任何分区?原来这张是分区表,大概是分区的问题。
检查一下该表表分区:
- SELECT table_name, partition_name, high_value, partition_position, tablespace_name
- FROM user_tab_partitions
- WHERE table_name='SEND_LOG'
- ORDER BY partition_position
发现 high_value字段内容为:
- TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
- TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
- TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
- TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
- …………
- TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
- TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
并发现非MAXVALUE分区,直接添加分区。
项目远古,文档也不知道存哪, 查了一下增长数据,数据量不大,手动添加后两年分区,间隔为半年。
- ALTER TABLE SEND_LOG ADD PARTITION p45 VALUES
- LESS THAN (TO_DATE('2016-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE *;
-
- ALTER TABLE SEND_LOG ADD PARTITION p46 VALUES
- LESS THAN (TO_DATE('2018-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE *;
……
再添加一个MAXVALUE
- ALTER TABLE SEND_LOG ADD PARTITION p49 VALUES LESS THAN (maxvalue) TABLESPACE *;
顺便测试了一下为带有MAXVALUE的分区表添加新的分区:
- CREATE TABLE partition_test(id number, create_time date)
- PARTITION BY RANGE(create_time)(
- PARTITION p1 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
- PARTITION p2 VALUES LESS THAN (TO_DATE('2016-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
- PARTITION p3 VALUES LESS THAN (maxvalue));
如果普通添加则会报错:
- ALTER TABLE partition_test ADD PARTITION p4 VALUES
- 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添加新分区:
- ALTER TABLE partition_test SPLIT PARTITION p3 AT (TO_DATE('2017-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
- INTO (partition, partition p3);
作者微信公众号(持续更新)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-1970665/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29773961/viewspace-1970665/