溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle分區(qū)數(shù)據(jù)問題的分析和修復(fù)是怎樣的

發(fā)布時間:2021-11-12 15:36:02 來源:億速云 閱讀:152 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

Oracle分區(qū)數(shù)據(jù)問題的分析和修復(fù)是怎樣的,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

今天根據(jù)同事的反饋,處理了一個分區(qū)表的問題,也讓我對Oracle的分區(qū)表功能有了進(jìn)一步的理解。

  首先根據(jù)開發(fā)同事的反饋,他們在程序批量插入一部分?jǐn)?shù)據(jù)的時候,總是會有一部分請求執(zhí)行失敗,而查看日志就是ORA-14400的錯誤,對于這類問題,我有一個很直觀的感覺,分區(qū)有問題。

> 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問題,通過初始信息我得到一個基本的推論,那就是沒有符合條件的分區(qū)了。而如果仔細(xì)分析,會發(fā)現(xiàn)這個問題似乎有些蹊蹺。

   一般的分區(qū)表都是Range分區(qū),基本就是數(shù)值范圍或者是日期來做范圍分區(qū),這個問題該怎么理解呢,如果按照時間分區(qū),那么另外一個SQL插入也應(yīng)該失敗才對。

   所以帶著疑惑,我查看了分區(qū)的情況,發(fā)現(xiàn)這個表竟然有默認(rèn)鍵值maxvlue的分區(qū),所以如果說指定的Range分區(qū)不存在,似乎有些說不通。

   這個問題該如果解決呢,一個直觀的地方就是查看表的DDL,dbms_metadata.get_ddl即可得到。

   得到的DDL一看,我就有些懵了,開發(fā)同學(xué)怎么知道這個list分區(qū),竟然已經(jīng)用上了這個還算高級的特性吧,就是Range-list分區(qū)。

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'))

 對于這類問題,雖然還是有些陌生,但是還是有一些分區(qū)表的底子的,所以分析起來也不會有太大的偏差。

 按照DDL的格式,我們是要想修改template的子分區(qū)模板規(guī)則。

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"  )

按照這種方式修改模板就沒有問題了,然后繼續(xù)嘗試插入數(shù)據(jù),發(fā)現(xiàn)還是同樣的錯誤。這個時候是哪里的問題了呢。

   根據(jù)錯誤反復(fù)排查,還是指向了分區(qū)的定義,那么我們看看其中一個分區(qū)的情況。

 (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") ,

所以按照分區(qū)的定義,里面還是少了這個subpartition的數(shù)值范圍信息。

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

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

  如果想生成默認(rèn)的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的方式,當(dāng)然這個操作還是會有全局鎖的,會把兩個分區(qū)整合為一個。

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

看完上述內(nèi)容,你們掌握Oracle分區(qū)數(shù)據(jù)問題的分析和修復(fù)是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI