业务大致是这样的:有一张表是存放“赠送礼物”的记录表。
产品这边赠送了一个礼物给另外一个小号,然后后台查询不到。
找不到文档,手动查到该表:
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
无法映射到任何分区?原来这张是分区表,大概是分区的问题。
检查一下该表表分区:
-
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);
作者微信公众号(持续更新)
