Oracle分割槽資料問題的分析和修復

2021-09-22 19:10:25 字數 3102 閱讀 9566

今天根據同事的反饋,處理了乙個分割槽表的問題,也讓我對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_minmerge subpartitions p2017_q2_sp_other,sys_subp21 into subpartition p2017_q2_sp_other;

Oracle資料分割槽

範圍分割槽 範圍分割槽就是對資料表中的某個值的範圍進行分割槽,根據某個值的範圍,決定將該資料儲存在哪個分割槽上。如根據序號分割槽,根據業務記錄的建立日期進行分割槽等 create table subarea pid number not null,pitem varchar2 200 pdata d...

Oracle資料庫的分割槽

實現了均勻的負載值分配,增加 hash 分割槽可以重新分配資料 建立create table table name empno number,ename varchar 20 partition by hash empno partition p1,partition p2 檢視分割槽結構 sele...

oracle資料庫分割槽

numtoyminterval和numtoyminterval是日期轉換函式,作用 可以將數字轉換成相應的日期單位時間 1.numtoyminterval n char expr char expr 日期描述,可以是year和month。通常當我們使用add month新增月時,如果輸入是本月月底的...