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

59次阅读
没有评论

共计 2617 个字符,预计需要花费 7 分钟才能阅读完成。

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;

看完上述内容,你们掌握 Oracle 分区数据问题的分析和修复是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计2617字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)