Oracle分区数据问题的分析和修复

今天根据同事的反馈,处理了一个分区表的问题,也让我对Oracle的分区表功能有了进一步的理解。

公司主营业务:网站建设、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出北川羌族免费做网站回馈大家。

首先根据开发同事的反馈,他们在程序批量插入一部分数据的时候,总是会有一部分请求执行失败,而查看日志就是ORA-14400的错误,对于这类问题,我有一个很直观的感觉,分区有问题。

 
 
 
 
  1. > INSERT INTO DY_USER_ANALYSIS_MIN(ID,STAT_TIME,GAME_TYPE,ZONE_ID,GROUP_ID,ONLINE_5CNT)
  2.     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));
  3. INSERT INTO DY_USER_ANALYSIS_MIN(ID,STAT_TIME,GAME_TYPE,ZONE_ID,GROUP_ID,ONLINE_5CNT)
  4.             *
  5. ERROR at line 1:
  6. 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分区。

 
 
 
 
  1. PARTITION BY RANGE ("STAT_TIME")
  2.   SUBPARTITION BY LIST ("GAME_TYPE")
  3.   SUBPARTITION TEMPLATE (
  4.     SUBPARTITION "SP_ABC" values ( 'abc' )
  5.   TABLESPACE "TEST_DATA" ,
  6. 。。。
  7.     SUBPARTITION "SP_OTHER" values ( 'xjzj', 'hij'
  8. )  TABLESPACE "TEST_DATA"  )
  9.  (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的子分区模板规则。

 
 
 
 
  1. alter table TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN 
  2. set SUBPARTITION TEMPLATE (
  3.     SUBPARTITION "SP_ABC" values ( 'abc' )
  4.   TABLESPACE "TEST_DATA" ,
  5.     。。。
  6.     SUBPARTITION "SP_OTHER" values ( 'xjzj', 'hij','pz’)
  7.   TABLESPACE "TEST_DATA"  )

按照这种方式修改模板就没有问题了,然后继续尝试插入数据,发现还是同样的错误。这个时候是哪里的问题了呢。

根据错误反复排查,还是指向了分区的定义,那么我们看看其中一个分区的情况。

 
 
 
 
  1. (PARTITION "P_OLD"  VALUES LESS THAN (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NL
  2. _CALENDAR=GREGORIAN')) 
  3.  TABLESPACE "TEST_DATA"
  4. ( SUBPARTITION "P_OLD_SP_ABC"  VALUES ('abc')
  5.  TABLESPACE "TEST_DATA",
  6. 。。。
  7.  SUBPARTITION "P_OLD_SP_OTHER"  VALUES ('xjzj', hij', 'pz')
  8.  TABLESPACE "TEST_DATA") ,

所以按照分区的定义,里面还是少了这个subpartition的数值范围信息。

如果想重新生成一个新的subpartition可以使用如下的方式:

 
 
 
 
  1. ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MODIFY PARTITION P_OLD add SUBPARTITION P_OLD_SP_OTHER_pz VALUES ('pz');

如果想生成默认的subpartition名称可以使用如下的方式:

 
 
 
 
  1. ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MODIFY PARTITION P2017_Q2 add SUBPARTITION VALUES ('pz');

这个时候的subpartition的信息,我摘录出一个来简单看看。

 
 
 
 
  1. ( SUBPARTITION "P2017_Q3_SP_ABC"  VALUES ('abc')
  2.  TABLESPACE "TEST_DATA",
  3. 。。。
  4.  SUBPARTITION "P2017_Q3_SP_OTHER"  VALUES ('xjzj', 'hij')    TABLESPACE "TEST_DATA",
  5.  SUBPARTITION "SYS_SUBP22"  VALUES ('pz')
  6.  TABLESPACE "TEST_DATA") ,

如果依旧觉得不满意,我们来使用merge subpartitions的方式,当然这个操作还是会有全局锁的,会把两个分区整合为一个。

 
 
 
 
  1. ALTER TABLE TLSTAT_NEWBG.DY_USER_ANALYSIS_MIN MERGE SUBPARTITIONS P2017_Q2_SP_OTHER,SYS_SUBP21 INTO SUBPARTITION P2017_Q2_SP_OTHER;

文章标题:Oracle分区数据问题的分析和修复
本文地址:http://www.36103.cn/qtweb/news24/2224.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联