電信資料遷移的工作分析與總結

2021-05-26 02:29:49 字數 4095 閱讀 6944

背景:

2月份的一天電信系統突然夯死,業務應用緩慢無比,經過分析發現一張大表(業務明細表

order_detail_l

)的執行計畫變更了,本來應該走索引的,結果變更為全表掃瞄,該錶有

5億條記錄,全表掃瞄絕對是個噩夢。

分析原因發現統計資訊採集率不夠,資料庫的自動採集功能已經開啟,但是預設的採集率是

5%,貌似對於這樣的大表來說遠遠不夠,重新按照

100%

採集後執行計畫恢復正常,

語句如下:

exec

dbms_stats.gather_table_stats(ownname=>

'liomuser'

,tabname=>

'order_detail_l'

,degree

=>

6,estimate_percent=>

100); 注:

dbms_stats.gather_table_stats

進行統計資訊採集時,

cascade

預設為yes

,即對錶分析的同時,索引等其他關聯物件也進行了分析,

estimate_percent

引數為採集率。

對於由於採集率過低導致的執行計畫便跟問題,

oracle

官方給出的解釋是

bug

但是效率任然很低,因為資料量多索引過大,及時走索引,效率仍然不高,最後決定將生產庫資料挪到歷史查詢庫,生產保留

6個月資料。

生產庫需要遷移將近

4年的資料,

85張表共

320g

,最大的表有

6億記錄,大小為

40g,其中大小查過

20g的表有

20張。

局方要求不能影響生產環境,

mygod

!這絕對是個折磨人的活,局方要求所有執行指令碼包括業務邏輯判斷都精確到分鐘。

遷移環境:

hp-ux b.11.23 u 9000/800

oracle database 10g enterprise edition release 10.2.0.4.0 - 64bi

遷移步驟: 1、

編寫邏輯處理包

pkg_dump_util

,主要功能是:

(1)處理判斷各表的歸檔臨界點。

(2)切割歸檔

dump

檔案,(由於系統對

dump

問題有大小的限制,需要通過表分組實現來將資料割接開來)

(3)自動生產匯出語句

(4)邏輯判斷,匯出資料是否業務完整性 2、

採用自動生成的語句匯出表資料,(採用資料庫幫浦

expdp)

匯出技術點滴:

(1)只匯出資料

content=data_only

(2)指定每個

dump

包含的表,

tables=(t_name1,t_name2,t_name3)

匯出時間統計:

(1)共320g

資料,共耗時

6個小時,最大

dump

檔案是48g

(2)最大表匯出耗時

2個小時,共

37g

3、 歷史查詢庫資料匯入,該環節是最麻煩的環節,最大的歷史表

serv_field_change_l共14

億資料,無論是資料匯入還是索引維護都是乙個漫長的過程,按照要求還不能影響生產。

我決定冒險一試,與局方討價還價的結果就是,我按照預定時間做操作,但是不能保證在預定時間完成,如果出現超時的情況,需要停止全省的歷史查詢功能,確保操作順利完成,最後局方妥協。

匯入技術點滴:

(1)

impdp

在匯入時會自動維護統計資訊和索引,但是其維護索引的速度比單獨建立索引效率低,故後面很多表都是先置索引失效然後再重建索引:

操作語句:

指當表存在時,資料庫幫浦只是附加資料

另外幾個需要注意的引數:

remap_schema

:當需要將乙個

schema

的資料匯入到另乙個

schema時,

需要只出原

schema

和新的schema

,不過貌似

impdp不

能在表名不同的表間導資料。

parallel

:原本想增加這個引數,開並行提高速度,但是加上後語句報「

dump

檔案無法找到」,狂暈

索引置失效語句:

alter index liomuser.idx_serv_field_change_lis unusable;

索引重建語句:

alter index liomuser.idx_serv_field_change_lis rebuild;

主鍵置失效語句:

alter table liomuser.serv_field_change_l

disable constraint pk_product_relation_i_p_lnj2;

主鍵恢復語句:

alter table liomuser.serv_field_change_l    enable constraint pk_serv_field_change_lis;

(2)歷史庫查詢庫和生產庫出現表結構不一致的情況,這個問題需要重視,已經給公司發了郵件。

(3)歷史查詢庫和當前生產庫的索引不一致情況,(歷史庫索引少),我的分析認為缺少的索引在歷史查詢中沒有用到,索引不需要和生產一致。

(4)匯入時間記錄:

以最大的表為例,

serv_field_change_l,

資料匯入:

2個小時

索引重建:

4個小時

主鍵恢復:

6個小時(該錶主鍵有

5個字段,瘋掉了!)

資料大小:

37g

歷史表總資料量:

14億條(每個中國人一條記錄,還有多的,暈!)

關於匯入環節的一點總結:1

、預留足夠多的時間,本次遷移時間非常緊張,出現了一些意料外的問題,另外

完成操作後一定要測試效能。 2

、實踐證明,將索引置失效再匯入資料,然後再重建索引,比利用資料庫幫浦維護

索引要快很多。 3、

在生產環境進行操作前,一定要比對錶結構和索引,對於差異的要補充,對於索引的差異,一定要考慮到遷移後資料量的變化對執行計畫的影響,完善和分析索引以及壓力測試是很必要的。 4、

生產庫清理,將已經歸檔的資料重生產環境清除:

實施策略:

(1)建立臨時表,原表名

_tmp

,將保留資料插入臨時表

(2)臨時表統計資訊採集

(3)將臨時表切換為生產表

注意事項:提取表的

ddl語句,建議最好使用

dbms_metadata

工具,因為在實際的操作中發現

plsql

提取的ddl

語句有不完整的地方

總結:遷移事關生產系統,一定要仔細規劃,提前固定好執行指令碼,做好測試工作,確保在執行中不用臨時修改,任何乙個引數的變動都會產生不可預期的後果。

規劃好時間,明確時間點和責任。

最後給出乙個比較有用的

sql,監控事務進度:

select username,

sid,

opname,

round(sofar * 100 / totalwork, 0) || '%' as progress,

time_remaining,

sql_text

from gv$session_longops, gv$sql

where time_remaining <> 0

and sql_address = address

and sql_hash_value = hash_value 其中

gv$session_longops

是oracle

的動態效能檢視,記錄執行超過

10s的事務執**況。

半年的工作心得與總結

眨眼間已經畢業半年,在這半年裡吃了好多苦,這些苦好多人也許都無法想像,現在覺得自己成熟了不少,為了適應,試圖著改掉了不少 毛病 但難以改變的還是自己的性格,不習慣那些場合中的阿諛逢迎和爾虞我詐,現在想想,也許我真的還沒有分清什麼是尊重,而什麼又是奉承。為了適應,在我認為是奉承的時候姑且想把它想象成是...

工作總結 基於R的資料分析

終於有那麼一丟丟時間,可以來把關於r語言程式設計的工作梳理一下。總體來說,工作內容主要是將公司已有的excel模板的資料分析內容轉為r語言形式,目前寫了四個產品的資料清洗和分析 在這中間,學習到了很多新知識。對接下來,程式設計之路的走向有了初步的規劃。對資料分析這塊也增加了認識吧。關於新知識 1 較...

GAN與NLP的結合相關資料彙總與總結

總結 目前嘗試的內容 純文字生成,詩歌生成,唐詩生成,機器翻譯,ir,中文分詞,文字分類 主要思路 考慮使用d進行真假判別,然後用rl的policy gradient的方式來打分和更新 使用word2vec之類的連續向量,微調之後不能代表乙個有意義的詞語,可以考慮取最近的點,但是存在bias,對於部...