專利名稱::一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種數(shù)據(jù)庫技術(shù),更確切地說是涉及一種基于類似嵌入式數(shù)據(jù)庫(如SharkBase)的數(shù)據(jù)備份和恢復(fù)方法。
背景技術(shù):
:嵌入式系統(tǒng)是一種以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)的專用計(jì)算機(jī)系統(tǒng),其特點(diǎn)是軟硬件可裁剪,并能適于應(yīng)用系統(tǒng)對功能、可靠性、成本、功耗等的嚴(yán)格要求,用于實(shí)現(xiàn)對其他設(shè)備的控制、監(jiān)視或管理。由于嵌入式系統(tǒng)通常是面向特定應(yīng)用的,因而與通用型計(jì)算機(jī)系統(tǒng)相比具有定制性強(qiáng)的特點(diǎn)?,F(xiàn)有的采用嵌入式系統(tǒng)的嵌入式產(chǎn)品,包括信息電器類、移動計(jì)算設(shè)備類、網(wǎng)絡(luò)設(shè)備類、工控仿真醫(yī)療儀器類,如手機(jī)、個人數(shù)字助理機(jī)(PDA)、VCD、機(jī)項(xiàng)盒、數(shù)控機(jī)床、路由器、網(wǎng)絡(luò)家電等。嵌入式系統(tǒng)發(fā)展中最重要的兩方面技術(shù)是數(shù)據(jù)交換和應(yīng)用交換。嵌入式數(shù)據(jù)庫對嵌入式產(chǎn)品有著十分重要的意義,在基于嵌入式數(shù)據(jù)庫的應(yīng)用解決方案中,嵌入式應(yīng)用是直接使用嵌入式數(shù)據(jù)庫的第一級應(yīng)用,目前的嵌入式架構(gòu),使嵌入式數(shù)據(jù)庫系統(tǒng)能夠和嵌入式操作系統(tǒng)有機(jī)地結(jié)合在一起,為應(yīng)用開發(fā)提供有效的本地?cái)?shù)據(jù)管理手段,同時(shí)提供各種定制條件和方法。對嵌入式產(chǎn)品數(shù)據(jù)庫的要求是在訪問其他如PC機(jī)、數(shù)據(jù)庫服務(wù)器等電子設(shè)備的數(shù)據(jù)時(shí)應(yīng)該暢通無阻;同時(shí),要求其數(shù)據(jù)可以自由地在嵌入式平臺之間移植。嵌入式數(shù)據(jù)庫(SharkBase)數(shù)據(jù)采用的是基于目錄結(jié)構(gòu)的多文件數(shù)據(jù)存儲方式,表單中的數(shù)據(jù)記錄和索引分別存放在不同的文件中,它們存放在同一個目錄下從而表示這些文件同屬于一個表單。這些表單由一個全局的表單索引文件進(jìn)行管理,以方便對數(shù)據(jù)庫表單的查找,這些表單目錄和表單索引文件、關(guān)系索引文件、日志目錄等其他索引信息文件共同組成了一個SharkBase嵌入式數(shù)據(jù)庫整體。由于嵌入式設(shè)備對軟件運(yùn)行有比較高的穩(wěn)定性與可靠性要求,數(shù)據(jù)的操作又隨時(shí)會產(chǎn)生錯誤或丟失,為保證嵌入式產(chǎn)品的穩(wěn)定性,對保存在嵌入式產(chǎn)品中的數(shù)據(jù)進(jìn)行管理并采用相應(yīng)的備份與恢復(fù)是提高穩(wěn)定與可靠性的一個好方法。目前已有很多種嵌入式數(shù)據(jù)庫產(chǎn)品,提供的功能也各有特色,但缺少對數(shù)據(jù)安全性的設(shè)計(jì),如“人大小金靈”數(shù)據(jù)庫等就沒有提供數(shù)據(jù)備份與恢復(fù)的操作??梢哉f現(xiàn)存的各種嵌入式數(shù)據(jù)庫對數(shù)據(jù)備份與恢復(fù)方面的安全性處理涉及很少,針對類似SharkBase這種基于多文件結(jié)構(gòu)的數(shù)據(jù)庫系統(tǒng)的備份與恢復(fù)方法涉及得就更少。由于嵌入式設(shè)備系統(tǒng)資源有限,不能提供較大的數(shù)據(jù)備份區(qū),也不能提供給數(shù)據(jù)備份與恢復(fù)操作過多的CPU和內(nèi)存等各種資源,因此,需要在盡量少的占用系統(tǒng)資源的前提下設(shè)計(jì)出速度較快、維護(hù)方便的數(shù)據(jù)庫備份與恢復(fù)方法。目前,一般的數(shù)據(jù)備份與恢復(fù)方法并沒有多地提到嵌入式設(shè)備,即這些方法在嵌入式設(shè)備中的適用性不強(qiáng)。
發(fā)明內(nèi)容本發(fā)明的目的是設(shè)計(jì)一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,在盡量少的占用系統(tǒng)資源的前提下,設(shè)計(jì)出速度較快,維護(hù)方便的、基于多文件結(jié)構(gòu)的數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)備份與恢復(fù)方法,以提高嵌入式設(shè)備數(shù)據(jù)級的安全性。實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案是這樣的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述的數(shù)據(jù)備份方法,包括A.將數(shù)據(jù)庫備份文件劃分為頭部信息區(qū)、數(shù)據(jù)區(qū)和尾部信息區(qū);B.將原數(shù)據(jù)庫信息和多個表單信息填充寫入數(shù)據(jù)庫備份文件的頭部信息區(qū),記載原數(shù)據(jù)庫數(shù)據(jù)文件和各個表單下每個索引文件在數(shù)據(jù)庫備份文件中的具體位置;C.在數(shù)據(jù)庫備份文件的數(shù)據(jù)區(qū)中,將原數(shù)據(jù)庫文件中的具體數(shù)據(jù)存儲到由數(shù)據(jù)庫備份文件頭部信息區(qū)信息指定的位置處;D.查詢數(shù)據(jù)庫數(shù)據(jù)字典,將數(shù)據(jù)庫文件中各表單的所有索引信息寫入數(shù)據(jù)庫備份文件的尾部信息區(qū);所述的數(shù)據(jù)恢復(fù)方法,包括E.讀取記載在數(shù)據(jù)庫備份文件頭部信息區(qū)的數(shù)據(jù)庫信息和多個表單信息;F.根據(jù)數(shù)據(jù)文件和各個表單下每個索引文件在數(shù)據(jù)庫備份文件中的具體位置,從數(shù)據(jù)庫備份文件的數(shù)據(jù)區(qū)讀取數(shù)據(jù);G.建立或恢復(fù)原數(shù)據(jù)庫數(shù)據(jù)文件和索引文件,使原數(shù)據(jù)庫信息恢復(fù)到數(shù)據(jù)庫備份時(shí)的狀態(tài);H.根據(jù)記錄在數(shù)據(jù)庫備份文件尾部信息區(qū)的所有索引信息將原數(shù)據(jù)庫的索引信息重新寫入數(shù)據(jù)庫數(shù)據(jù)字典中。本發(fā)明針對SbarkBase嵌入式數(shù)據(jù)庫這種基于多文件結(jié)構(gòu)的數(shù)據(jù)庫系統(tǒng),設(shè)計(jì)了由文件目錄聚合成單一備份文件的方法,以及根據(jù)這個單一備份文件頭部描述信息將其拆分成多個文件和目錄的方法,和適合嵌入式系統(tǒng)的備份文件尋址方法,可有效減少備份恢復(fù)過程所占用的系統(tǒng)資源,提高運(yùn)算速度的安全性。本發(fā)明的基于SharkBase嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份與恢復(fù)方法,既滿足基于文件存儲模式的SharkBase嵌入式數(shù)據(jù)庫數(shù)據(jù)備份與恢復(fù)的需要,同時(shí)又能適應(yīng)嵌入式設(shè)備資源少、存儲空間小等的系統(tǒng)特性,是一種易于維護(hù)、高效、具有原子性操作性和基于單文件構(gòu)架數(shù)據(jù)組合和拆分技術(shù)的數(shù)據(jù)備份與恢復(fù)方法。本發(fā)明方法結(jié)合SharkBase數(shù)據(jù)庫數(shù)據(jù)的存儲方式,所設(shè)計(jì)的數(shù)據(jù)在文件中的存儲格式合理,可減少備份數(shù)據(jù)文件的垃圾空間、加快計(jì)算速度,提高SharkBase嵌入式數(shù)據(jù)庫的運(yùn)行效率和安全性。圖1是實(shí)施例備份文件頭部信息填充流程框圖;圖2是實(shí)施例備份文件數(shù)據(jù)區(qū)數(shù)據(jù)填充流程與備份文件尾部信息填充流程框圖;圖3是本發(fā)明數(shù)據(jù)庫恢復(fù)流程縮略框圖。具體實(shí)施例方式對于SharkBase嵌入式數(shù)據(jù)庫來說,數(shù)據(jù)備份操作的原子性是非常重要的一個環(huán)節(jié),在數(shù)據(jù)備份過程中任何一個環(huán)節(jié)出錯,都要回溯到數(shù)據(jù)的原始狀態(tài)重新操作,以保證數(shù)據(jù)的完整性?;谠擖c(diǎn)考慮,應(yīng)采用單文件的形式對數(shù)據(jù)進(jìn)行備份,以便在備份出現(xiàn)異常時(shí)能方便地刪除錯誤的備份文件。進(jìn)行數(shù)據(jù)備份的目的是為了保存數(shù)據(jù),以便在后續(xù)發(fā)生的對數(shù)據(jù)庫的錯誤操作時(shí)進(jìn)行數(shù)據(jù)恢復(fù)時(shí)使用。對備份的數(shù)據(jù)不進(jìn)行直接操作,用戶也不必了解備份文件的實(shí)際存儲方式,因此在數(shù)據(jù)庫備份文件中對備份數(shù)據(jù)庫的信息進(jìn)行記錄時(shí)采用二進(jìn)制形式,這種形式可減少數(shù)據(jù)存儲和讀取以及進(jìn)行數(shù)據(jù)解析的時(shí)間,節(jié)約備份文件所占用的磁盤空間。在進(jìn)行一次數(shù)據(jù)備份時(shí),必須對備份時(shí)間進(jìn)行記錄,即對備份文件進(jìn)行時(shí)間戳處理,以方便用戶對同一數(shù)據(jù)庫進(jìn)行多次備份、比較備份文件的版本以及在進(jìn)行恢復(fù)時(shí)選擇備份文件。采用壓縮的方式可以節(jié)約磁盤空間,但會加長備份時(shí)間和CPU的負(fù)荷,并增大對能源的耗費(fèi),而對于不同的嵌入式設(shè)備來說,對磁盤或CPU的限制是各有不同的。為了增強(qiáng)對不同嵌入式設(shè)備的適應(yīng)性,SharkBase嵌入式數(shù)據(jù)庫的備份系統(tǒng)采用兩者結(jié)合的局部壓縮方式,針對數(shù)據(jù)庫的數(shù)據(jù)特征,在對數(shù)據(jù)庫備份時(shí),對容易產(chǎn)生高壓縮率的數(shù)據(jù)文件和索引文件進(jìn)行壓縮處理,而對于描述數(shù)據(jù)庫信息的二進(jìn)制描述代碼則不作壓縮處理。這樣做不但能有效減小備份文件所占用的磁盤空間,又相對完全壓縮方式減少了CPU運(yùn)算。由于SharkBase數(shù)據(jù)庫的數(shù)據(jù)存儲方式采用多文件的數(shù)據(jù)存儲,而備份數(shù)據(jù)則是備份在同一數(shù)據(jù)文件中,為了在恢復(fù)數(shù)據(jù)庫文件時(shí)準(zhǔn)確拆分備份文件的數(shù)據(jù),在備份文件的頭部要有一個詳細(xì)描述備份文件數(shù)據(jù)塊的信息,標(biāo)明備份文件中的每一數(shù)據(jù)塊都代表什么意思,并將這些信息寫在備份文件的頭部,以方便數(shù)據(jù)庫的恢復(fù)。由于SbarkBase數(shù)據(jù)庫采用了數(shù)據(jù)字典方式記錄數(shù)據(jù)庫中表單的索引信息,而數(shù)據(jù)庫本身并沒有記錄這些內(nèi)容,因此必須查找數(shù)據(jù)字典,將與這個數(shù)據(jù)庫有關(guān)的所有索引信息摘錄到備份文件中,并在恢復(fù)數(shù)據(jù)庫時(shí)將這些索引信息恢復(fù)。由于數(shù)據(jù)庫的索引個數(shù)并不固定,因此這部分信息的大小也不固定,如果將這部分內(nèi)容放到備份數(shù)據(jù)的頭部,則數(shù)據(jù)庫數(shù)據(jù)文件將無法被準(zhǔn)確定位到備份文件中,因此將這部分內(nèi)容放到備份文件的尾部。最后,在恢復(fù)數(shù)據(jù)庫時(shí),由于數(shù)據(jù)庫結(jié)構(gòu)可能已經(jīng)被破壞,必須將數(shù)據(jù)字典中有關(guān)這個數(shù)據(jù)庫的所有字典信息進(jìn)行恢復(fù),以便使得數(shù)據(jù)字典中的信息與原數(shù)據(jù)庫一致。以上各點(diǎn)是本發(fā)明基于SharkeBase數(shù)據(jù)庫數(shù)據(jù)備份與恢復(fù)的關(guān)鍵技術(shù)分析。根據(jù)以上所述,本發(fā)明為SharkBase數(shù)據(jù)庫數(shù)據(jù)備份文件制定了其內(nèi)部格式,由頭部信息區(qū)、數(shù)據(jù)區(qū)和尾部信息區(qū)三部分組成。數(shù)據(jù)庫數(shù)據(jù)備份文件的頭部信息區(qū)存儲在備份文件的開始位置,用于描述源SharkBase數(shù)據(jù)庫的架構(gòu)信息以及源SharkBase數(shù)據(jù)庫的數(shù)據(jù)在備份文件中的具體存儲偏移量和數(shù)據(jù)塊的大小,即數(shù)據(jù)庫信息。通過該部分頭部信息,程序可以恢復(fù)源SharkBase數(shù)據(jù)庫的文件目錄架構(gòu),并快速定位SharkBase數(shù)據(jù)庫文件的具體數(shù)據(jù)。由于SharkBase數(shù)據(jù)庫可能存在多個表單,每個表單又可能存在多個索引文件,則表單信息必須記錄所有表單在備份文件中位置的具體信息,而每一個表單信息中必須記錄這個表單所有索引文件在備份文件中位置的具體信息。因此備份文件的頭部包括一個數(shù)據(jù)庫信息、多個表單信息及各表單下的多個索引信息。數(shù)據(jù)庫(db)頭部信息區(qū)包括的數(shù)據(jù)庫信息的內(nèi)容如下表1所示,用數(shù)據(jù)庫信息描述及其長度兩部分分別說明表1由于SharkBase數(shù)據(jù)庫每個表單的最大域個數(shù)為20,而這20個域都可能有索引。因此,備份文件頭部表單信息描述部分為每一個表單的描述信息預(yù)留出20個描述其索引的位置,這些位置足以容納表單中所有索引信息。下面列出一個表單描述信息的樣例,如果一個數(shù)據(jù)庫存在N個表單,則在備份文件中存在N個這樣的表單描述信息。數(shù)據(jù)庫(db)頭部信息區(qū)包括的表單信息的內(nèi)容如下表2所示,用表單信息描述及其長度兩部分分別說明表2表中的省略號表示索引2至19的Idxname索引名,Idx_off索引在備份文件中的偏移量,和Idx_len索引在備份文件中的大小。備份文件的數(shù)據(jù)區(qū)存儲SharkBase數(shù)據(jù)庫文件中的具體數(shù)據(jù),這些數(shù)據(jù)在備份文件中的位置和大小已經(jīng)通過頭部信息區(qū)確定,它們的位置不能隨意調(diào)換。備份文件數(shù)據(jù)區(qū)的數(shù)據(jù)存放形式如下表3所示,用數(shù)據(jù)描述及其大小兩部分分別說明表3表中的2至4行部分,表示用于記錄原SharkBase數(shù)據(jù)庫索引文件的具體數(shù)據(jù);5至8行部分表示用于記錄SharkBase數(shù)據(jù)庫第一個表單數(shù)據(jù)文件、索引文件的具體數(shù)據(jù),共有N個索引文件的數(shù)據(jù);9至11行表示用于記錄SharkBase數(shù)據(jù)庫第二至第M個表單數(shù)據(jù)文件、索引文件的具體數(shù)據(jù),可各有最大值為N的多個索引文件的數(shù)據(jù),M與N可以相同也可以不同。根據(jù)以上內(nèi)容可知,由于SharkBase數(shù)據(jù)庫表單索引文件大小的不確定性,無法在備份文件中劃分出固定的區(qū)域來存放索引信息,因此將SharkBase數(shù)據(jù)庫每個表單的索引信息寫到備份文件的末尾。備份文件尾部信息區(qū)一個表單索引信息的具體存儲形式用下表4列出,用數(shù)據(jù)描述及其大小兩部分分別說明表4在進(jìn)行具體的SharkBase數(shù)據(jù)庫備份時(shí),由于采用壓縮技術(shù)的備份和不采用壓縮技術(shù)的備份在整個備份/恢復(fù)過程中的差異很小,故只對不采用壓縮技術(shù)的備份過程進(jìn)行說明。數(shù)據(jù)庫備份從整體上說可分為五個步驟進(jìn)行第一步備份程序查找用戶給出的備份文件路徑,如果備份文件不存在,則建立備份文件,跳到第二步繼續(xù)執(zhí)行;如果備份文件存在,則將備份文件的創(chuàng)建時(shí)間與原數(shù)據(jù)庫每個表單中數(shù)據(jù)文件的最近修改時(shí)間進(jìn)行比較,如果備份文件的創(chuàng)建時(shí)間比原數(shù)據(jù)庫任一表單數(shù)據(jù)文件的最近修改時(shí)間都新,則說明從上次備份之后,原數(shù)據(jù)庫沒有做過任何改動,則退出備份操作,否則繼續(xù)執(zhí)行;第二步備份程序填充備份文件頭部信息區(qū)中的數(shù)據(jù)庫信息部分(可對照表1),并寫入備份文件中,包括原數(shù)據(jù)庫的路徑、當(dāng)前的時(shí)間、標(biāo)志壓縮標(biāo)志位和原數(shù)據(jù)庫中所含表單個數(shù),然后填充tableidx_off、tableidx_len、relate_off、relate_len、query_off、query_len六項(xiàng),這六項(xiàng)數(shù)據(jù)的算法公式如下先設(shè)Dbinfo_Size備份文件頭部信息區(qū)數(shù)據(jù)庫信息結(jié)構(gòu)體大小;Tableinfo_Size備份文件頭部信息區(qū)一個表單信息結(jié)構(gòu)體大??;Ntable原數(shù)據(jù)庫表單個數(shù);TableIdx_Len原數(shù)據(jù)庫表單索引文件的大??;RelateIdx_Len原數(shù)據(jù)庫關(guān)系索引文件的大小;QueryIdx_Len原數(shù)據(jù)庫查詢索引文件的大小。根據(jù)SharkBase數(shù)據(jù)庫備份文件內(nèi)部格式描述(對照表3),則tableidx_off=Dbinfo_Size+Ntable*Tableinfo_Size(數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量(tableidx_off)等于備份文件頭部信息區(qū)數(shù)據(jù)庫信息結(jié)構(gòu)體大小(Dbinfo_Size)加上原數(shù)據(jù)庫表單個數(shù)(Ntable)與備份文件頭部信息區(qū)一個表單信息結(jié)構(gòu)體大小(Tableinfo_Size)的乘積);tableidx_len=TableIdx_len(數(shù)據(jù)庫表單索引文件的數(shù)據(jù)大小(tableidx_len)等于原數(shù)據(jù)庫表單索引文件的大小(TableIdx_Len));relate_off=tableidx_off+tableidx_len(數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)在備份文件中的偏移量(relate_off)等于原數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量(tableidx_off)加上原數(shù)據(jù)庫表單索引文件的數(shù)據(jù)大小(tableidx_len));relate_len=RelateIdx_len(數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)大小(relate_len)等于原數(shù)據(jù)庫關(guān)系索引文件的大小(RelateIdx_Len));query_off=tableidx_off+RelateIdx_len(數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)在備份文件中的偏移量(query_off)等于數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量(tableidx_off)加上原數(shù)據(jù)庫關(guān)系索引文件的大小(RelateIdx_Len));query_len=QueryIdx_Len(數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)大小(query_len)等于原數(shù)據(jù)庫查詢索引文件的大小(QueryIdx_Len))。第三步備份程序?qū)γ總€表單信息(參照表2)進(jìn)行填充,并寫入備份文件,第X個表單的表單信息Dat_off、Dat_len、Idx_off1、Idx_len1、Idx_off2、Idx_len2、…、Idx_off20、Idx_len20的計(jì)算公式為設(shè)這個原數(shù)據(jù)庫第X個表單共有3個索引文件,則tDat_Len表單數(shù)據(jù)文件大?。籺Idx0_Len第一個索引文件的大??;tIdx1_Len第二個索引文件的大??;tIdx2_Len第三個索引文件的大小。根據(jù)SbarkBase數(shù)據(jù)庫備份文件內(nèi)部格式(參照表3)描述,則Dat_off=query_off+QueryIdx_Len+(M-1)*Tableinfo_Size(M為表單個數(shù),表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量(Dat_off),等于數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)在備份文件中的偏移量(query_off)加上原數(shù)據(jù)庫查詢索引文件的大小(QueryIdx_Len)加上(M-1)倍的備份文件頭部信息區(qū)一個表單信息結(jié)構(gòu)體大小(Tableinfo_Size));Dat_len=hDat_len(表單數(shù)據(jù)文件數(shù)據(jù)的大小(Dat_len)等于該h表單的表單數(shù)據(jù)文件的大小(hDat_Len));Idx_off0=Dat_off+tDat_len第一個索引文件在備份文件中的偏移量(Idx_off)等于該表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量(Dat_off)加上第t表單數(shù)據(jù)文件大小(Dat_Len));Idx_len0=tIdx0_Len(第一個索引文件在備份文件中的大小(Idx_len)等于第一個索引文件在備份文件中的大小));Idx_off1=Idx_off0+tIdx0_LenIdx_len1=tIdx0_LenIdx_off2=Idx_off1+tIdx1_LenIdx_len2=tIdx1_Len(第二個索引文件后的索引文件在備份文件中的偏移量(Idx_off)等于其上一個索引文件在備份文件中的偏移量(Idx_off)加上其上一個索引文件在備份文件中的大??;第二個索引文件后的索引文件的大小等于其上一個索引文件在備份文件中的大小)。式中t表示要提取數(shù)據(jù)的表單之前的那個表單,因此可以通過t這個表單加上一定的偏移量來得到所要的數(shù)據(jù)。由于這個表單只有三個索引文件(0-2),則Idx_off3、Idx_len3到Idx_off19、Idx_len19都置為0,表示這個表單從第三個域開始沒有索引,則在備份文件頭部的表單信息描述中,從第三個域開始將偏移量信息都置為零,即相應(yīng)域沒有索引文件;第四步備份程序根據(jù)SharkBase數(shù)據(jù)庫備份文件內(nèi)部格式描述(表3),依次將原數(shù)據(jù)庫各索引文件、數(shù)據(jù)文件數(shù)據(jù)寫入備份文件;第五步備份程序查詢SharkBase數(shù)據(jù)庫數(shù)據(jù)字典,從數(shù)據(jù)字典中讀出原數(shù)據(jù)庫所有表單的索引信息和約束信息,并根據(jù)SharkBase數(shù)據(jù)庫備份文件內(nèi)部格式(表3)描述,將各表單的索引信息利用與步驟三相同的方法,依次寫入備份文件的末尾,完成一次SharkBase數(shù)據(jù)庫備份操作。相對于數(shù)據(jù)庫備份方法,SharkBase數(shù)據(jù)庫的恢復(fù)方法比較簡單。由SbarkBase數(shù)據(jù)庫恢復(fù)程序從備份數(shù)據(jù)庫頭部信息區(qū)確定原數(shù)據(jù)庫目錄文件架構(gòu);根據(jù)頭部信息對原數(shù)據(jù)庫每個索引文件、數(shù)據(jù)文件在備份文件中的具體位置描述,從備份文件的數(shù)據(jù)區(qū)讀取數(shù)據(jù),建立或恢復(fù)原有的數(shù)據(jù)庫索引、數(shù)據(jù)文件,使原數(shù)據(jù)庫信息恢復(fù)到數(shù)據(jù)庫備份時(shí)的狀態(tài);最后,SharkBase數(shù)據(jù)庫恢復(fù)程序根據(jù)記錄在備份文件末尾索引區(qū)的索引信息,將原數(shù)據(jù)庫的索引信息重新寫入SharkBase數(shù)據(jù)庫數(shù)據(jù)字典中即可。這樣SharkBase數(shù)據(jù)庫將備份文件中的數(shù)據(jù)等信息重新寫入了原數(shù)據(jù)庫,使得原數(shù)據(jù)庫的數(shù)據(jù)信息、索引信息、數(shù)據(jù)字典信息都恢復(fù)到了原數(shù)據(jù)庫進(jìn)行備份時(shí)的狀態(tài),保證了數(shù)據(jù)的完整性和一致性。下面結(jié)合一個實(shí)施例及附圖1、2、3,進(jìn)一步說明本發(fā)明的備份與恢復(fù)方法。假設(shè)一個數(shù)據(jù)庫db包括兩個表單t1和t2,表單t1有三個域(field),其中域field1和field2有索引,即存在索引文件;表單t2有四個域,其中域field3有索引。對這個數(shù)據(jù)庫的備份流程由圖1、圖2給出,對這個數(shù)據(jù)庫的恢復(fù)流程由圖3給出。參見圖1,圖中示出備份文件頭部信息填充流程,包括步驟101至107,完成備份文件頭部信息區(qū)數(shù)據(jù)庫信息的填充(實(shí)現(xiàn)表1結(jié)構(gòu)),其中步驟101至104,按步驟將備份數(shù)據(jù)庫db的路徑信息(dbpath)、本地時(shí)間(timestamp)、壓縮標(biāo)志(Comp_flag)和表單個數(shù)(tablecount)填充到備份文件的頭部;步驟105至107,通過前述第二步的公式將計(jì)算后的表單索引文件位置信息(tableidx_off,tableidx_len)、關(guān)系索引文件位置信息(relate_off,relate_len)及查詢索引文件位置信息(query_off,query_len)填充到備份文件的頭部,位置信息包括各文件的數(shù)據(jù)在備份文件中的偏移量及數(shù)據(jù)大小;步驟108至115,完成備份文件頭部信息區(qū)表單信息的填充與設(shè)置(實(shí)現(xiàn)表2結(jié)構(gòu)),其中步驟108至110,按步驟記錄表單t1的表單名(Tablename)、設(shè)置索引標(biāo)志位(Has_idx)和記錄索引個數(shù)(Idx_off);步驟111,通過前述第三步的公式將計(jì)算后的表單t1的表單數(shù)據(jù)文件位置信息(Dat_off,Dat_len)填充到備份文件的頭部,位置信息包括表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量及數(shù)據(jù)大??;步驟112至113,按步驟先后記錄表單t1的索引文件1、索引文件2的索引名(Idxname1)和通過前述第三步的公式將計(jì)算后的索引文件1、索引文件2的位置信息(Idx_off1,Idx_len1、Idx_off2,Idx_len2)填充到備份文件的頭部,位置信息包括索引文件的數(shù)據(jù)在備份文件中的偏移量及數(shù)據(jù)大小;步驟114,通過前述第三步的公式將計(jì)算后的表單t2的表單數(shù)據(jù)文件位置信息(Dat_off,Dat_len)填充到備份文件的頭部,位置信息包括表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量及數(shù)據(jù)大??;步驟115,記錄表單t2的索引文件3的索引名(Idxname1)和通過前述第三步的公式將計(jì)算后的索引文件3的位置信息(Idx_off3,Idx_len3)填充到備份文件的頭部,位置信息包括索引文件的數(shù)據(jù)在備份文件中的偏移量及數(shù)據(jù)大小。參見圖2,接圖1操作,在完成備份文件頭部信息填充流程后,通過步驟201至208進(jìn)行備份文件數(shù)據(jù)區(qū)數(shù)據(jù)填充流程(按表3結(jié)構(gòu)),通過步驟209至214進(jìn)行備份文件尾部信息填充流程(按表4結(jié)構(gòu))。步驟201至203,根據(jù)頭部信息按步驟將數(shù)據(jù)庫表單索引文件中的數(shù)據(jù)、數(shù)據(jù)庫關(guān)系索引文件中的數(shù)據(jù)、數(shù)據(jù)庫查詢索引文件中的數(shù)據(jù)填充到備份文件數(shù)據(jù)區(qū),即記錄原數(shù)據(jù)庫索引文件的具體數(shù)據(jù);步驟204至206,根據(jù)頭部信息將表單t1數(shù)據(jù)文件中的數(shù)據(jù)填充到備份文件數(shù)據(jù)區(qū)的相應(yīng)位置,和先后將表單t1索引文件1、索引文件2中的數(shù)據(jù)填充到備份文件數(shù)據(jù)區(qū)的相應(yīng)位置;步驟207至208,根據(jù)頭部信息將表單t2數(shù)據(jù)文件中的數(shù)據(jù)填充到備份文件數(shù)據(jù)區(qū)的相應(yīng)位置,和將表單t2索引文件3中的數(shù)據(jù)填充到備份文件數(shù)據(jù)區(qū)的相應(yīng)位置;步驟209至211,將表單t1的表單名填充到備份文件尾部的相應(yīng)位置,和將表單t1的索引文件1、索引文件2的文件名填充到備份文件尾部的相應(yīng)位置;步驟212至213,將表單t2的表單名填充到備份文件尾部的相應(yīng)位置,和將表單t2的索引文件3的文件名填充到備份文件尾部的相應(yīng)位置;步驟214,至此完成備份,關(guān)閉備份文件。參見圖3,數(shù)據(jù)庫恢復(fù)流程是備份流程的逆過程,不再詳述,圖中僅給出恢復(fù)的縮略過程。包括步驟301至303,從備份文件頭部讀取備份數(shù)據(jù)庫信息,判斷原數(shù)據(jù)庫是否存在,如果存在,則刪除原數(shù)據(jù)庫執(zhí)行步驟304,如果不存在則直接執(zhí)行步驟304;步驟304,根據(jù)數(shù)據(jù)庫信息建立原數(shù)據(jù)庫,這時(shí)的這個數(shù)據(jù)庫是空數(shù)據(jù)庫;步驟305至307,按步驟先后根據(jù)備份文件頭部區(qū)與數(shù)據(jù)區(qū)中記載的數(shù)據(jù)庫信息恢復(fù)數(shù)據(jù)庫的索引文件、根據(jù)備份文件頭部區(qū)與數(shù)據(jù)區(qū)中記載的表單信息恢復(fù)數(shù)據(jù)庫的表單,和根據(jù)備份文件尾部區(qū)信息記載的數(shù)據(jù)庫表單索引信息恢復(fù)數(shù)據(jù)庫表單索引;步驟308,至此完成恢復(fù),關(guān)閉備份文件。本發(fā)明的數(shù)據(jù)庫備份與恢復(fù)方法,是針對SharkBase嵌入式數(shù)據(jù)庫數(shù)據(jù)量少、安全性要求高等特性,同時(shí)針對嵌入式設(shè)備只有有限的系統(tǒng)資源的情況,采用基于文件級別的安全算法,同時(shí)加強(qiáng)操作的原子性而設(shè)計(jì)的。其算法易于維護(hù)、安全性高、速度快、用戶操作簡便。使得采用本發(fā)明方法的SharkBase嵌入式數(shù)據(jù)庫與同類產(chǎn)品相比,在安全性方面占有很大的優(yōu)勢,提高了SharkBase嵌入式數(shù)據(jù)庫與同類產(chǎn)品的競爭力。同時(shí),本發(fā)明的數(shù)據(jù)備份與恢復(fù)方法對系統(tǒng)平臺基本沒有要求,對CPU、內(nèi)存的要求低,可以方便地移植到其他嵌入式應(yīng)用程序中,因而有比較廣泛的應(yīng)用前景。權(quán)利要求1.一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述的數(shù)據(jù)備份方法,包括A.將數(shù)據(jù)庫備份文件劃分為頭部信息區(qū)、數(shù)據(jù)區(qū)和尾部信息區(qū);B.將原數(shù)據(jù)庫信息和多個表單信息填充寫入數(shù)據(jù)庫備份文件的頭部信息區(qū),記載原數(shù)據(jù)庫數(shù)據(jù)文件和各個表單下每個索引文件在數(shù)據(jù)庫備份文件中的具體位置;C.在數(shù)據(jù)庫備份文件的數(shù)據(jù)區(qū)中,將原數(shù)據(jù)庫文件中的具體數(shù)據(jù)存儲到由數(shù)據(jù)庫備份文件頭部信息區(qū)信息指定的位置處;D.查詢數(shù)據(jù)庫數(shù)據(jù)字典,將數(shù)據(jù)庫文件中各表單的所有索引信息寫入數(shù)據(jù)庫備份文件的尾部信息區(qū);所述的數(shù)據(jù)恢復(fù)方法,包括E.讀取記載在數(shù)據(jù)庫備份文件頭部信息區(qū)的數(shù)據(jù)庫信息和多個表單信息;F.根據(jù)數(shù)據(jù)文件和各個表單下每個索引文件在數(shù)據(jù)庫備份文件中的具體位置,從數(shù)據(jù)庫備份文件的數(shù)據(jù)區(qū)讀取數(shù)據(jù);G.建立或恢復(fù)原數(shù)據(jù)庫數(shù)據(jù)文件和索引文件,使原數(shù)據(jù)庫信息恢復(fù)到數(shù)據(jù)庫備份時(shí)的狀態(tài);H.根據(jù)記錄在數(shù)據(jù)庫備份文件尾部信息區(qū)的所有索引信息將原數(shù)據(jù)庫的索引信息重新寫入數(shù)據(jù)庫數(shù)據(jù)字典中。2.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟A中的頭部信息區(qū)存儲在所述數(shù)據(jù)庫備份文件的開始位置。3.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟B中填充寫入所述的原數(shù)據(jù)庫信息進(jìn)一步包括b11.填充寫入原數(shù)據(jù)庫的路徑、當(dāng)前備份數(shù)據(jù)庫的時(shí)間、標(biāo)志壓縮與否的標(biāo)志位和原數(shù)據(jù)庫中所含表單個數(shù);b12.填充寫入數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量(tableidx_off)、數(shù)據(jù)庫表單索引文件的數(shù)據(jù)大小(tableidx_len)、數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)在備份文件中的偏移量(relate_off)、數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)大小(relate_len)、數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)在備份文件中的偏移量(query_off)和數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)大小(query_len);所述步驟B中填充寫入所述的表單信息進(jìn)一步包括b21.依序填充寫入每個表單信息,每個表單信息包括表單名、記錄該表單是否有索引的索引標(biāo)志位、有索引時(shí)的索引個數(shù)、表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量(Dat_off)、表單數(shù)據(jù)文件數(shù)據(jù)的大小(Dat_len),和依序填充寫入該表單下的每個索引文件信息,每個索引文件信息包括索引文件名、該索引文件在備份文件中的偏移量(Idx_off)和該索引文件在備份文件中的大小(Idx_len)。4.根據(jù)權(quán)利要求3所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟b11前,還根據(jù)用戶給出的備份文件的路徑查找備份文件,在備份文件不存在時(shí)創(chuàng)建備份文件,執(zhí)行所述步驟b11;在備份文件存在時(shí),進(jìn)一步將備份文件的建立時(shí)間與原數(shù)據(jù)庫每個表單的數(shù)據(jù)文件最近的修改時(shí)間進(jìn)行比較,在備份文件的建立時(shí)間新于原數(shù)據(jù)庫任一個表單的數(shù)據(jù)文件最近的修改時(shí)間時(shí),退出備份過程,否則執(zhí)行所述步驟b11。5.根據(jù)權(quán)利要求3所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟b12中的填充寫入各項(xiàng)滿足tableidx_off=Dbinfo_Size+Ntable*Tableinfo_Size,其中,tableidx_off是數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量,Dbinfo_Size是備份文件頭部信息區(qū)數(shù)據(jù)庫信息結(jié)構(gòu)體大小,Ntable是原數(shù)據(jù)庫表單個數(shù),Tableinfo_Size是備份文件頭部信息區(qū)一個表單信息結(jié)構(gòu)體大?。籺ableidx_len=TableIdx_len,其中,tableidx_len是數(shù)據(jù)庫表單索引文件的數(shù)據(jù)大小,TableIdx_Len是原數(shù)據(jù)庫表單索引文件的大小;relate_off=tableidx_off+tableidx_len,其中,relate_off是數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)在備份文件中的偏移量,tableidx_off是原數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量,tableidx_len是原數(shù)據(jù)庫表單索引文件的數(shù)據(jù)大?。籸elate_len=RelateIdx_len,其中,relate_len是數(shù)據(jù)庫關(guān)系索引文件的數(shù)據(jù)大小,RelateIdx_Len是原數(shù)據(jù)庫關(guān)系索引文件的大小;query_off=tableidx_off+RelateIdx_len,其中,query_off是數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)在備份文件中的偏移量,tableidx_off是數(shù)據(jù)庫表單索引文件的數(shù)據(jù)在備份文件中的偏移量,RelateIdx_Len是原數(shù)據(jù)庫關(guān)系索引文件的大?。缓?,query_len=QueryIdx_Len,其中query_len是數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)大小,QueryIdx_Len是原數(shù)據(jù)庫查詢索引文件的大小。6.根據(jù)權(quán)利要求3所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟b21中,填充寫入的表單數(shù)據(jù)文件及索引文件信息滿足Dat_off=query_off+QuerIdx_Len+(M-1)*Tableinfo_Size,其中,Dat_off是表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量,query_off是數(shù)據(jù)庫查詢索引文件的數(shù)據(jù)在備份文件中的偏移量,QueryIdx_Len是原數(shù)據(jù)庫查詢索引文件的大小,Tableinfo_Size是備份文件頭部信息區(qū)一個表單信息結(jié)構(gòu)體大小,M為數(shù)據(jù)庫中含有表單的總個數(shù);Dat_len=hDat_len,其中,Dat_len是表單數(shù)據(jù)文件數(shù)據(jù)的大小,hDat_len是該h表單的表單數(shù)據(jù)文件的大??;Idx_off0=Dat_off+tDat_len,其中,Idx_off0是第一個索引文件在備份文件中的偏移量,Dat_off是該表單數(shù)據(jù)文件的數(shù)據(jù)在備份文件中的偏移量,tDat_Len是第t表單數(shù)據(jù)文件大小,t表示要提取數(shù)據(jù)的表單之前的那個表單;第二個索引文件后的索引文件在備份文件中的偏移量等于其上一個索引文件在備份文件中的偏移量加上其上一個索引文件在備份文件中的大?。坏谝粋€索引文件在備份文件中的大小等于第一個索引文件在備份文件中的大?。坏诙€索引文件后的索引文件的大小等于其上一個索引文件在備份文件中的大小。7.根據(jù)權(quán)利要求6所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述備份文件頭部區(qū)表單信息描述部分為每一個表單的描述信息預(yù)留出N個描述其索引的位置,將位置空的索引文件在備份文件中的偏移量(Dat_off)都置為零,N為正整數(shù)。8.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述的步驟C是按備份文件數(shù)據(jù)區(qū)的數(shù)據(jù)存放格式進(jìn)行存儲的,先存儲記錄原數(shù)據(jù)庫索引文件的具體數(shù)據(jù),依序?yàn)楸韱嗡饕募臄?shù)據(jù)、關(guān)系索引文件的數(shù)據(jù)和查詢索引文件的數(shù)據(jù),再按順序存儲各個數(shù)據(jù)庫表單數(shù)據(jù)文件、索引文件的具體數(shù)據(jù),每個數(shù)據(jù)庫表單數(shù)據(jù)文件、索引文件的具體數(shù)據(jù),順序?yàn)槠浔韱螖?shù)據(jù)文件的數(shù)據(jù)和該表單的各索引文件的數(shù)據(jù)。9.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟D,是按表單名、表單的各個索引文件名依序?qū)懭胛膊啃畔^(qū)的,在表單有主索引時(shí),于尾部信息區(qū)寫入表單主索引名。10.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于所述步驟G進(jìn)一步包括根據(jù)備份文件頭部區(qū)和數(shù)據(jù)區(qū)中記載的數(shù)據(jù)庫信息恢復(fù)數(shù)據(jù)庫的索引文件,和根據(jù)備份文件頭部區(qū)和數(shù)據(jù)區(qū)中記載的表單信息恢復(fù)數(shù)據(jù)庫的表單文件;所述步驟H進(jìn)一步包括,根據(jù)備份文件尾部區(qū)中記載的數(shù)據(jù)庫表單索引信息恢復(fù)數(shù)據(jù)庫表單索引文件。11.根據(jù)權(quán)利要求1所述的一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,其特征在于在對嵌入式數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫備份時(shí),對容易產(chǎn)生高壓縮率的數(shù)據(jù)文件和索引文件進(jìn)行壓縮處理,對于描述數(shù)據(jù)庫信息的二進(jìn)制描述代碼不作壓縮處理。全文摘要本發(fā)明是一種嵌入式數(shù)據(jù)庫的數(shù)據(jù)備份和恢復(fù)方法,基于嵌入式產(chǎn)品資源少、存儲空間少的特性作出。數(shù)據(jù)備份包括將數(shù)據(jù)庫備份文件劃分為頭部信息區(qū)、數(shù)據(jù)區(qū)和尾部信息區(qū);將原數(shù)據(jù)庫信息和多個表單信息填充寫入數(shù)據(jù)庫備份文件的頭部信息區(qū),記載原數(shù)據(jù)庫數(shù)據(jù)文件和各個表單下每個索引文件在數(shù)據(jù)庫備份文件中的具體位置;在數(shù)據(jù)庫備份文件的數(shù)據(jù)區(qū)中,將原數(shù)據(jù)庫文件中的具體數(shù)據(jù)存儲到由數(shù)據(jù)庫備份文件頭部信息區(qū)信息指定的位置處;查詢數(shù)據(jù)庫數(shù)據(jù)字典,將數(shù)據(jù)庫文件中各表單的所有索引信息寫入數(shù)據(jù)庫備份文件的尾部信息區(qū)。數(shù)據(jù)恢復(fù)采用備份方法的逆過程進(jìn)行。是一種具有原子性操作、基于單文件架構(gòu)數(shù)據(jù)組合和拆分技術(shù)的數(shù)據(jù)備份與恢復(fù)方法。文檔編號G06F17/30GK1492362SQ02145959公開日2004年4月28日申請日期2002年10月25日優(yōu)先權(quán)日2002年10月25日發(fā)明者丁剛,孫雅莎,楊柏梁,丁剛申請人:聯(lián)想(北京)有限公司