Oracle分区数据问题的分析和修复
今天根据同事的反馈,处理了一个分区表的问题,也让我对Oracle的分区表功能有了进一步的理解。
首先根据开发同事的反馈,他们在程序批量插入一部分数据的时候,总是会有一部分请求执行失败,而查看日志就是ORA-14400的错误,对于这类问题,我有一个很直观的感觉,分区有问题。
> INSERT INTO DY_USER_ANALYSIS_MIN(ID,STAT_TIME,GAME_TYPE,ZONE_ID,GROUP_ID,ONLINE_5CNT)
VALUES(100,to_date('2017-07-12 17:40:00','yyyy-mm-dd HH24:mi:ss'),'pz',to_number(-1),to_number(-1),to_number(0));
INSERT INTO DY_USER_ANALYSIS_MIN(ID,STAT_TIME,GAME_TYPE,ZONE_ID,GROUP_ID,ONLINE_5CNT)
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition
而如果把‘pz’修改为另外一个字符串'dhsh'就没问题。
所以这样一个ORA问题,通过初始信息我得到一个基本的推论,那就是没有符合条件的分区了。而如果仔细分析,会发现这个问题似乎有些蹊跷。
一般的分区表都是Range分区,基本就是数值范围或者是日期来做范围分区,这个问题该怎么理解呢,如果按照时间分区,那么另外一个SQL插入也应该失败才对。
所以带着疑惑,我查看了分区的情况,发现这个表竟然有默认键值maxvlue的分区,所以如果说指定的Range分区不存在,似乎有些说不通。
这个问题该如果解决呢,一个直观的地方就是查看表的DDL,dbms_metadata.get_ddl即可得到。
得到的DDL一看,我就有些懵了,开发同学怎么知道这个list分区,竟然已经用上了这个还算高级的特性吧,就是Range-list分区。
PARTITION BY RANGE ("STAT_TIME")
SUBPARTITION BY LIST ("GAME_TYPE")
SUBPARTITION TEMPLATE (
SUBPARTITION "SP_ABC" values ( 'abc' )
TABLESPACE "TEST_DATA" ,
。。。
SUBPARTITION "SP_OTHER" values ( 'xjzj', 'hij'
) TABLESPACE "TEST_DATA" )
(PARTITION "P_OLD" VALUES LESS THAN (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
对于这类问题,虽然还是有些陌生,但是还是有一些分区表的底子的,所以分析起来也不会有太大的偏差。
按照DDL的格式,我们是要想修改template的子分区模板规则。
alter table TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN
set SUBPARTITION TEMPLATE (
SUBPARTITION "SP_ABC" values ( 'abc' )
TABLESPACE "TEST_DATA" ,
。。。
SUBPARTITION "SP_OTHER" values ( 'xjzj', 'hij','pz’)
TABLESPACE "TEST_DATA" )
按照这种方式修改模板就没有问题了,然后继续尝试插入数据,发现还是同样的错误。这个时候是哪里的问题了呢。
根据错误反复排查,还是指向了分区的定义,那么我们看看其中一个分区的情况。
(PARTITION "P_OLD" VALUES LESS THAN (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NL
S_CALENDAR=GREGORIAN'))
TABLESPACE "TEST_DATA"
( SUBPARTITION "P_OLD_SP_ABC" VALUES ('abc')
TABLESPACE "TEST_DATA",
。。。
SUBPARTITION "P_OLD_SP_OTHER" VALUES ('xjzj', hij', 'pz')
TABLESPACE "TEST_DATA") ,
所以按照分区的定义,里面还是少了这个subpartition的数值范围信息。
如果想重新生成一个新的subpartition可以使用如下的方式:
ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MODIFY PARTITION P_OLD add SUBPARTITION P_OLD_SP_OTHER_pz VALUES ('pz');
如果想生成默认的subpartition名称可以使用如下的方式:
ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MODIFY PARTITION P2017_Q2 add SUBPARTITION VALUES ('pz');
这个时候的subpartition的信息,我摘录出一个来简单看看。
( SUBPARTITION "P2017_Q3_SP_ABC" VALUES ('abc')
TABLESPACE "TEST_DATA",
。。。
SUBPARTITION "P2017_Q3_SP_OTHER" VALUES ('xjzj', 'hij') TABLESPACE "TEST_DATA",
SUBPARTITION "SYS_SUBP22" VALUES ('pz')
TABLESPACE "TEST_DATA") ,
如果依旧觉得不满意,我们来使用merge subpartitions的方式,当然这个操作还是会有全局锁的,会把两个分区整合为一个。
ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MERGE SUBPARTITIONS P2017_Q2_SP_OTHER,SYS_SUBP21 INTO SUBPARTITION P2017_Q2_SP_OTHER;
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- STM32F4 SPI DMA
- 快速学习-XXL-JOB总体设计
- Android中Input事件初始化、接收以及分发
- 快速学习-XXL-JOB操作指南
- 快速学习-XXL-JOB任务详解
- PyQt5 技术篇-scrollArea不显示滚动条解决方法。Qt Designer不显示滚动条。滚动条的显示和隐藏。
- Python 爬虫篇-利用BeautifulSoup库爬取墨迹天气网的天气信息实例演示,调用墨迹天气api接口获取空气质量
- Redis的各种数据类型实践-ZSet
- Python 技术篇-将python项目打包成exe独立运行程序,pyinstaller库打包python代码
- Spring MVC 工作流程简介
- 8个尽量优化你的SQL
- 记一次 Kafka Producer 性能调优实战
- Kafka 独立消费者
- 【iOS】记录iOS14以及xcode12 遇到的问题
- 如果你还在犹豫要不要入行,请先看看我的IT入坑记【技术创作101训练营】