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