專利名稱::一種混合日志生成方法和解析方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及內(nèi)存數(shù)據(jù)庫(kù)領(lǐng)域,尤其涉及一種內(nèi)存數(shù)據(jù)庫(kù)的混合日志生成方法和解析方法。
背景技術(shù):
:現(xiàn)代通信對(duì)計(jì)算機(jī)技術(shù)依賴性越來越強(qiáng),在電信運(yùn)營(yíng)商的不斷發(fā)展中,建立起各類信息系統(tǒng),包括運(yùn)營(yíng)網(wǎng)絡(luò)系統(tǒng)、綜合營(yíng)帳系統(tǒng)、計(jì)費(fèi)系統(tǒng)、辦公自動(dòng)化系統(tǒng)等等,這些系統(tǒng)積累了海量的有價(jià)值的數(shù)據(jù)資料,通過對(duì)這些資料進(jìn)行數(shù)據(jù)挖掘、查詢分析和聯(lián)機(jī)分析,可以識(shí)別市場(chǎng)機(jī)會(huì)、制定市場(chǎng)策略。但是,這些數(shù)據(jù)資料過于龐大了,記錄條數(shù)動(dòng)輒以億計(jì),如短信系統(tǒng),每秒需要存儲(chǔ)成千上萬條用戶信息。對(duì)于如此龐大的數(shù)據(jù)量,傳統(tǒng)的基于磁盤的數(shù)據(jù)庫(kù)管理系統(tǒng)越來越難以應(yīng)付,于是,業(yè)界提出了內(nèi)存數(shù)據(jù)庫(kù)技術(shù)以及內(nèi)存數(shù)據(jù)庫(kù)管理系統(tǒng)(MainMemoryDatabaseManagementSystem,以下簡(jiǎn)稱MMDBMS)。內(nèi)存數(shù)據(jù)庫(kù),即將數(shù)據(jù)放在內(nèi)存中直接操作的數(shù)據(jù)庫(kù)。內(nèi)存數(shù)據(jù)庫(kù)管理系統(tǒng)在內(nèi)存中管理整個(gè)數(shù)據(jù)庫(kù)或者數(shù)據(jù)庫(kù)的一部分,所以可以直接訪問數(shù)據(jù)而不用訪問磁盤。從而,內(nèi)存數(shù)據(jù)庫(kù)就具有了高性能的事務(wù)處理能力。然而,由于內(nèi)存本身具有易失性的特點(diǎn),即一旦掉電或者發(fā)生故障,數(shù)據(jù)就會(huì)全部丟失,造成商用系統(tǒng)不可彌補(bǔ)的損失。因此,MMDBMS都會(huì)在一定時(shí)間間隔內(nèi)把內(nèi)存中的臟數(shù)據(jù)備份到永久存儲(chǔ)器上。MMDBMS支持并發(fā)操作,備份的過程可能伴隨著數(shù)據(jù)的更新過程。備份之后得到的可能是處于不一致性狀態(tài)的數(shù)據(jù)庫(kù)映像文件。若使用這樣的映像文件來恢復(fù)數(shù)據(jù)庫(kù),將使數(shù)據(jù)庫(kù)陷入不一致性狀態(tài)。為了得到一個(gè)處于一致性狀態(tài)的映像文件,目前不少系統(tǒng)采用靜態(tài)備份的方式,即等到系統(tǒng)中沒有事務(wù)在運(yùn)行時(shí)進(jìn)行備份。備份期間不允許對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新。這種備份方法大大降低了系統(tǒng)的可用性。并且,備份操作也不能太頻繁,否則系統(tǒng)I/0不能承受。另外,備份的時(shí)間間隔越長(zhǎng),一旦系統(tǒng)崩潰,丟失的數(shù)據(jù)量也越多。目前普遍的做法是采用登記日志(Logging)來保障數(shù)據(jù)不丟失、少丟失。此外,MMDBMS在運(yùn)行過程中也會(huì)陷入不一致性狀態(tài)。例如系統(tǒng)崩潰意外終止事務(wù),用戶主動(dòng)終止事務(wù)等都可能導(dǎo)致數(shù)據(jù)庫(kù)不一致。目前大部分系統(tǒng)都采用登記事務(wù)日志的方法來把數(shù)據(jù)庫(kù)恢復(fù)到最新的一致性狀態(tài)。很多應(yīng)用系統(tǒng),如上述的短信系統(tǒng),往往由很多帶數(shù)據(jù)庫(kù)的節(jié)點(diǎn)構(gòu)成一個(gè)分布式系統(tǒng),這些節(jié)點(diǎn)的數(shù)據(jù)庫(kù)之間經(jīng)常需要同步數(shù)據(jù)。數(shù)據(jù)同步過程有時(shí)是實(shí)時(shí)進(jìn)行的,有時(shí)僅需定期/不定期同步一次數(shù)據(jù)。實(shí)時(shí)同步往往不需要生成同步數(shù)據(jù)文件。而對(duì)于定期/不定期同步,目前業(yè)界采用最多的是生成同步數(shù)據(jù)文件的辦法。不過,事務(wù)日志文件加上同步數(shù)據(jù)文件,其產(chǎn)生的數(shù)據(jù)量非常龐大。研究人員通過對(duì)二者存儲(chǔ)內(nèi)容的研究,發(fā)現(xiàn)二者存放了許多相同或雷同的信息,冗余度相當(dāng)大。這將造成存儲(chǔ)空間的嚴(yán)重浪費(fèi),也耗費(fèi)了生成這些冗余信息時(shí)的計(jì)算資源。此外,在進(jìn)行系統(tǒng)故障恢復(fù)時(shí),目前業(yè)界通常的做法是建立兩個(gè)隊(duì)列REDO隊(duì)列和UNDO隊(duì)列。系統(tǒng)故障恢復(fù)時(shí)分別重復(fù)執(zhí)行REDO和UNDO操作,做法比較繁瑣,而且重復(fù)掃描日志文件,效率較低。
發(fā)明內(nèi)容為解決上述數(shù)據(jù)庫(kù)系統(tǒng)的事務(wù)日志文件和同步數(shù)據(jù)文件同時(shí)存在造成存儲(chǔ)空間浪費(fèi),系統(tǒng)故障恢復(fù)效率低的問題,有必要提供一種存儲(chǔ)空間較小,系統(tǒng)故障恢復(fù)效率較高的混合日志生成方法。此外,還有必要提供一種上述混合日志格式的混合日志解析方法。本發(fā)明混合日志生成方法包括以下步驟打開或者創(chuàng)建混合日志文件;接收用戶命令,并判斷所述用戶命令的類型;根據(jù)所述判斷得出的用戶命令的類型,登記相應(yīng)的命令類型日志。所述登記相應(yīng)的命令類型日志包括以下步驟收到日志登記請(qǐng)求,判斷所述日志緩存區(qū)是否有足夠空間容納所述日志,若沒有足夠空間,則把所述緩存區(qū)的數(shù)據(jù)刷寫到所述混合日志文件,并清空緩存區(qū);查看所述日志在所述緩存區(qū)中偏移量和所述混合日志文件的大小,把二者相加得到所述日志在所述混合日志文件中的實(shí)際偏移量;將所述日志寫入所述緩存區(qū),并返回成功寫入的字節(jié)數(shù)和所述實(shí)際偏移量。所述判斷得出用戶命令的類型為檢查點(diǎn)命令,則登記所述檢査點(diǎn)命令日志,并伴隨所述檢查點(diǎn)命令的執(zhí)行,所述檢查點(diǎn)命令的執(zhí)行與事務(wù)并發(fā)執(zhí)行。所述混合日志的日志行開頭結(jié)構(gòu)為lsn:len:sync:op—code,所述lsn表示日志行序列號(hào),用來說明日志行命令開始執(zhí)行的順序,所述len表示除了所述lsn和len所占的長(zhǎng)度除外,所述日志行的長(zhǎng)度,所述sync表示所述日志行是否是需要產(chǎn)生同步日志,所述op—code表示所述日志行命令代碼,用于識(shí)別所述日志行的類型,所述冒號(hào):為分隔符。所述lsn在數(shù)據(jù)庫(kù)全局里唯一,所述sync為O表示非同步日志,為非0表示同步日志,所述opjode的編碼取值范圍是l至255。所述混合日志的格式包括DML語句括號(hào)日志格式、DML基本操作日志格式、事務(wù)控制日志格式和檢査點(diǎn)日志格式,所述DML語句括號(hào)日志格式的op—code,op為DML命令,code為BEGIN、END或ABORT,所述DML基本操作日志格式的op_code為DELETE—VFIELD,INSERT—VFIELD,UPDATE—FIELD,DELETE—RECORD,INSERT—RECORD或FREE—PAGE,所述事務(wù)控制日志格式的lsn為0,sync為1,op為TRANSACTION,code為BEGIN,COMMIT或ROLLBACK,所述檢査點(diǎn)日志格式的lsn為0,sync為1,op為CHECK—POINT,code為BEGIN或END。本發(fā)明混合日志解析方法包括以下步驟步驟A、申請(qǐng)日志解析器句柄,打開混合日志文件;步驟B、判斷是否存在已閉合的REDO/UNDO事務(wù)塊結(jié)點(diǎn),若是,執(zhí)行步驟C,否則,執(zhí)行步驟D,所述REDO/UNDO事務(wù)塊表示事務(wù)包含的所有日志的集合,所述已閉合的REDO/UNDO事務(wù)塊由TRANSACTION—BEGIN起始,以TRANSACTIONCOMMIT或者TRANSACTION—ROLLBACK結(jié)尾;步驟C、把所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)指針賦給輸出變量,返回獲取REDO/UNDO事務(wù)塊成功狀態(tài)值;步驟D、依次解析混合日志文件的日志行,執(zhí)行生成所述REDO/UNDO事務(wù)塊的操作,再執(zhí)行步驟B。所述步驟D中執(zhí)行生成所述REDO/UNDO事務(wù)塊的操作包括以下步驟解析遇到日志行是TRANSACTION—BEGIN,生成REDO/UNDO事務(wù)塊結(jié)點(diǎn),再7依次判斷日志行所屬命令類型,遇到日志行是TRANSACTION_END,并置所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)為閉合標(biāo)志。所述REDO/UNDO事務(wù)塊包括語句塊,所述語句塊以op一BEGIN開始,閉合的語句塊以op—BEGIN開始,op一END結(jié)尾,op為DML命令,所述步驟D依次解析混合日志文件的日志行包括解析遇到所述日志行是op—BEGIN,生成語句塊結(jié)點(diǎn),再依次判斷日志行所屬命令類型,遇到日志行是op—END,并置所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)為閉合標(biāo)志。所述步驟C替換為獲取當(dāng)前語句塊,根據(jù)當(dāng)前語句塊生成下一條同步SQL語句,內(nèi)部指針偏移到下一條未處理日志行或者下一個(gè)語句塊節(jié)點(diǎn),并判斷是否生成同步SQL語句,若是,返回獲取同步SQL語句成功狀態(tài)值,否則,返回具體錯(cuò)誤狀態(tài)值。與現(xiàn)有技術(shù)相比較,本發(fā)明混合日志生成方法和解析方法采用混合日志格式的混合日志綜合了事務(wù)日志和同步日志的所有信息,從而保證了混合日志既可充當(dāng)事務(wù)日志,又可充當(dāng)數(shù)據(jù)同步日志,消除了很多冗余信息,使得整體的日志規(guī)模大大下降,不僅節(jié)省了文件存儲(chǔ)空間,而且減少了生成這些日志吋消耗的內(nèi)存緩存空間和CPU資源。并且,本發(fā)明混合日志生成方法和解析方法支持事務(wù)的并發(fā)執(zhí)行,大大提高系統(tǒng)的可用性和吞吐量。并且,只需輔以混合日志文件進(jìn)行事務(wù)REDO和UNDO來保證數(shù)據(jù)的一致性狀態(tài)。再者,本發(fā)明混合日志解析方法采用邊掃描日志文件邊生成REDO/UNDO事務(wù)塊的方法,對(duì)日志進(jìn)行一趟掃描就可以完成對(duì)整個(gè)日志文件的解析和處理,提高了解析速度,簡(jiǎn)化了處理流程。而且,把REDO隊(duì)列和UNDO隊(duì)列的構(gòu)造過程合而為一,當(dāng)REDO/UNDO事務(wù)塊閉合,就進(jìn)行進(jìn)行REDO/UNDO操作或者生成同步SQL語句,處理完畢立即釋放該REDO/UNDO事務(wù)塊所占用的內(nèi)存資源。在結(jié)合附圖閱讀本發(fā)明實(shí)施方式的詳細(xì)描述后,本發(fā)明的特點(diǎn)和優(yōu)點(diǎn)將變得更加清楚。圖1是本發(fā)明混合日志生成方法的流程示意圖。圖2是圖1的具體流程示意圖。圖3是圖1中日志登記的具體實(shí)現(xiàn)流程圖。圖4是本發(fā)明用于系統(tǒng)故障恢復(fù)的混合日志解析方法的流程圖。圖5是本發(fā)明用于非實(shí)時(shí)數(shù)據(jù)同歩的混合日志解析方法的流程圖。具體實(shí)施例方式下面結(jié)合附圖對(duì)本發(fā)明混合日志生成方法和解析方法進(jìn)行說明。本發(fā)明混合日志格式用擴(kuò)展BNF語法元符號(hào)來描述。BNF語法元符號(hào)如下[、]、I、*、+、其中,[和]用于界定語法元素的范圍或者表示可選部分。I表示在其左右兩邊任選一項(xiàng)。*表示0或者多個(gè)。+表示至少1個(gè)。方括號(hào)對(duì)單獨(dú)出現(xiàn)表示括起來的語法元素是可選部分。方括號(hào)對(duì)和*或者+—起使用,則分別表示括起來的語法元素出現(xiàn)O次到n次和至少一次以上。:表示定義。BNF語法元符號(hào)只是用來描述日志格式的工具,不是所描述的日志行的組成部分。比如,field用來描述一個(gè)字段值,定義field的BNF范式如下field::name—len,name,type,prec,data—len,data其中,namejen表示name的字符串長(zhǎng)度,不包括NULL。name表示字段名。type表示字段類型。prec表示DECIMAL類型的精度。data一len表示data的字節(jié)流長(zhǎng)度。data表示數(shù)據(jù)字節(jié)流。再如,fielcLdesc用來描述一個(gè)字段的定義,除了不包含data外,和field完全一樣。定義field一desc的BNF范式如下field一desc::name_len,name,type,prec,data_len混合日志從功能上劃分成4個(gè)類型,其包括DML(DataManipulationLanguage)語句括號(hào)日志、DML基本操作日志、事務(wù)控制日志和檢査點(diǎn)日志。每種類型日志分別對(duì)應(yīng)相應(yīng)的日志格式,即DML語句括號(hào)日志、DML基本操作日志、事務(wù)控制日志和檢查點(diǎn)日志對(duì)應(yīng)DML語句括號(hào)日志格式、DML基本操作日志格式、事務(wù)控制日志格式和檢査點(diǎn)日志格式。每種日志開頭都具有如下結(jié)構(gòu)lsn:len:sync:op一code其中,lsn表示日志序列號(hào),在數(shù)據(jù)庫(kù)全局里唯一。lsn用來說明該條日志命令開始執(zhí)行的順序。len表示除了lsn和len所占的長(zhǎng)度除外,該條日志的長(zhǎng)度。sync表示該條日志是否是需要產(chǎn)生同步日志,0表示非同步日志,非0表示同歩日志。op—code表示日志命令代碼,用于識(shí)別日志行的類型。為了便于閱讀,op_COde都使用大寫英文字母加下劃線的助記符形式來表示,具體實(shí)現(xiàn)時(shí)由實(shí)現(xiàn)者替換成各自不同的數(shù)值即可,如TRANSACTION—BEGIN、DELETE—BEGIN、INSERT—VFIELD、CHECK—POINT—END等。并且TRANSACTION—BEGIN、DELETE_BEGIN、INSERT_VFIELD、CHECK—POINT_END是助記符,不是字符串,如同C語言的宏定義。叩—code的編碼取值范圍是1255。對(duì)于日志格式中任何位置出現(xiàn)的":"符號(hào)都不是必須的,其僅僅起到分隔各個(gè)字段的作用,以及在解析日志時(shí),幫助校驗(yàn)日志行格式是否正確。在日志具體實(shí)現(xiàn)時(shí)可以去除":"符號(hào),也可以保留":"符號(hào),或者用其他分隔符代替。DML語句指UPDATE、INSERT、DELETE、TRUNCATE—TABLE、DROPJTABLE等SQL命令。對(duì)于每條SQL命令,其對(duì)應(yīng)的混合日志至少包括開始和結(jié)束標(biāo)志,這些開始和結(jié)束標(biāo)志稱為DML語句括號(hào)。每條SQL命令產(chǎn)生的混合日志以一條op—BEGIN日志開始,中間跟隨著若干條基本操作日志,最后以一條op—END或者op_ABORT結(jié)束。op用SQL命令名代替,如INSERTBEGIN。DML語句括號(hào)日志格式如下lsn:len:sync:op—BEGINlsn:len:sync:op_ENDlsn:len:sync:op—ABORT在DML語句括號(hào)日志格式中,op可以用UPDATE、INSERT、DELETE、TRUNCATE—TABLE或者DROPJTABLE來替代。DML語句括號(hào)可提供關(guān)于關(guān)系表的信息。部分還提供所涉及記錄的關(guān)鍵字信息。如lsn:len:sync:INSERT_BEGIN:tid:tn_len:table_name:other—info其中,tn_len表示table—name的長(zhǎng)度,是byte類型;table—name則表示表的名稱。other—info表示記錄的關(guān)鍵字信息,如DESC:count:[(field—desc)]+,其就是INSERT—BEGIN這個(gè)日志命令所涉及記錄的關(guān)鍵字信息。DML基本操作是指完成DML命令所需的具體實(shí)施變更數(shù)據(jù)的操作。DML命令包括SELECT、UPDATE、INSERT、DELETE。DML基本操作對(duì)應(yīng)的日志主要有以下6種1)DELETE—VFIELD,表示刪除一個(gè)變長(zhǎng)字段;2)INSERT—VFIELD,表示插入一個(gè)變長(zhǎng)字段;3)UPDATE—FIELD,表示更新一個(gè)定長(zhǎng)字段;4)DELETE—RECORD,表示刪除一個(gè)記錄行;5)INSERT—RECORD,表示插入一個(gè)記錄行;6)FREE—PAGE,表示釋放若干個(gè)頁(yè)面。DML基本操作日志格式lsn:len:sync:DELETE—VFIELD:(pno,rno),(field)]*lsn:len:sync:INSERT—VF正LD:(pno,mo),(field)[,KEY:count:[(field)]氺]lsn:len:sync:UPDATE一F正LD:(pno,rno,offset),OLD:(field),NEW:(field),KEY:count:[(field)]*lsn:len:sync:DELETE—RECORD:(pno,rno),(data—len,data),KEY:飄nt:[(field)]承l(wèi)sn:len:sync:INSERT一RECORD:(pno,rno),(data—len,data)lsn:len:sync:FREE—PAGE:count:[(pno)]*DML語句括號(hào)包裹本條SQL命令所有的DML基本操作日志,指示本條SQL命令的最終執(zhí)行結(jié)果為成功或者失敗。所有的DML基本操作都必須包含在某個(gè)DML語句括號(hào)日志之內(nèi)。所以,一條SQL命令產(chǎn)生的所有日志都由DML語句括號(hào)日志前后界定,中間包含若干條DML基本操作日志,它們?cè)谖锢砩喜灰欢ㄟB續(xù)存放,但是在邏輯上是一個(gè)整體。把一條SQL命令產(chǎn)生的所有日志的全體定義為SQL命令日志,或者DMLSQL命令日志。DELETE命令的日志格式及其邏輯結(jié)構(gòu)語法描述如下所示lsn:len:sync:DELETE—BEGIN:tid:tn_len:table_name承l(wèi)sn:len:sync:DELETE—RECORD:(pno,rno),(datalen,data),KEY:count:[(field)]承]+lsn:len:sync:DELETEEND|lsn:len:sync:DELETE—ABORT由上述的SQL命令的日志格式及其邏輯結(jié)構(gòu)語法描述可知,SQL語句日志包含了事務(wù)恢復(fù)和數(shù)據(jù)同步所需的全部信息。事務(wù)控制日志指一個(gè)事務(wù)開始命令和結(jié)束命令對(duì)應(yīng)的日志。一個(gè)完整的事務(wù)日志以一條TRANSACTION—BEGIN日志開始,中間包含若干條SQL語句日志,根據(jù)事務(wù)執(zhí)行的最終狀態(tài),最后以一條TRANSACTION—COMMIT日志或者TRANSACTION—ROLLBACK日志結(jié)尾。每個(gè)事務(wù)控制日志都完整地包含了屬于它的所有SQL命令日志。一個(gè)事務(wù)控制日志里面可以包含0個(gè)到任意個(gè)SQL命令日志。每個(gè)事務(wù)都有一個(gè)事務(wù)ID(Identity)。事務(wù)ID由事務(wù)控制器順序分配,在某個(gè)時(shí)間段內(nèi)唯一表示一個(gè)事務(wù),也基本上代表了事務(wù)啟動(dòng)的時(shí)間順序。但是,由于允許事務(wù)并發(fā)執(zhí)行,故不能絕對(duì)保證事務(wù)ID完全反映事務(wù)執(zhí)行的先后順序。不過,由于事務(wù)具有ACID屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),或者確切地說,由于事務(wù)具有隔離性,使得事務(wù)單獨(dú)執(zhí)行和并發(fā)執(zhí)行的效果是完全一樣的。事務(wù)控制日志格式-0:len:1TRANSACTION—BEGIN:tid0:len:1.TRANSACTION—COMMIT:tid0:len:1TRANSACTION—ROLLBACK:tid在事務(wù)控制日志格式中,lsn設(shè)置為0,sync設(shè)置為l。檢查點(diǎn)日志指標(biāo)識(shí)檢査點(diǎn)開始和結(jié)束時(shí)刻的日志。檢查點(diǎn)開始時(shí)登記CHECK_POINT—BEGIN日志,結(jié)束之后登記CHECK_POINT_END日志。檢査點(diǎn)日志格式0:len:1:CHECKPOINT—BEGIN:cpnO:len:l:CHECK—POINT—END:cpn在檢查點(diǎn)日志格式中,lsn設(shè)置為0,sync設(shè)置為l。與DML語句括號(hào)日志類似,事務(wù)控制日志和檢査點(diǎn)日志都是日志括號(hào),即都包括一條開始日志和一條相對(duì)應(yīng)的結(jié)束日志。這三種日志在實(shí)際操作開始前記錄op_BEGIN日志,在實(shí)際操作完成后根據(jù)執(zhí)行結(jié)果記錄結(jié)束日志,如INSERT_END、INSERT—ABORT、TRANSACTION—COMMIT、TRANSACTION—ROLLBACK、CHECK—POINT_END等。另外,檢査點(diǎn)日志僅僅標(biāo)示檢查點(diǎn)操作的起止時(shí)刻,與事務(wù)控制日志或者SQL命令日志沒有邏輯上的包含關(guān)系。檢査點(diǎn)日志主要用來做系統(tǒng)故障恢復(fù)。12事務(wù)控制日志用來支持事務(wù)故障恢復(fù),參與系統(tǒng)故障恢復(fù)和介質(zhì)故障恢復(fù)。所以,事務(wù)控制日志不僅系統(tǒng)運(yùn)行時(shí)需要,故障恢復(fù)或者系統(tǒng)重啟時(shí)都需要。請(qǐng)參閱圖1和圖2,其中,圖l是本發(fā)明混合日志生成方法的流程示意圖,圖2是圖1的具體流程示意圖?;旌先罩旧煞椒òㄒ韵虏襟E51、打開或者創(chuàng)建混合日志文件;52、接收用戶命令,并判斷所述用戶命令的類型;53、根據(jù)所述判斷得出的用戶命令的類型,登記相應(yīng)的命令類型日志。用戶發(fā)送命令的類型包括DMLSQL命令、事務(wù)命令或者檢査點(diǎn)命令,其分別對(duì)應(yīng)DMLSQL命令日志、事務(wù)控制日志和檢査點(diǎn)日志?;旌先罩旧煞椒ǖ木唧w流程包括以下步驟101、打開或者創(chuàng)建一個(gè)混合日志文件;102、接收用戶命令;103、判斷是否是DMLSQL命令,若是,執(zhí)行104,否則,執(zhí)行109;104、登記該條命令的op_BEGIN日志;105、登記DML基本操作日志;106、執(zhí)行DML基本操作;107、判斷是否還有下一條DML基本操作,若是,執(zhí)行105,否則,執(zhí)行108;108、登記該條命令的op—END日志,再執(zhí)行115;109、判斷是否是事務(wù)命令,若是,執(zhí)行IIO,否則,執(zhí)行l(wèi)ll;110、登記相應(yīng)的事務(wù)命令日志,再執(zhí)行115;111、判斷是否是檢查點(diǎn)命令,若是,執(zhí)行112,否則執(zhí)行115;112、登記CHECK—POINT—BEGIN日志;113、執(zhí)行檢查點(diǎn)過程;114、登記CHECK_POINT—END日志;115、判斷是否還有下一條命令,若是,執(zhí)行103,否則執(zhí)行116;116、等待用戶輸入命令。由以上步驟可知,對(duì)于DMLSQL命令,在命令執(zhí)行之前先登記op—BEGIN日志,在執(zhí)行過程中,每開始一個(gè)DML基本操作時(shí),先登記它的DML基本操作日志,執(zhí)行完所有的DML基本操作之后,根據(jù)執(zhí)行的最終結(jié)果,若失敗或者異常結(jié)束,登記op—ABORT日志,否則成功或者正常結(jié)束,登記op一END日志;除了SELECT之類的查詢命令不被要求,其余DML命令的執(zhí)行都將產(chǎn)生SQL命令日志。對(duì)于事務(wù)命令,只需在執(zhí)行相應(yīng)的命令之前登記相應(yīng)的日志事務(wù)開始命令TRANSACTION—BEGIN、事務(wù)提交命令TRANSACTION—COMMIT或者事務(wù)撤銷命令TRANSACTION—ABORT。如果創(chuàng)建混合日志文件的時(shí)候,有分配日志緩存區(qū),則在完成登記TRANSACTION—COMMIT或TRANSACTION—ABORT后,把日志緩存區(qū)數(shù)據(jù)刷入混合日志文件。對(duì)于檢查點(diǎn)命令,先登記CHECK—POINT—BEGIN日志,接著執(zhí)行檢查點(diǎn)過程,最后登記CHECK—POINT—END日志。所述日志生成方法遵循預(yù)寫式日志(Write-AheadLogging,簡(jiǎn)稱WAL)原則。在內(nèi)存數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行過程中,系統(tǒng)會(huì)產(chǎn)生一序列按順序編號(hào)的混合日志文件,并且,手動(dòng)發(fā)起的檢查點(diǎn)操作或者系統(tǒng)自動(dòng)發(fā)起的檢查點(diǎn)操作都將產(chǎn)生或者更新內(nèi)存數(shù)據(jù)庫(kù)映像文件。每次檢査點(diǎn)操作之前,要記錄當(dāng)前時(shí)刻所有未完成事務(wù)最小的日志文件偏移量offset和當(dāng)前使用的日志文件號(hào)log—filejio。其中,offset是指所有正在進(jìn)行的事務(wù)所產(chǎn)生的第一條事務(wù)控制日志TRANSACTION—BEGIN寫入日志文件時(shí)相對(duì)于文件頭的偏移量中的最小值,其以字節(jié)計(jì)算。等到檢查點(diǎn)操作結(jié)束后,把這兩個(gè)值分別寫入映象文件的頭結(jié)構(gòu)中,同時(shí)把映象文件的頭結(jié)構(gòu)刷新到永久存儲(chǔ)器中,或者記在事務(wù)控制文件中。采用本發(fā)明的混合日志的生成方法,檢查點(diǎn)操作不需要事務(wù)處理處于靜止?fàn)顟B(tài)時(shí)才執(zhí)行,其可以與事務(wù)并發(fā)執(zhí)行。這種方式屬于動(dòng)態(tài)備份方式,其產(chǎn)生的映像文件不一定處于一致性狀態(tài),所以需要用日志文件來輔助,即輔以混合日志文件進(jìn)行事務(wù)重做和回滾,以此來保證數(shù)據(jù)的一致性狀態(tài)。請(qǐng)參閱圖3,其是圖1中日志登記的具體實(shí)現(xiàn)流程圖。曰志登記通過日志登記函數(shù)來完成。日志登記函數(shù)至少包括兩個(gè)入?yún)?,即日志長(zhǎng)度和日志體數(shù)據(jù)。如果有分配日志緩存區(qū),日志登記的具體實(shí)現(xiàn),包括以下步驟201、收到日志登記請(qǐng)求;202、檢査日志緩存區(qū)是否有足夠空間容納該條日志,若是,執(zhí)行204,否則,執(zhí)行203;203、將緩存區(qū)數(shù)據(jù)全部輸出到混合日志文件,清空緩存區(qū),執(zhí)行204;204、查看這條日志在緩存區(qū)中偏移量和當(dāng)前日志文件的大小,把二者相加得到該條日志將來在混合日志文件中相對(duì)于文件開始處的實(shí)際偏移量;205、向日志緩存區(qū)寫入該條日志;206、向調(diào)用者返回成功寫入的字節(jié)數(shù)和該條日志在混合日志文件中的實(shí)際偏移量o如果沒有分配日志緩存區(qū),日志登記的具體實(shí)現(xiàn)只需査看這條日志在混合日志文件中的偏移量和當(dāng)前日志文件的大小,把二者相加得到所述日志在混合日志文件中相對(duì)于混合日志文件開始處的實(shí)際偏移量;向混合日志文件寫入所述曰志;向調(diào)用者返回成功寫入的字節(jié)數(shù)和所述日志在混合日志文件中的實(shí)際偏移。由于事務(wù)并發(fā)執(zhí)行,故而SQL命令日志和其他日志都可能隨時(shí)產(chǎn)生隨時(shí)登記,所以在日志文件中,這些日志并不會(huì)依照其邏輯結(jié)構(gòu)連續(xù)存放,而是交叉存放。但每條日志是完整存放的,不會(huì)被其他條日志從中介入打斷。請(qǐng)參閱圖4,其是本發(fā)明用于系統(tǒng)故障恢復(fù)的混合日志解析方法的流程圖。本發(fā)明采用邊掃描日志文件邊生成REDO/UNDO事務(wù)塊的方法,只需一趟掃描就可以完成對(duì)整個(gè)日志文件的解析。把一個(gè)事務(wù)包含的所有日志的集合稱為一個(gè)REDO/UNDO事務(wù)塊(REDO/UNDOTransactionBlock)。把一個(gè)事務(wù)包含的SQL命令語句的集合稱為SQL命令語句塊,簡(jiǎn)稱語句塊。已閉合的REDO/UNDO事務(wù)塊由TRANSACTIONBEGIN起始,以TRANSACTIONCOMMIT或者TRANSACTIONROLLBACK結(jié)尾,中間包含若干個(gè)DELETE、UPDATE或者INSERT等語句塊。在解析過程中,遇到TRANSACTIONCOMMIT或者TRANSACTIONROLLBACK,表示存在已閉合的REDO/UNDO事務(wù)塊結(jié)點(diǎn)。用于系統(tǒng)故障恢復(fù)的混合日志解析方法,其包括以下步驟當(dāng)一個(gè)REDO/UNDO事務(wù)塊形成后,則立即執(zhí)行REDO/UNDO操作。301、申請(qǐng)一個(gè)日志解析器句柄hp,只讀方式打開混合日志文件。先把映像文件載入內(nèi)存,然后根據(jù)前述的最小的日志文件偏移offset和日志文件號(hào)log_file—no值找到第一個(gè)混合日志文件和第一條要讀的日志的偏移位置,只讀方式打開混合日志文件;302、判斷是否存在已閉合的REDO/UNDO事務(wù)塊結(jié)點(diǎn),若是,執(zhí)行303,否則,執(zhí)行304;303、把REDO/UNDO事務(wù)塊結(jié)點(diǎn)指針賦給輸出變量,返回獲取REDO/UNDO事務(wù)塊成功狀態(tài)值;304、讀取日志行數(shù)據(jù),并判斷是否遇到讀文件出錯(cuò)或者文件結(jié)束標(biāo)志,若是,則執(zhí)行305,否則,執(zhí)行306;305、判斷是否是遇到文件結(jié)束標(biāo)志,若是,返回表示遇到文件結(jié)束標(biāo)志的狀態(tài)值,否則,返回具體錯(cuò)誤狀態(tài)值;306、解析該日志行,并判斷是否解析成功,若是,執(zhí)行307,否則返回具體錯(cuò)誤狀態(tài)值;307、判斷該日志行是否是TRANSACTION—BEGIN,若是,執(zhí)行308,否則,執(zhí)行309;308、生成一個(gè)REDO/UNDO事務(wù)塊結(jié)點(diǎn),將其添加到日志解析器句柄hp,并執(zhí)行304;309、判斷該日志行是否是op—BEGIN,若是,執(zhí)行310,否則,執(zhí)行311;310、生成一個(gè)語句塊結(jié)點(diǎn),將其插入到所屬的REDO/UNDO事務(wù)塊結(jié)點(diǎn)中,并執(zhí)行304;311、判斷該日志行是否是TRANSACTION—END,若是,執(zhí)行312,否貝U,執(zhí)行313;312、找到匹配的REDO/UNDO事務(wù)塊結(jié)點(diǎn),將該日志行插入,并置其狀態(tài)為閉合標(biāo)志,并執(zhí)行303;313、判斷是否找到匹配的語句塊結(jié)點(diǎn),若是,執(zhí)行315,否則,執(zhí)行314;314、返回具體錯(cuò)誤狀態(tài)值;315、將該日志行插入,并判斷該日志行是否是op一END,若是,執(zhí)行316,否則,執(zhí)行304;316、將該語句塊置為閉合狀態(tài),并執(zhí)行304。由以上步驟可知,解析過程中,在返回遇到文件結(jié)束的標(biāo)志之前,伴隨著讀日志文件和解析日志行的過程,直到返回一個(gè)REDO/UNDO事務(wù)塊成功狀態(tài)值。這些REDO/UNDO事務(wù)塊構(gòu)成一個(gè)隊(duì)列,就是系統(tǒng)故障恢復(fù)時(shí)的REDO隊(duì)列。所述的REDO隊(duì)列可能包含了以ROLLBACK結(jié)尾的REDO/UNDO事務(wù)塊,需要按照UNDO處理,其余都按照REDO處理。當(dāng)所有日志文件解析處理完畢之后,日志解析器hp中可能還有剩余一些沒有閉合的REDO/UNDO事務(wù)塊,此時(shí)使用強(qiáng)制取出方式逆序獲取各個(gè)REDO/UNDO事務(wù)塊,由此構(gòu)成了系統(tǒng)故障恢復(fù)時(shí)的UNDO隊(duì)列,并且按照UNDO處理。系統(tǒng)故障恢復(fù)過程中,處理完REDO隊(duì)列,再處理UNDO隊(duì)列,此時(shí)數(shù)據(jù)庫(kù)恢復(fù)到最新的一致性狀態(tài)。請(qǐng)參閱圖5,其是本發(fā)明用于非實(shí)時(shí)數(shù)據(jù)同步的混合日志解析方法的流程圖。非實(shí)時(shí)數(shù)據(jù)同步,即定期或不定期數(shù)據(jù)同步。非實(shí)時(shí)數(shù)據(jù)同步的混合日志解析方法,與系統(tǒng)故障恢復(fù)的解析方法大致一樣,其差別僅在于,非實(shí)時(shí)數(shù)據(jù)同步的混合日志解析方法的目標(biāo)是得到根據(jù)語句塊生成的同步SQL語句。步驟差別在于步驟403獲取當(dāng)前語句塊,根據(jù)當(dāng)前語句塊生成下一條同步SQL語句,內(nèi)部指針偏移到下一條未處理日志行或者下一個(gè)語句塊節(jié)點(diǎn)。再判斷是否生成同步SQL語句,若是,返回獲取同步SQL語句成功狀態(tài)值,否則,返回具體錯(cuò)誤狀態(tài)值。對(duì)于故障恢復(fù),只需返回獲取REDO/UNDO事務(wù)塊成功狀態(tài)值即可;而對(duì)于數(shù)據(jù)同步,首先獲取當(dāng)前語句塊結(jié)點(diǎn)的下一條日志行指針,生成下一條同步SQL語句,同時(shí)把內(nèi)部指針偏移到下一條未處理的日志行,若遇到op—END或者op—ABORT日志行,則偏移到下一個(gè)語句塊節(jié)點(diǎn),最后返回生成的SQL語句文本串。對(duì)于多節(jié)點(diǎn)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),不同節(jié)點(diǎn)的數(shù)據(jù)庫(kù)可能需要進(jìn)行定期或不定期數(shù)據(jù)同步,這些數(shù)據(jù)庫(kù)系統(tǒng)不一定是同構(gòu)的,比如目標(biāo)系統(tǒng)可能是Oracle或者Sybase這樣的傳統(tǒng)數(shù)據(jù)庫(kù)。使用混合日志文件可以解析生成符合目標(biāo)系統(tǒng)SQL語法的同步SQL語句文本串。與現(xiàn)有技術(shù)相比較,本發(fā)明混合日志生成方法和解析方法采用混合日志格式的混合日志綜合了事務(wù)日志和同步日志的所有信息,每個(gè)SQL語句日志包含了事務(wù)恢復(fù)和數(shù)據(jù)同步所需的全部信息,從而保證了混合日志既可充當(dāng)事務(wù)日志,又可充當(dāng)數(shù)據(jù)同步日志,消除了很多冗余信息,使得整體的日志規(guī)模大大下降,不僅節(jié)省了文件存儲(chǔ)空間,而且減少了生成這些日志時(shí)消耗的內(nèi)存緩存空間和CPU資源。并且,本發(fā)明混合日志生成方法支持事務(wù)的并發(fā)執(zhí)行,以及事務(wù)與檢查點(diǎn)過程的并發(fā)執(zhí)行,大大提高系統(tǒng)的可用性和吞吐量。并且,只需輔以混合日志文件進(jìn)行事務(wù)重做和回滾來保證數(shù)據(jù)的一致性狀態(tài)。再者,本發(fā)明混合日志解析方法采用邊掃描日志文件邊生成REDO/UNDO事務(wù)塊的方法,對(duì)日志進(jìn)行一趟掃描就可以完成對(duì)整個(gè)日志文件的解析和處理,提高了解析速度,簡(jiǎn)化了處理流程。而且,把REDO隊(duì)列和UNDO隊(duì)列的構(gòu)造過程統(tǒng)一,當(dāng)REDO/UNDO事務(wù)塊閉合,就進(jìn)行進(jìn)行REDO/UNDO操作或者生成同步SQL語句,處理完畢立即釋放該REDO/UNDO事務(wù)塊所占用的內(nèi)存資源。以上僅為本發(fā)明的優(yōu)選實(shí)施案例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1、一種混合日志生成方法,其特征在于,包括以下步驟打開或者創(chuàng)建混合日志文件;接收用戶命令,并判斷所述用戶命令的類型;根據(jù)所述判斷得出的用戶命令的類型,登記相應(yīng)的命令類型日志。2、根據(jù)權(quán)利要求1所述的混合日志生成方法,其特征在于,所述登記相應(yīng)的命令類型日志包括以下步驟收到日志登記請(qǐng)求,判斷所述日志緩存區(qū)是否有足夠空間容納所述日志,若沒有足夠空間,則把所述緩存區(qū)的數(shù)據(jù)刷寫到所述混合日志文件,并清空緩存區(qū);查看所述日志在所述緩存區(qū)中偏移量和所述混合日志文件的大小,把二者相加得到所述日志在所述混合日志文件中的實(shí)際偏移量;將所述日志寫入所述緩存區(qū),并返回成功寫入的字節(jié)數(shù)和所述實(shí)際偏移量。3、根據(jù)權(quán)利要求1所述的混合日志生成方法,其特征在于,所述判斷得出用戶命令的類型為檢査點(diǎn)命令,則登記所述檢査點(diǎn)命令日志,并伴隨所述檢査點(diǎn)命令的執(zhí)行,所述檢査點(diǎn)命令的執(zhí)行與事務(wù)并發(fā)執(zhí)行。4、根據(jù)權(quán)利要求l,2或3所述的混合日志生成方法,其特征在于,所述混合日志的日志行開頭結(jié)構(gòu)為lsn:len:sync:op_code,所述lsn表示日志行序列號(hào),用來說明日志行命令開始執(zhí)行的順序,所述len表示除了所述lsn和len所占的長(zhǎng)度除外,所述日志行的長(zhǎng)度,所述sync表示所述日志行是否是需要產(chǎn)生同步日志,所述op—code表示所述日志行命令代碼,用于識(shí)別所述日志行的類型,所述冒號(hào):為分隔符。5、根據(jù)權(quán)利要求4所述的混合日志生成方法,其特征在于,所述lsn在數(shù)據(jù)庫(kù)全局里唯一,所述sync為O表示非同步日志,為非0表示同步日志,所述op—code的編碼取值范圍是1至255。6、根據(jù)權(quán)利要求l,2或3所述的混合日志生成方法,其特征在于,所述混合日志的格式包括DML語句括號(hào)日志格式、DML基本操作日志格式、事務(wù)控制日志格式和檢查點(diǎn)日志格式,所述DML語句括號(hào)日志格式的叩jode,叩為DML命令,code為BEGIN、END或ABORT,所述DML基本操作日志格式的opcode為DELETE—VFIELD,INSERT—VF正LD,UPDATE—F正LD,DELETE_RECORD,INSERT—RECORD或FREE_PAGE,所述事務(wù)控制日志格式的lsn為0,sync為1,op為TRANSACTION,code為BEGIN,COMMIT或ROLLBACK,所述檢查點(diǎn)曰志格式的lsn為0,sync為1,op為CHECK_POINT,code為BEGIN或END。7、一種混合日志解析方法,其特征在于,包括以下步驟步驟A、申請(qǐng)日志解析器句柄,打開混合日志文件;步驟B、判斷是否存在已閉合的REDO/UNDO事務(wù)塊結(jié)點(diǎn),若是,執(zhí)行步驟C,否則,執(zhí)行步驟D,所述REDO/UNDO事務(wù)塊表示事務(wù)包含的所有日志的集合,所述已閉合的REDO/UNDO事務(wù)塊由TRANSACTION—BEGIN起始,以TRANSACTION—COMMIT或者TRANSACTION—ROLLBACK結(jié)尾;步驟C、把所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)指針賦給輸出變量,返回獲取REDO/UNDO事務(wù)塊成功狀態(tài)值;步驟D、依次解析混合日志文件的日志行,執(zhí)行生成所述REDO/UNDO事務(wù)塊的操作,再執(zhí)行步驟B。8、根據(jù)權(quán)利要求7所述的混合日志解析方法,其特征在于,所述步驟D中執(zhí)行生成所述REDO/UNDO事務(wù)塊的操作包括以下步驟解析遇到日志行是TRANSACTION—BEGIN,生成REDO/UNDO事務(wù)塊結(jié)點(diǎn),再依次判斷日志行所屬命令類型,遇到日志行是TRANSACTION—END,并置所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)為閉合標(biāo)志。9、根據(jù)權(quán)利要求7或8所述的混合日志解析方法,其特征在于,所述REDO/UNDO事務(wù)塊包括語句塊,所述語句塊以op_BEGIN開始,閉合的語句塊以op—BEGIN開始,op_END結(jié)尾,op為DML命令,所述步驟D依次解析混合日志文件的日志行包括解析遇到所述日志行是叩—BEGIN,生成語句塊結(jié)點(diǎn),再依次判斷日志行所屬命令類型,遇到日志行是叩—END,并置所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)為閉合標(biāo)志。10、根據(jù)權(quán)利要求9所述的混合日志解析方法,其特征在于,所述步驟C替換為獲取當(dāng)前語句塊,根據(jù)當(dāng)前語句塊生成下一條同步SQL語句,內(nèi)部指針偏移到下一條未處理日志行或者下一個(gè)語句塊節(jié)點(diǎn),并判斷是否生成同步SQL語句,若是,返回獲取同步SQL語句成功狀態(tài)值,否則,返回具體錯(cuò)誤狀態(tài)值。全文摘要本發(fā)明公開了一種混合日志生成方法和解析方法。其中,混合日志生成方法包括打開或創(chuàng)建混合日志文件;接收用戶命令,并判斷所述用戶命令的類型;根據(jù)所述判斷得出的用戶命令的類型,登記相應(yīng)的命令類型日志?;旌先罩窘馕龇椒òˋ.申請(qǐng)日志解析器句柄,打開混合日志文件;B.判斷是否存在已閉合的REDO/UNDO事務(wù)塊結(jié)點(diǎn),若是,執(zhí)行步驟C,否則,執(zhí)行步驟D;C.把所述REDO/UNDO事務(wù)塊結(jié)點(diǎn)指針賦給輸出變量,返回獲取REDO/UNDO事務(wù)塊成功狀態(tài)值;D.依次解析混合日志文件的日志行,執(zhí)行生成所述REDO/UNDO事務(wù)塊的操作,再執(zhí)行步驟B。所述混合日志綜合事務(wù)日志和同步日志的所有信息,消除冗余信息。文檔編號(hào)G06F17/30GK101464890SQ200810241899公開日2009年6月24日申請(qǐng)日期2008年12月30日優(yōu)先權(quán)日2008年12月30日發(fā)明者印和平,李世亮,陳河堆申請(qǐng)人:中興通訊股份有限公司