本發(fā)明屬于數(shù)據(jù)庫(kù),涉及一種基于數(shù)據(jù)庫(kù)的top?sql數(shù)據(jù)智能管理方法及系統(tǒng)。
背景技術(shù):
1、數(shù)據(jù)庫(kù)是許多業(yè)務(wù)系統(tǒng)的核心組件,在日常運(yùn)維過(guò)程中,用戶(hù)非常關(guān)注top?sql變化情況。一般情況下,每天相同時(shí)段的top?sql應(yīng)該是一樣的,當(dāng)發(fā)現(xiàn)top?sql排行榜發(fā)生變化時(shí),就需要引起dba的關(guān)注,但是一般客戶(hù)系統(tǒng)中存在大量數(shù)據(jù)庫(kù),不同數(shù)據(jù)庫(kù)承載的業(yè)務(wù)不同,因?yàn)閷?duì)數(shù)據(jù)庫(kù)的負(fù)載或者性能要求不同,支持對(duì)不同數(shù)據(jù)庫(kù)進(jìn)行不同的top?sql分析也是非常重要的。目前對(duì)于oracle性能分析的方案一般是查看awr性能報(bào)告,但是性能報(bào)告數(shù)據(jù)指標(biāo)繁多,通過(guò)人工查找,費(fèi)時(shí)費(fèi)力,很難快速找找有問(wèn)題的sql。
技術(shù)實(shí)現(xiàn)思路
1、本發(fā)明的目的在于解決現(xiàn)有技術(shù)中人工查找性能報(bào)告數(shù)據(jù)費(fèi)時(shí)費(fèi)力,很難快速找找有問(wèn)題的sql的問(wèn)題,提供一種基于數(shù)據(jù)庫(kù)的top?sql數(shù)據(jù)智能管理方法及系統(tǒng)。
2、為達(dá)到上述目的,本發(fā)明采用以下技術(shù)方案予以實(shí)現(xiàn):
3、基于數(shù)據(jù)庫(kù)的top?sql數(shù)據(jù)智能管理方法,包括:
4、對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,并從數(shù)據(jù)庫(kù)的應(yīng)用程序配置文件中采集top?sql;
5、將所采集的top?sql按照時(shí)間的累計(jì)進(jìn)行聚類(lèi);
6、將聚類(lèi)的top?sql數(shù)據(jù)根據(jù)預(yù)設(shè)的指標(biāo),存儲(chǔ)在基線(xiàn)表中;
7、對(duì)基線(xiàn)表中數(shù)據(jù)進(jìn)行清洗,識(shí)別出全新top?sql和衰變top?sql。
8、本發(fā)明的進(jìn)一步改進(jìn)在于:
9、進(jìn)一步的,對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,并從數(shù)據(jù)庫(kù)的應(yīng)用程序配置文件中采集top?sql,具體為:在應(yīng)用程序配置文件中設(shè)定固定的時(shí)間頻率對(duì)位于排名前n位的top?sql進(jìn)行采集。
10、進(jìn)一步的,將所采集的top?sql按照時(shí)間的累計(jì)進(jìn)行聚類(lèi),具體為:將按照固定的時(shí)間頻率采集的top?sql進(jìn)行存儲(chǔ),同時(shí)將所存儲(chǔ)的top?sql按照時(shí)間頻率的倍數(shù)進(jìn)行聚合,得到不同的時(shí)長(zhǎng)記錄聚合數(shù)據(jù),分別命名為:tbl_xxxxx_sqlstats1,tbl_xxxxx_sqlstats10,tbl_xxxxx_sqlstats60等,其中,xxxxx表示數(shù)據(jù)庫(kù)實(shí)例唯一標(biāo)識(shí)id;將同一數(shù)據(jù)庫(kù)實(shí)例唯一標(biāo)識(shí)id存儲(chǔ)在同一個(gè)表中。
11、進(jìn)一步的,將聚類(lèi)的top?sql數(shù)據(jù)根據(jù)預(yù)設(shè)的指標(biāo),存儲(chǔ)在基線(xiàn)表中,具體為:將固定的時(shí)長(zhǎng)記錄聚合數(shù)據(jù)的top?sql中識(shí)別預(yù)設(shè)的指標(biāo)存儲(chǔ)到基線(xiàn)表中,關(guān)鍵指標(biāo)包括sql語(yǔ)句的唯一標(biāo)識(shí)符sql_id、會(huì)話(huà)的唯一標(biāo)識(shí)符con_id、累計(jì)值total、行號(hào)rn、從數(shù)據(jù)庫(kù)緩沖區(qū)緩存中獲取的邏輯讀次數(shù)buffer_gets、sql語(yǔ)句的執(zhí)行次數(shù)executions、sql語(yǔ)句執(zhí)行的總耗時(shí)elapsed_time、sql執(zhí)行計(jì)劃的哈希值plan_hash_value、采集時(shí)間和mintop;所述mintop為每個(gè)10分鐘內(nèi)出現(xiàn)次數(shù)最多的記錄。
12、進(jìn)一步的,在對(duì)基線(xiàn)表中數(shù)據(jù)進(jìn)行清洗之前,還包括:設(shè)定基線(xiàn)歷史數(shù)據(jù)天數(shù)閾值,若基線(xiàn)表中的數(shù)據(jù)不超過(guò)設(shè)定的基線(xiàn)歷史數(shù)據(jù)天數(shù)閾值,則不對(duì)基線(xiàn)表中的數(shù)據(jù)進(jìn)行清洗。
13、進(jìn)一步的,基線(xiàn)表中數(shù)據(jù)進(jìn)行清洗,具體為:
14、步驟1:設(shè)定全新top?sql查詢(xún)數(shù)據(jù)時(shí)sql執(zhí)行的total數(shù)量閾值和衰變top?sql查詢(xún)數(shù)據(jù)時(shí)sql執(zhí)行的total數(shù)量閾值;
15、步驟2:當(dāng)基線(xiàn)表中的數(shù)據(jù)超過(guò)設(shè)定的基線(xiàn)歷史數(shù)據(jù)天數(shù)閾值;判斷指定時(shí)間段內(nèi)的top?sql性能指標(biāo)數(shù)據(jù)是否存在大于衰變top?sql查詢(xún)數(shù)據(jù)時(shí)sql執(zhí)行的total數(shù)量閾值的top?sql,如果存在;則進(jìn)行步驟3;
16、步驟3:根據(jù)步驟2查詢(xún)到的sql_id列表繼續(xù)查詢(xún)buffer_gets、executions、elapsed_time、plan_hash_value性能指標(biāo)數(shù)據(jù),對(duì)指標(biāo)結(jié)果數(shù)據(jù)進(jìn)行數(shù)據(jù)處理,去掉值不存在的記錄,剩下的數(shù)據(jù)按照sql_id、plan_hash_value和con_id分組,分組后每?jī)蓚€(gè)記錄計(jì)算差值并對(duì)差值進(jìn)行求和,得到指定時(shí)間段內(nèi)處理后的top?sql性能指標(biāo)數(shù)據(jù);
17、步驟4:獲取指定時(shí)間段對(duì)應(yīng)的小時(shí)范圍,查詢(xún)同時(shí)段的基線(xiàn)數(shù)據(jù),進(jìn)行對(duì)比;
18、步驟5:根據(jù)步驟2查詢(xún)到的sql_id列表以及步驟4得到的小時(shí)范圍作為參數(shù),查詢(xún)基線(xiàn)中同時(shí)段重要的性能指標(biāo)數(shù)據(jù),sql_id,con_id,total,rn,buffer_gets,executions,elapsed_time,plan_hash_value,采集時(shí)間和mintop,buffer_gets_perexe,elapsed_time_perexe,如果基線(xiàn)數(shù)據(jù)存在,繼續(xù)下一步驟,否則,則沒(méi)有全新top?sql/衰變top?sql;
19、步驟6:指定時(shí)間段top?sql的sql_id加?con_id與基線(xiàn)數(shù)據(jù)進(jìn)行對(duì)比,如果sql_id加con_id不存在基線(xiàn)中且sql出現(xiàn)的次數(shù)大于設(shè)定全新top?sql查詢(xún)數(shù)據(jù)時(shí)sql執(zhí)行的total數(shù)量閾值,表示該sql_id加con_id是全新top?sql,否則,繼續(xù)下一步驟;
20、步驟7:若步驟6中表示是衰變的top?sql,則計(jì)算相同sql_id加con_id下的percent90buffergets和percent90elapsedtime,得到該sql語(yǔ)句的性能在大多數(shù)情況下對(duì)緩沖區(qū)的需求和執(zhí)行所需的時(shí)間;其中,percent90buffergets?是一個(gè)衡量sql語(yǔ)句在數(shù)據(jù)庫(kù)中緩沖區(qū)獲取操作的指標(biāo);在所有執(zhí)行該sql語(yǔ)句的會(huì)話(huà)中,有90%的會(huì)話(huà)所獲取的緩沖區(qū)數(shù)量不超過(guò)對(duì)應(yīng)的特定值;percent90elapsedtime是另一個(gè)性能分析指標(biāo),關(guān)注的是sql語(yǔ)句的執(zhí)行時(shí)間;這個(gè)指標(biāo)表示在所有執(zhí)行該sql語(yǔ)句的會(huì)話(huà)中,有90%的會(huì)話(huà)的執(zhí)行時(shí)間不超過(guò)對(duì)應(yīng)的特定值;
21、步驟8:指定時(shí)間段top?sql的執(zhí)行計(jì)劃plan_hash_value對(duì)比基線(xiàn)數(shù)據(jù)中的執(zhí)行計(jì)劃,如果不在基線(xiàn)中存在的表示執(zhí)行計(jì)劃發(fā)生變化,返回變化的執(zhí)行計(jì)劃列表。
22、進(jìn)一步的,識(shí)別出全新top?sql和衰變top?sql,還包括:
23、針對(duì)每個(gè)數(shù)據(jù)庫(kù)的業(yè)務(wù)情況,支持配置閾值規(guī)則,配置如下所示:
24、是否開(kāi)啟top?sql變化監(jiān)控,如果關(guān)閉,則不會(huì)進(jìn)行全新top?sql/衰變top?sql識(shí)別?;
25、設(shè)置時(shí)間段,未設(shè)置的時(shí)間段不會(huì)進(jìn)行全新top?sql/衰變top?sql識(shí)別;
26、設(shè)置top?sql分析范圍,對(duì)位于設(shè)置的排名內(nèi)的top?sql進(jìn)行分析變化;
27、設(shè)置top?sql分析時(shí)段,表示top?sql計(jì)算基線(xiàn)的數(shù)據(jù)范圍;
28、top?sql變化閾值設(shè)置,包含2個(gè)條件:
29、條件1:判斷數(shù)據(jù)庫(kù)負(fù)載百分比閾值、gets?per?exec(s)增長(zhǎng)百分比閾值、增長(zhǎng)量閾值是否大于各自所設(shè)定的閾值;
30、數(shù)據(jù)庫(kù)負(fù)載百分比閾值表示數(shù)據(jù)庫(kù)的負(fù)載必須大于當(dāng)前設(shè)置,才會(huì)進(jìn)行全新topsql和衰變top?sql的識(shí)別,否則認(rèn)為數(shù)據(jù)庫(kù)運(yùn)行狀態(tài)良好,不需要關(guān)注;
31、gets?per?exec(s)增長(zhǎng)百分比閾值表示指定時(shí)間范圍內(nèi)的top?sql的增幅大于設(shè)置的閾值,則判斷發(fā)生衰變;
32、增長(zhǎng)量閾值表示增長(zhǎng)量大于設(shè)置的閾值,則判斷發(fā)生衰變;
33、條件2:判斷elapsed?time?per?exec(s)增長(zhǎng)百分比閾值、增長(zhǎng)值(s)閾值、執(zhí)行計(jì)劃發(fā)生變更是否超過(guò)各自的閾值條件;
34、elapsed?time?per?exec(s)增長(zhǎng)百分比閾值表示指定時(shí)間范圍內(nèi)的top?sql的執(zhí)行時(shí)間增幅大于設(shè)置的閾值,則判斷發(fā)生衰變;
35、增長(zhǎng)值(s)閾值表示執(zhí)行時(shí)間的增長(zhǎng)量大于設(shè)置的閾值,則判斷發(fā)生衰變;
36、執(zhí)行計(jì)劃發(fā)生變更表示當(dāng)top?sql的執(zhí)行計(jì)劃發(fā)生變化時(shí),則判斷發(fā)生衰變。
37、進(jìn)一步的,數(shù)據(jù)庫(kù)負(fù)載百分比的計(jì)算方式為:
38、db?time/elapsedtime/cpu核心數(shù)*?100%
39、所述gets?per?exec增長(zhǎng)量的計(jì)算方式為:
40、buffer_gets_perexe?-?percent90buffergets
41、所述gets?per?exec增幅的計(jì)算方式為:
42、(buffer_gets_perexe?-?percent90buffergets)/?percent90buffergets?*100%
43、所述elapsed?time?per?exec增長(zhǎng)量的計(jì)算方式為:
44、elapsed_time?-?percent90buffergets
45、所述elapsed?time?per?exec增幅的計(jì)算方式為:
46、(elapsed_time?-?percent90buffergets)*?100%
47、其中,db?time為數(shù)據(jù)庫(kù)時(shí)間;elapsed?time為數(shù)據(jù)庫(kù)從操作開(kāi)始到操作完成所經(jīng)過(guò)的總時(shí)間;buffer_gets_perexe為數(shù)據(jù)庫(kù)在每次執(zhí)行時(shí)的緩沖區(qū)獲取數(shù)。
48、進(jìn)一步的,識(shí)別出全新top?sql和衰變top?sql之后,還包括:清理過(guò)期數(shù)據(jù);所述清理過(guò)期數(shù)據(jù)包括:設(shè)置top?sql基線(xiàn)數(shù)據(jù)保留天數(shù)、清理任務(wù)開(kāi)始時(shí)間、情況任務(wù)結(jié)束時(shí)間、同時(shí)并發(fā)清理實(shí)例數(shù)、單個(gè)實(shí)例清理失敗時(shí)重試次數(shù)、重試間隔、sqlstats、sqltext、sqlplan數(shù)據(jù)保留時(shí)間;當(dāng)清理過(guò)期數(shù)據(jù)的指令符合所設(shè)置的條件,對(duì)過(guò)期數(shù)據(jù)進(jìn)行清理。
49、基于數(shù)據(jù)庫(kù)的top?sql數(shù)據(jù)智能管理系統(tǒng),包括:
50、采集模塊,所述采集模塊對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,并從數(shù)據(jù)庫(kù)的應(yīng)用程序配置文件中采集top?sql;
51、聚類(lèi)模塊,所述聚類(lèi)模塊將所采集的top?sql按照時(shí)間的累計(jì)進(jìn)行聚類(lèi);
52、存儲(chǔ)模塊,所述存儲(chǔ)模塊將聚類(lèi)的top?sql數(shù)據(jù)根據(jù)預(yù)設(shè)的指標(biāo),存儲(chǔ)在基線(xiàn)表中;
53、清洗模塊,所述清洗模塊對(duì)基線(xiàn)表中數(shù)據(jù)進(jìn)行清洗,識(shí)別出全新top?sql和衰變top?sql。
54、與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
55、本發(fā)明通過(guò)判斷top?sql是否滿(mǎn)足在基線(xiàn)表中所配置的閾值條件,能夠快速識(shí)別全新top?sql和衰變top?sql,同時(shí)可根據(jù)數(shù)據(jù)庫(kù)業(yè)務(wù)不同配置不同的閾值,對(duì)全新top?sql和衰變top?sql進(jìn)行識(shí)別,且系統(tǒng)產(chǎn)生的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)合理,且有完善的數(shù)據(jù)清理機(jī)制,確保業(yè)務(wù)可持續(xù)穩(wěn)定的運(yùn)行。