一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)庫(kù)領(lǐng)域,尤其涉及一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法。
【背景技術(shù)】
[0002]在數(shù)據(jù)庫(kù)系統(tǒng)中,通常采用日志文件的方式,記錄數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行過程中的各種行為、事件,從而為系統(tǒng)性能分析、故障診斷、Bug排除、日志統(tǒng)計(jì)等提供基礎(chǔ)數(shù)據(jù)。然而,在高性能計(jì)算的場(chǎng)景下,開啟日志,會(huì)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的性能造成很大影響,尤其是在日志級(jí)別較高的情況下,短時(shí)間會(huì)產(chǎn)生大量日志數(shù)據(jù),而磁盤又是1最慢的設(shè)備,并且數(shù)據(jù)庫(kù)進(jìn)程并發(fā)寫入日志文件時(shí)需要用鎖來控制實(shí)現(xiàn)串行化,這些因素都導(dǎo)致了日志寫入會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)的性能急劇下降。如果不開啟日志,又無法記錄下詳細(xì)的信息,導(dǎo)致無法進(jìn)行性能診斷和故障分析。因此,會(huì)陷入兩難的狀態(tài)。
[0003]因此,數(shù)據(jù)庫(kù)系統(tǒng)需要提供高性能的日志寫入方法,并且不能對(duì)系統(tǒng)的性能產(chǎn)生過多的影響。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決的問題是提供一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,以滿足數(shù)據(jù)庫(kù)在線性能分析和故障診斷的要求。
[0005]為達(dá)到上述目的,本發(fā)明采用的技術(shù)方案是:一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,其特征在于,包括如下步驟:
[0006](I)啟動(dòng)Logd日志守護(hù)進(jìn)程,Logd日志守護(hù)進(jìn)程根據(jù)配置參數(shù),在共享內(nèi)存中初始化日志緩沖區(qū);
[0007](3)數(shù)據(jù)庫(kù)系統(tǒng)采用封裝的日志API將日志寫入共享內(nèi)存區(qū)域;
[0008](3)日志API采用無鎖數(shù)據(jù)結(jié)構(gòu)保存日志,從而支持多線程高并發(fā)寫入;
[0009](4) Logd將日志批量寫入日志文件;
[0010](5)數(shù)據(jù)庫(kù)進(jìn)程異常崩潰或者正常退出,共享內(nèi)存中的日志依然存在,不丟失。
[0011]進(jìn)一步的,所述步驟(2)具體實(shí)現(xiàn)方式為:
[0012]日志API定位Logd初始化的共享內(nèi)存日志緩沖區(qū),確定下次寫日志的內(nèi)存位置,數(shù)據(jù)庫(kù)進(jìn)行調(diào)用API寫入日志時(shí),API把日志信息寫入共享內(nèi)存區(qū)域。
[0013]進(jìn)一步的,所述步驟(4)中,Logd通過定時(shí)或者是事件觸發(fā)方式將日志批量寫入日志文件。
[0014]進(jìn)一步的,所述步驟(5)的實(shí)現(xiàn)方式為:
[0015]數(shù)據(jù)庫(kù)進(jìn)程崩潰而重啟后,再次寫入日志時(shí),日志API定位共享內(nèi)存中的logbuffer時(shí),找到上次寫入的位置,并校驗(yàn)上次日志數(shù)據(jù)寫入的完整性,如日志寫入完整,則在此位置繼續(xù)寫入,從而保證進(jìn)程崩潰的情況下日志不丟失。
[0016]本發(fā)明的有益效果是:能顯著提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志的性能,對(duì)數(shù)據(jù)庫(kù)本身的計(jì)算性能無影響,可以在線開啟高級(jí)別日志,捕獲大量日志信息,從而可以進(jìn)行詳細(xì)的問題診斷和分析。
【附圖說明】
[0017]圖1數(shù)據(jù)庫(kù)傳統(tǒng)寫日志方法的示意圖;
[0018]圖2是本發(fā)明數(shù)據(jù)庫(kù)寫日志方法的示意圖;
[0019]圖3是本發(fā)明方法實(shí)施的流程圖;
[0020]圖4是本發(fā)明方法的交互序列圖。。
【具體實(shí)施方式】
[0021]下面結(jié)合附圖和【具體實(shí)施方式】對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。
[0022]如圖1所示,傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)日志方法為通過API函數(shù)直接寫本地日志。
[0023]如圖2所示為本發(fā)明的數(shù)據(jù)庫(kù)進(jìn)程寫日志的結(jié)構(gòu)。
[0024]實(shí)施過程的流程圖如圖3所示。具體實(shí)施過程為:
[0025](I)數(shù)據(jù)庫(kù)進(jìn)程采用API進(jìn)行代碼編譯鏈接,生成可執(zhí)行文件;
[0026](2)啟動(dòng)Logd日志守護(hù)進(jìn)程。Logd日志守護(hù)進(jìn)程會(huì)根據(jù)配置參數(shù),在共享內(nèi)存中初始化日志緩沖區(qū),同時(shí)打開磁盤的日志文件,移動(dòng)到日志文件的尾部,用于新日志的寫入。功能內(nèi)存的日志區(qū)域大小、磁盤日志文件個(gè)數(shù)、大小都可以通過1gd的參數(shù)配置來實(shí)現(xiàn)。
[0027](3)啟動(dòng)數(shù)據(jù)庫(kù)進(jìn)程。數(shù)據(jù)庫(kù)進(jìn)程通過API定位1gd初始化的共享內(nèi)存日志緩沖區(qū),確定下次寫日志的內(nèi)存位置。數(shù)據(jù)庫(kù)進(jìn)行調(diào)用API寫入日志時(shí),API會(huì)把日志信息寫入共享內(nèi)存區(qū)域。
[0028](4)數(shù)據(jù)庫(kù)進(jìn)程通過API高速向共享內(nèi)存寫入日志。日志API采用無鎖數(shù)據(jù)結(jié)構(gòu),并行將日志信息放入共享內(nèi)存中;為了提高多線程并發(fā)寫入的性能,日志API采用無鎖的數(shù)據(jù)結(jié)構(gòu),并保證日志記錄的完整性。
[0029](5) Logd通過定時(shí)或者是事件觸發(fā)方式,將日志從Log buffer寫入Log file。Logd監(jiān)測(cè)共享內(nèi)存中的日志數(shù)據(jù),日志數(shù)據(jù)超過預(yù)設(shè)的閾值時(shí)會(huì)觸發(fā)寫日志動(dòng)作,Logd將日志批量寫入日志文件。
[0030](6)數(shù)據(jù)庫(kù)進(jìn)程異常崩潰或者正常退出,共享內(nèi)存中的日志依然存在,不丟失。數(shù)據(jù)庫(kù)進(jìn)程崩潰而重啟后,再次寫入日志時(shí),日志API定位共享內(nèi)存中的log buffer時(shí),會(huì)找到上次寫入的位置,并校驗(yàn)上次日志數(shù)據(jù)寫入的完整性,如日志寫入完整,則在此位置繼續(xù)寫入,從而保證進(jìn)程崩潰的情況下日志不丟失。
[0031](7)下次數(shù)據(jù)庫(kù)進(jìn)程啟動(dòng),Log API重新定位Log buffer,確定寫Log的位置和相關(guān)參數(shù)。
[0032]以上對(duì)本發(fā)明的實(shí)施例進(jìn)行了詳細(xì)說明,但所述內(nèi)容僅為本發(fā)明的較佳實(shí)施例,不能被認(rèn)為用于限定本發(fā)明的實(shí)施范圍。凡依本發(fā)明范圍所作的均等變化與改進(jìn)等,均應(yīng)仍歸屬于本專利涵蓋范圍之內(nèi)。
【主權(quán)項(xiàng)】
1.一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,其特征在于,包括如下步驟: (1)啟動(dòng)Logd日志守護(hù)進(jìn)程,Logd日志守護(hù)進(jìn)程根據(jù)配置參數(shù),在共享內(nèi)存中初始化日志緩沖區(qū); (2)數(shù)據(jù)庫(kù)系統(tǒng)采用封裝的日志API將日志寫入共享內(nèi)存區(qū)域; (3)日志API采用無鎖數(shù)據(jù)結(jié)構(gòu)保存日志,從而支持多線程高并發(fā)寫入; (4)Logd將日志批量寫入日志文件; (5)數(shù)據(jù)庫(kù)進(jìn)程異常崩潰或者正常退出,共享內(nèi)存中的日志依然存在,不丟失。
2.根據(jù)權(quán)利要求1所述的一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,其特征在于:所述步驟(2)具體實(shí)現(xiàn)方式為: 日志API定位Logd初始化的共享內(nèi)存日志緩沖區(qū),確定下次寫日志的內(nèi)存位置,數(shù)據(jù)庫(kù)進(jìn)行調(diào)用API寫入日志時(shí),API把日志信息寫入共享內(nèi)存區(qū)域。
3.根據(jù)權(quán)利要求1所述的一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,其特征在于:所述步驟(4)中,Logd通過定時(shí)或者是事件觸發(fā)方式將日志批量寫入日志文件。
4.根據(jù)權(quán)利要求1所述的一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,其特征在于:所述步驟(5)的實(shí)現(xiàn)方式為: 數(shù)據(jù)庫(kù)進(jìn)程崩潰而重啟后,再次寫入日志時(shí),日志API定位共享內(nèi)存中的log buffer時(shí),找到上次寫入的位置,并校驗(yàn)上次日志數(shù)據(jù)寫入的完整性,如日志寫入完整,則在此位置繼續(xù)寫入,從而保證進(jìn)程崩潰的情況下日志不丟失。
【專利摘要】本發(fā)明提供一種提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志性能的方法,所述的方法包括:將數(shù)據(jù)庫(kù)系統(tǒng)寫日志的接口,從直接寫文件變成寫共享內(nèi)存;采用無鎖數(shù)據(jù)結(jié)構(gòu),支持多線程并行寫入;獨(dú)立的Logd進(jìn)程,定期或者溢出觸發(fā)方式,將共享內(nèi)存中的日志數(shù)據(jù)批量寫入日志文件。數(shù)據(jù)庫(kù)進(jìn)程崩潰而重啟后,日志API會(huì)尋找共享內(nèi)存中上次寫入的位置,從而繼續(xù)寫入。本發(fā)明能夠提高數(shù)據(jù)庫(kù)系統(tǒng)寫日志的性能,并且對(duì)系統(tǒng)的性能無影響。
【IPC分類】G06F17-30
【公開號(hào)】CN104537074
【申請(qǐng)?zhí)枴緾N201410847869
【發(fā)明人】孔德生, 崔維力, 武新
【申請(qǐng)人】天津南大通用數(shù)據(jù)技術(shù)股份有限公司
【公開日】2015年4月22日
【申請(qǐng)日】2014年12月31日