一種處理數(shù)據(jù)庫(kù)日志的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及一種處理數(shù)據(jù)庫(kù)日志的方法及裝置。
【背景技術(shù)】
[0002]當(dāng)前數(shù)據(jù)庫(kù)技術(shù)中,重做(redo)日志提供了一個(gè)對(duì)未寫(xiě)入數(shù)據(jù)庫(kù)磁盤(pán)的數(shù)據(jù)的進(jìn)行重做的基礎(chǔ)。當(dāng)數(shù)據(jù)庫(kù)更新提交的時(shí)候,數(shù)據(jù)并不會(huì)即時(shí)寫(xiě)入到磁盤(pán)的數(shù)據(jù)文件中,而是保存在內(nèi)存當(dāng)中,這就需要通過(guò)redo日志來(lái)對(duì)該次數(shù)據(jù)庫(kù)更新提供一種持久化的支持,避免在故障的情況下,由于內(nèi)存數(shù)據(jù)的丟失而導(dǎo)致數(shù)據(jù)丟失。
[0003]現(xiàn)有技術(shù)中,通常通過(guò)將數(shù)據(jù)庫(kù)更新的動(dòng)作記錄在redo日志中來(lái)避免要求每次的數(shù)據(jù)庫(kù)更新寫(xiě)入數(shù)據(jù)文件,從而提高數(shù)據(jù)庫(kù)更新的性能;傳統(tǒng)的數(shù)據(jù)庫(kù)大多采用循環(huán)的重做日志緩沖區(qū)(redo buffer)的形式來(lái)順序存儲(chǔ)redo日志,之后在合適的時(shí)刻把buffer中的數(shù)據(jù)追加到磁盤(pán)上的redo文件中進(jìn)行持久化存儲(chǔ),日志刷出后buffer可以重用,這樣在redo日志的寫(xiě)入上通過(guò)設(shè)置redo日志的緩沖,可減少redo日志寫(xiě)入磁盤(pán)的頻率;而撤消日志(undo log)記錄了數(shù)據(jù)庫(kù)變更前的狀態(tài),能夠把所有沒(méi)有提交(commit)的事務(wù)回滾到事務(wù)開(kāi)始前的狀態(tài)。同時(shí),系統(tǒng)崩潰時(shí),可能有些事務(wù)還沒(méi)有commit,在系統(tǒng)恢復(fù)時(shí),這些沒(méi)有commit的事務(wù)就需要借助undo log來(lái)進(jìn)行回滾。傳統(tǒng)的數(shù)據(jù)庫(kù)大多采用與數(shù)據(jù)頁(yè)一樣的存儲(chǔ)方式來(lái)存儲(chǔ)undo日志。但是這樣所有的redo都統(tǒng)一存儲(chǔ)在redo buffer中,在大并發(fā)下redo buffer成為了沖突熱點(diǎn),制約了數(shù)據(jù)庫(kù)的可擴(kuò)展性;且redo需要持久化存儲(chǔ)在磁盤(pán)上,在事務(wù)提交時(shí)需要將日志刷新到磁盤(pán),此時(shí)會(huì)影響事務(wù)提交性能,尤其當(dāng)redo日志和數(shù)據(jù)存儲(chǔ)在同一塊磁盤(pán)上,對(duì)磁盤(pán)的爭(zhēng)搶更為激烈,這對(duì)數(shù)據(jù)庫(kù)性能有巨大影響;而undo日志與數(shù)據(jù)存儲(chǔ)處理一致,同樣造成了一定程度的存儲(chǔ)空間浪費(fèi)和磁盤(pán)競(jìng)爭(zhēng)。
【發(fā)明內(nèi)容】
[0004]本發(fā)明實(shí)施例所要解決的技術(shù)問(wèn)題在于,提供一種處理數(shù)據(jù)庫(kù)日志的方法及裝置。以解決數(shù)據(jù)庫(kù)日志操作的熱點(diǎn)爭(zhēng)用和磁盤(pán)爭(zhēng)用的問(wèn)題。
[0005]為了解決上述技術(shù)問(wèn)題,本發(fā)明實(shí)施例第一方面提供了一種處理數(shù)據(jù)庫(kù)日志的方法,包括:
[0006]將按照數(shù)據(jù)版本變更先后順序生成的日志保存在非易失存儲(chǔ)器中,其中,所述日志包括事務(wù)狀態(tài)表、元數(shù)據(jù)文件及日志文件,所述事務(wù)狀態(tài)表用于記錄各個(gè)事務(wù)的狀態(tài),所述元數(shù)據(jù)文件用于記錄事務(wù)對(duì)應(yīng)的日志的位置以及下一個(gè)日志記錄的位置,所述日志文件用于記錄數(shù)據(jù)的變更版本;
[0007]當(dāng)恢復(fù)內(nèi)存中的數(shù)據(jù)時(shí),根據(jù)所述日志中事務(wù)狀態(tài)表的事務(wù)提交順序,使用事務(wù)提交后的日志文件版本對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行恢復(fù)。
[0008]在第一方面的第一種可能的實(shí)現(xiàn)方式中,在所述恢復(fù)內(nèi)存中的數(shù)據(jù)之前,還包括:
[0009]標(biāo)記事務(wù)的操作類型,所述操作類型包括回滾和提交。
[0010]結(jié)合第一方面或結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述將按照數(shù)據(jù)版本變更先后順序生成的日志保存在非易失存儲(chǔ)器中,包括:
[0011]當(dāng)數(shù)據(jù)更新時(shí),生成新版本的日志文件;
[0012]判斷新版本的日志文件對(duì)應(yīng)的歷史版本日志文件是否可見(jiàn);
[0013]若所述新版本的日志文件對(duì)應(yīng)的歷史版本日志文件不可見(jiàn),則保存所述新版本的日志文件;
[0014]若所述新版本的日志文件對(duì)應(yīng)的歷史版本日志文件可見(jiàn),則進(jìn)一步判斷所述新版本的日志文件是否為最后一條日志文件;
[0015]若所述新版本的日志文件是最后一條日志文件,則保存所述新版本的日志文件;
[0016]若所述新版本的日志文件不是最后一條日志文件,則清理所述新版本的日志文件。
[0017]結(jié)合第一方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,在將按照數(shù)據(jù)版本變更先后順序生成的日志保存在非易失存儲(chǔ)器中之后,還包括:
[0018]根據(jù)預(yù)設(shè)周期定期清理所述日志文件中的至少一個(gè)歷史變更版本或者清理除最后一條日志文件之外的其他日志文件。
[0019]結(jié)合第一方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述當(dāng)恢復(fù)內(nèi)存中的數(shù)據(jù)時(shí),根據(jù)所述日志中事務(wù)狀態(tài)表的事務(wù)提交順序,使用事務(wù)提交后的日志文件版本對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行恢復(fù),包括:
[0020]讀取所述非易失存儲(chǔ)器中的日志;
[0021 ] 讀取所述日志中的事務(wù)狀態(tài)表;
[0022]根據(jù)所述日志中事務(wù)狀態(tài)表的事務(wù)提交順序,使用事務(wù)提交后的日志文件版本對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行恢復(fù)。
[0023]本發(fā)明實(shí)施例第二方面提供了一種處理處理數(shù)據(jù)庫(kù)日志的裝置,包括:
[0024]保存單元,用于將按照數(shù)據(jù)版本變更先后順序生成的日志保存在非易失存儲(chǔ)器中,其中,所述日志包括事務(wù)狀態(tài)表、元數(shù)據(jù)文件及日志文件,所述事務(wù)狀態(tài)表用于記錄各個(gè)事務(wù)的狀態(tài),所述元數(shù)據(jù)文件用于記錄事務(wù)對(duì)應(yīng)的日志的位置以及下一個(gè)日志記錄的位置,所述日志文件用于記錄數(shù)據(jù)的變更版本;
[0025]恢復(fù)單元,用于當(dāng)恢復(fù)內(nèi)存中的數(shù)據(jù)時(shí),根據(jù)所述日志中事務(wù)狀態(tài)表的事務(wù)提交順序,使用事務(wù)提交后的日志文件版本對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行恢復(fù)。
[0026]在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述裝置還包括:
[0027]標(biāo)記單元,用于標(biāo)記事務(wù)的操作類型,所述操作類型包括回滾和提交。
[0028]結(jié)合第二方面或結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述保存單元具體用于:
[0029]當(dāng)數(shù)據(jù)更新時(shí),生成新版本的日志文件;
[0030]判斷新版本的日志文件對(duì)應(yīng)的歷史版本日志文件是否可見(jiàn);
[0031 ] 若所述新版本的日志文件對(duì)應(yīng)的歷史版本日志文件不可見(jiàn),則保存所述新版本的日志文件;
[0032]若所述新版本的日志文件對(duì)應(yīng)的歷史版本日志文件可見(jiàn),則進(jìn)一步判斷所述新版本的日志文件是否為最后一條日志文件;
[0033]若所述新版本的日志文件是最后一條日志文件,則保存所述新版本的日志文件;
[0034]若所述新版本的日志文件不是最后一條日志文件,則清理所述新版本的日志文件。
[0035]結(jié)合第二方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述裝置還包括:
[0036]清理單元,用于根據(jù)預(yù)設(shè)周期定期清理所述日志文件中的至少一個(gè)歷史變更版本或者清理除最后一條日志文件之外的其他日志文件。
[0037]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述恢復(fù)單元具體用于:
[0038]讀取所述非易失存儲(chǔ)器中的日志;
[0039]讀取所述日志中的事務(wù)狀態(tài)表;
[0040]根據(jù)所述日志中事務(wù)狀態(tài)表的事務(wù)提交順序,使用事務(wù)提交后的日志文件版本對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行恢復(fù)。
[0041]實(shí)施本發(fā)明實(shí)施例,具有如下有益效果:
[0042]通過(guò)利用NVM的特性,按照數(shù)據(jù)版本變更先后順序存儲(chǔ)對(duì)應(yīng)的日志,使得該日志可同時(shí)用來(lái)支持undo和redo日志的功能;且通過(guò)將日志以歷史版本的形式組織起來(lái),這種分布式的組織形式,可消除了并發(fā)沖突熱點(diǎn),提高了系統(tǒng)的性能,同時(shí)也解決了常規(guī)日志操作熱點(diǎn)爭(zhēng)用的問(wèn)題,提升了數(shù)據(jù)操作的并發(fā)性;而在日志操作的磁盤(pán)爭(zhēng)用問(wèn)題上,也提升了數(shù)據(jù)操作的性能和并發(fā)性。
【附圖說(shuō)明】
[0043]為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0044]圖1是本發(fā)明實(shí)施例一種處理數(shù)據(jù)庫(kù)日志的方法的流程示意圖;
[0045]圖2是本發(fā)明實(shí)施例一種處理數(shù)據(jù)庫(kù)日志的方法中更新日志的流程示意圖;
[0046]圖3是本發(fā)明實(shí)施例一種處理數(shù)據(jù)庫(kù)日志的方法中恢復(fù)數(shù)據(jù)的流程示意圖;
[0047]圖4是本發(fā)明實(shí)施例一種處理數(shù)據(jù)庫(kù)日志的裝置的組成示意圖;
[0048]圖5是本發(fā)明實(shí)施例另一種處理數(shù)據(jù)庫(kù)日志的裝置的組成示意圖;
[0049]圖6是本發(fā)明實(shí)施例另一種處理數(shù)據(jù)庫(kù)日志的裝置的組成示意圖。
【具體實(shí)施方式】
[0050]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。<