專利名稱:數(shù)據(jù)庫中對象標識符回收再利用的方法
技術領域:
本發(fā)明涉及計算機數(shù)據(jù)庫,具體涉及數(shù)據(jù)庫中對象標識符(OID),特別是數(shù)據(jù)庫中對象標識符回收再利用的方法。
背景技術:
OID(object-identifier)是面向對象數(shù)據(jù)庫(OODBs)中提出的新概念。面向對象數(shù)據(jù)庫中采用了“面向對象”的方法,即實體類型用“類”表示,實體用“對象”表示,系統(tǒng)給數(shù)據(jù)庫中的每個對象賦予一個“對象標識符”(OID),起唯一標識作用。這種實現(xiàn)方法在語義上克服了以往“面向值”數(shù)據(jù)模型的缺點。OID的引入,避免了數(shù)據(jù)庫系統(tǒng)的變量冗余,使對象可以方便地被引用并共享。
但就現(xiàn)在看來,OODBs還不成熟,遠不能完全替代關系數(shù)據(jù)庫系統(tǒng)。因而人們轉入將面向對象數(shù)據(jù)庫的優(yōu)點(OID是其中必不可少的一部分)引入到關系數(shù)據(jù)庫中,形成了功能強大的對象關系數(shù)據(jù)庫。這種新型的數(shù)據(jù)模型中,OID的概念消除了傳統(tǒng)關系數(shù)據(jù)庫系統(tǒng)中存在的數(shù)據(jù)模型的缺陷。
OID作為面向對象數(shù)據(jù)庫以及對象關系數(shù)據(jù)庫中的一項非常重要的技術,也存在形式各樣的實現(xiàn)方法。目前使用廣泛的一種方法為句柄(handle)維護法,該系統(tǒng)每次生成新的對象,都將該句柄的值加一并賦給對象作為對象標志符,由于它簡單易行(編程簡單且管理方便且移植性強),因而適用廣泛,能夠有效應用于ORDBs和OODBs中。
然而,在句柄維護法中,位長的限制決定了數(shù)據(jù)庫中可用OID的個數(shù),一旦所有OID全部分配,則數(shù)據(jù)庫將面臨崩潰。為了避免OID資源耗盡而產生系統(tǒng)崩潰,目前一般采用以下兩種方法1、采用擴展OID的長度來增加可用OID的個數(shù)方法。但是該方案會引起OID對資源耗費的增加,而且實現(xiàn)更復雜。
2、對已廢棄的OID進行回收。就目前來看,回收不失為一種很好的方法。它可不需要考慮在整個數(shù)據(jù)庫生存周期中所需要的OID個數(shù),而將考慮范圍縮小為某個時間周期內所需的OID,對有限的OID進行循環(huán)使用。只要OID的數(shù)量滿足某段時間內數(shù)據(jù)庫的需要即可。
現(xiàn)有的OID回收方法為首先,在數(shù)據(jù)庫中設置兩個表①HighestObj(Obj)存放下一個可用的對象標識符;②Free(Obj)用于回收已刪除的對象標識符。
一旦刪除對象,則用戶手動將其OID插入到表Free中一旦創(chuàng)建對象,則先查詢Free中是否有可用OID。如果有,則從其中分配一個OID給對象,并手動將該OID從Free中刪除;如果沒有,則從表HighestObj中分配一個給對象并手動將該OID從HighestObj中刪除。
該回收方案雖然能夠實現(xiàn)OID的回收,但是卻將繁重的工作交與用戶手動實現(xiàn),每刪除一個對象即將對應的OID進行回收。用戶不僅需要自行分配OID,而且還要根據(jù)資源回收情況決定采取哪種方式進行分配;由于用戶不清楚數(shù)據(jù)庫內部具體的情況,使數(shù)據(jù)庫的管理變得比較復雜且效率比較低。
發(fā)明內容
本發(fā)明所要解決的技術問題是提供一種在采用句柄維護法的數(shù)據(jù)庫中使用的對象標識符回收再利用的方法,在該方法中,OID的回收與對象物理空間的回收過程相一致,能自動回收對象標識符,可充分利用現(xiàn)有的計算機資源并提高系統(tǒng)性能。
本發(fā)明解決上述技術問題所采用的技術方案是數(shù)據(jù)庫中對象標識符回收再利用的方法包括建立數(shù)據(jù)結構的步驟、對象標識符回收的步驟、對象標識符再利用的步驟;建立數(shù)據(jù)結構的步驟包括(1)在磁盤中建立一個用于存貯回收對象標識符的回收文件,該文件分為若干個塊,每一個塊都具有一個頭信息,頭信息中至少包括該塊的塊號、該塊中對象標識符的個數(shù);回收文件以棧的方式存儲塊;塊以棧的方式存儲對象標識符;(2)在共享內存中增加存放兩個變量的域,其中一個變量為塊變量,它指向對象標識符回收文件中最后一個可用塊;另一個變量為對象標識符變量,它指向對象標識符回收文件中最后一個可用塊的最后一個對象標識符。兩個變量始終表示工作的開始位置;(3)在內存中建立一個用于存放回收文件中的最后一個有效塊的拷貝的緩沖區(qū);對象在數(shù)據(jù)庫中的存在形式有兩種①live對象——有效對象;②dead對象——不再被使用的舊版本對象,包括被邏輯刪除的對象和被更新的對象。被邏輯刪除的對象稱為廢棄對象。
對象標識符回收的步驟為物理上刪除廢棄對象時,將其對象標識符存貯到回收文件的步驟;物理上刪除對象包括①單個對象的刪除、②整個類的刪除。
上述方案中,在單個對象的刪除時(在清理類中的已廢棄對象時)進行對象標識符回收的步驟為(1)邏輯刪除對該刪除對象加邏輯刪除(根據(jù)相應情況區(qū)分刪除和更新)標記;(2)物理刪除掃描到該對象的邏輯刪除標記,將被刪除對象的對象標識符回收,存貯到回收文件中;上述方案中,直接清理整個類的所有對象時回收對象標識符的步驟為(1)為該事務分配一個臨時文件;
(2)在刪除該類的過程中,掃描該類所有對象,并將其中的live對象和廢棄對象的OID存放在該臨時文件中;當在事務提交時,將該臨時文件中的所有對象標識符全部導入回收文件;當事務發(fā)生回滾時,將該臨時文件中的內容拋棄。
上述方案中,對象標識符再利用的步驟包括(1)將塊變量所指向的文件塊拷貝到該緩沖區(qū)中;(2)當對新的對象分配對象標識符時,系統(tǒng)從緩沖區(qū)中取出對象標識符變量所對應的對象標識符,同時將對象標識符變量減1;當對象標識符變量為空時,將該緩沖區(qū)在磁盤上對應的塊清空,并從回收文件中拷貝出前一個塊到緩沖區(qū)中,同時將塊變量減1;當塊變量為空時,則轉入到原對象標識符分配機制。
上述方案中,它還包括系統(tǒng)恢復處理的步驟,系統(tǒng)恢復處理的步驟包括將兩個變量記錄到檢查點中的步驟。
上述方案中,它還包括系統(tǒng)恢復處理的步驟,系統(tǒng)恢復處理的步驟為包括(1)將兩個變量記錄在日志中;(2)系統(tǒng)恢復時,根據(jù)日志找到最后一次分配的對象標識符,當在系統(tǒng)對象標識符的原分配模式之下,直接將該對象標識符變量加1,作為下一個可分配的對象標識符;當在回收對象標識符的分配模式,還要在日志記錄中找到最后分配的對象標識符對應的塊變量,然后根據(jù)該對象標識符和塊變量在回收文件中匹配,確定下一個可分配的對象標識符。
本發(fā)明方法與現(xiàn)有的對象標識符回收再利用的方法相比,具有以下優(yōu)點1、能自動回收對象標識符。不需要用戶決定如何回收、回收后的OID如何放置以及如何分配已回收OID。一旦系統(tǒng)開始進行物理空間回收,即會同步回收對應的無用的對象標識符,使得回收對象標識符的過程對用戶透明。
2、根據(jù)數(shù)據(jù)庫系統(tǒng)中不同的對象刪除策略對OID的進行相應的回收處理,使之與對象物理空間的回收工作同步。
對于一般數(shù)據(jù)庫系統(tǒng),對象刪除包括邏輯刪除和物理刪除兩個部分。其中,邏輯刪除對象只是將其標記為不可見,但該對象仍然占用物理空間,如果需要,可以通過修改相關域使得該對象重新可見;物理刪除即真正的將對象從磁盤中刪除并回收其物理空間。在這種情況下,本發(fā)明將OID的回收放到對象物理刪除時進行。
如果數(shù)據(jù)庫中對象的刪除是一次性的,即直接物理刪除該對象,則直接在這一步回收該對象的OID。一般而言,這種一次性刪除情況出現(xiàn)比較少。
3、為了便于回收OID的再利用,減少磁盤輸入/輸出(I/O)并有效實現(xiàn)回收再利用的同步,在內存中開辟一塊專門緩沖區(qū)用于進行OID的分配工作。
由于回收的OID是無序的,不能使用數(shù)值遞加的策略來管理回收的OID,而必須在文件中準確定位下一個可分配OID。在內存中開辟一塊緩沖區(qū)buffer_for_oid(BFO),以塊為單位對OID回收文件(ORF)進行讀取,有效的減少磁盤I/O并提高效率。
采用棧機制對ORF進行管理。從前往后存放回收的OID并從后往前分配OID。BFO總是記錄回收文件中最后一個塊,并從該塊的末端向前分配。這樣可以有效避免塊內部空洞情況的出現(xiàn)。
4、在事務中加入OID處理模塊,使得在故障出現(xiàn)時避免OID的重復分配,并盡可能地減少OID損失。
在故障出現(xiàn)時,內存中的信息包括BFO內容以及定位BFO中OID位置的變量(包括SBN和SROC。SBNORF中最后一頁的塊號,SROC最后一個可用OID在塊中的位置)將會全部丟失。在這種情況下,可通過引入事務的恢復策略(具體為檢查點和回滾恢復算法)將損失降到最小。
檢查點恢復檢查點(checkpoint)是指在磁盤中對某些請求作記錄的一種狀態(tài)。系統(tǒng)會定期地或在系統(tǒng)關閉時做檢查點,一旦發(fā)生故障,能夠自動地從最后一個檢查點開始進行恢復工作。我們在檢查點中加入記錄OID分配位置的兩個變量(SBN和SROC)。按照這種機制,在系統(tǒng)正常關閉時檢查點中記錄的是當前SBN和SROC,系統(tǒng)重啟時能夠恢復到關閉前的狀態(tài),不會出現(xiàn)任何損失。
普通日志恢復每當系統(tǒng)從回收文件中取出一個塊時,即將該塊的塊號記錄到日志文件中,稱為PR(PageRecord)。一旦系統(tǒng)發(fā)生故障,即從日志記錄中的最后一個檢查點開始向后掃描,在該掃描過程中記錄下最后的一個PR以及最后一次分配的OID(后面簡稱為LOID),然后根據(jù)這兩項日志記錄值在ORF中進行匹配,得到故障前的OID分配情況。這樣一來,就可以避免故障恢復后OID的重復分配并將損失降低為0。
圖1為本發(fā)明的實施方案回收OID建立的數(shù)據(jù)結構框架圖2為本發(fā)明的實施方案OID回收機制圖3為本發(fā)明的實施方案OID分配流程4為本發(fā)明的實施方案事務恢復流程圖具體實施方式
本發(fā)明的實施方案僅包括在PostgreSQL數(shù)據(jù)庫中的實現(xiàn)。但是本領域的技術人員會了解到對于其它的數(shù)據(jù)庫系統(tǒng)本發(fā)明也可以通過調整具體方案得以實現(xiàn)。
PostgreSQL數(shù)據(jù)庫是一個使用句柄維護策略的典型對象關系數(shù)據(jù)庫,它使用32位的無符號整數(shù)作為OID,最多可以分配4G個OID。
本發(fā)明的實施方案包括建立數(shù)據(jù)結構的步驟、對象標識符回收的步驟、對象標識符再利用的步驟、系統(tǒng)恢復處理的步驟;1、建立數(shù)據(jù)結構的步驟由于不同的數(shù)據(jù)庫系統(tǒng)會采取不同的刪除、更新策略,因而需要調整具體策略對OID加以回收。為了實現(xiàn)OID的回收和再利用,本發(fā)明方法建立了如下三個數(shù)據(jù)結構(如圖1)(1)在磁盤中建立一個用于存貯回收OID的ORF,用于記錄收集的OID。該文件分為若干個塊(block),每一個塊都有一個頭信息(head information),頭信息中包括該塊的塊號(block_num)、該塊中OID的個數(shù)(oid_num)。在該ORF中,每一個塊除去相應的頭信息,最多可以存放255個OID。ORF以棧的方式存儲塊;塊以棧的方式存儲OID。
(2)在共享內存ShareMemory中的ShmemVariableCache結構體中增加存放兩個變量的域其中一個變量為塊變量block_num(以下簡稱為SBN),用于記錄對應于OID文件中的最后一個有效塊的塊號,另一個變量為對象標識符變量reclaim_oid_count(以下簡稱為SROC),用于記錄該塊中當前可用OID。無論對于OID的回收還是OID的再利用操作來說,它們總是表示工作的開始位置。它們各自擁有一個特殊的Invalid值SBN等于Invalid表示整個OID文件為空;SROC為Invalid表示當前的OID文件塊為空。在系統(tǒng)的運行過程中,這兩個變量始終指向OID回收文件中最后一個可用塊的最后一個OID。
(3)在內存中建立一個存放ORF中的最后一個有效塊拷貝文件的緩沖區(qū)BFO(其結構和和大小都同于OID文件的一個塊)。分配回收的OID時,系統(tǒng)會把OID文件中的最后一個有效塊拷貝到BFO中。
2、對象標識符回收的步驟對象標識符回收的步驟為將物理上刪除對象的對象標識符回收并存貯到回收文件中的步驟,物理上刪除對象包括物理上刪除的清理表中的所有廢棄對象、物理空間刪除整個關系的所有對象。
對象的刪除分為邏輯上的刪除和物理上的刪除,邏輯刪除只是將對象標記為無效,使得對象不可見,在用戶輸入delete或是update命令時,只是邏輯刪除對象;而物理刪除才真正釋放對象占有的物理空間。邏輯刪除的對象,稱為舊版本對象,在某種情況下,舊版本對象可能被重新置為有效。考慮到上述對象恢復的情況,我們將OID的回收工作推遲到物理刪除時進行。在PostgreSQL系統(tǒng)中,有下面兩種操作會導致對象的物理空間刪除(1)vaccum操作(2)drop_class操作其中,vacuum的作用是集中清理表中的所有廢棄對象,回收物理空間;而drop_class是指系統(tǒng)直接刪除關系對應的文件,相當于物理上刪除了整個關系的所有對象并回收磁盤空間。
Vacuum操作下的OID的步驟為(1)對廢棄對象加標記;回收OID時需要區(qū)分兩種dead對象,一種為被邏輯刪除對象,另一種為被更新對象,其中被邏輯刪除的對象稱為廢棄對象。廢棄對象的OID已經失效,可以回收;而對于被更新的對象來說,在更新時它的OID被賦給更新后的對象,該OID仍然有效,不能回收。為了區(qū)分這兩種對象,本發(fā)明實施方案對廢棄對象加上標記,而對被更新對象不加標記。
當然也可以只對被更新對象加標記,其目的只是為了區(qū)分“被刪除對象”和“被更新對象”。
(2)在掃描單個對象時,將被刪除對象的對象標識符回收,并放到對象標識符回收文件中(如圖2);將回收OID的工作放在關系掃描的過程時,如果它的物理空間可以回收(說明這個對象已經被刪除或是已經被更新),則檢查它的可回收標記,如果有該標記,則回收它的OID,放到OID回收文件中。
在drop_class情況下對OID回收的步驟為一旦事務結束,該類所對應文件的空間將會全部回收。表面看來,這種情況下邏輯刪除與物理空間刪除是同時進行的,但是事實上,在事務內部會出現(xiàn)對象回滾情況,即將該事務中前面的動作置為無效,還可以將類刪除的內部動作分為邏輯刪除和物理刪除,與Vacuum不同的是這兩部分動作在同一個事務內部進行。
考慮到多進程情況,每當一個drop_class事務開始時,(1)為該事務分配一個臨時文件;(2)在刪除該類的過程中,掃描該類所有對象——包括有效對象和無效對象(在不同數(shù)據(jù)庫中對于update操作是不同,根據(jù)不同的數(shù)據(jù)庫策略決定是否需要回收update對象的OID),并將這些對象OID存放到該進程的臨時文件中;當在事務提交時,將該臨時文件中的所有OID全部導入ORF的末尾處;當事務發(fā)生回滾時,直接將該臨時文件中的內容拋棄即可。
3、回收OID再利用的步驟本發(fā)明實施分方案采用優(yōu)先使用ORF中OID的原則進行分配OID?;厥誒ID的再利用,即將回收得到的OID從磁盤文件中提取出來并進行重新分配的過程?;厥瘴募詶5姆绞酱鎯K,塊以棧的方式存儲對象標識符;在OID文件中由前往后記錄回收的OID,由后往前分配回收的OID,回收OID類似于壓棧,而分配類似于出棧。
OID再利用的流程圖如圖3,圖中,B為block_num變量,R為reclaim_oid_count變量,Inv為變量的無效值。
OID再利用的具體步驟為(1)在進行分配之前,將SBN所指向的文件塊拷貝到該緩沖區(qū)中。此時SROC指向緩沖區(qū)中最后一個有效的OID。
(2)當對某個新對象分配OID時,系統(tǒng)從OID緩沖區(qū)中取出SROC所對應的OID,同時,將SROC變量減1。
當該變量SROC為0時,表示本塊中的OID已經分配完。此時將該緩沖區(qū)在磁盤上對應的塊清空(oid_num置為0),并從文件中拷貝出前一個塊,同時將變量SBN減1。
如果SBN為0,說明文件中的OID已經分配完畢,則轉入到原OID分配機制中,即目前使用的OID分配機制中(句柄加一方式)。
4、系統(tǒng)恢復處理的步驟系統(tǒng)恢復處理的事務恢復流程如圖4,圖中,ORF為OID回收文件,BFO為專門為OID再利用而分配的緩沖區(qū),SROC為共享內存中記錄最后一個可用OID的位置,PR為日志中記錄ORF中最后一可用頁面的頁號,LOID為日志中記錄的最后一次分配的OID,CBN,CROC為檢查點中分別對應共享內存中對SBN和SROC值的拷貝,BX為事務恢復時,用于進行頁面內OID匹配的參照頁面號由于記錄OID分配的關鍵變量放置在共享內存中,一旦系統(tǒng)出現(xiàn)故障,這些數(shù)據(jù)將會全部丟失。為了解決系統(tǒng)故障并降低損失,本發(fā)明實施方案在OID回收機制中擴展了系統(tǒng)恢復模塊。系統(tǒng)恢復分為正常關機后的恢復和非正常關機后的恢復。
檢查點系統(tǒng)恢復處理的步驟在正常關機時的系統(tǒng)恢復處理的步驟為系統(tǒng)自動做一個檢查點,記錄當前內存中某些關鍵變量。參照原系統(tǒng)的做法,我們將回收中涉及OID的兩個關鍵變量(SBN和SROC)記錄到檢查點中。系統(tǒng)重新啟動時可以完全恢復到關機前的狀態(tài),因而在這種情況下不會出現(xiàn)OID的損耗;對于非正常關機后的恢復,系統(tǒng)檢測到的檢查點為定期檢查點,記錄的是下一分配單位OID。按照原系統(tǒng)的恢復機制一次最多可能會損失8191個OID——即剛分配了該塊中的第一個OID就出現(xiàn)非正常關機的故障。
針對上述這種缺陷,本發(fā)明實施方案還可采用增加記錄當前OID文件最后一塊的塊號日志的系統(tǒng)恢復處理方法。
日志系統(tǒng)恢復處理的步驟(1)將兩個變量記錄在日志中;(2)系統(tǒng)恢復時,根據(jù)日志找到最后一次分配的OID,當在系統(tǒng)OID的原分配模式之下,直接將該SROC加1,作為下一個可分配的OID;
當在回收OID的分配模式,還要在日志記錄中找到最后分配的OID對應的SBN,然后根據(jù)該SBN和SROC在回收文件中匹配,確定下一個可分配的OID。
這樣一來,可以將故障恢復時OID的損失降低為0。
權利要求
1.數(shù)據(jù)庫中對象標識符回收再利用的方法,其特征在于它包括建立數(shù)據(jù)結構的步驟、對象標識符回收的步驟、對象標識符再利用的步驟;建立數(shù)據(jù)結構的步驟包括(1)在磁盤中建立一個用于存貯回收對象標識符的回收文件,該文件分為若干個塊,每一個塊都具有一個頭信息,頭信息中至少包括該塊的塊號、該塊中對象標識符的個數(shù);回收文件以棧的方式存儲塊;塊以棧的方式存儲對象標識符;(2)在共享內存中增加存放兩個變量的域,其中一個變量為塊變量,它指向對象標識符回收文件中最后一個可用塊;另一個變量為對象標識符變量,它指向對象標識符回收文件中最后一個可用塊的最后一個對象標識符;兩個變量始終表示工作的開始位置;(3)在內存中建立一個緩沖區(qū),用于存放回收文件中的最后一個有效塊的拷貝;對象標識符回收的步驟為物理上刪除廢棄對象時,將其對象標識符存貯到回收文件的步驟;物理上刪除對象包括單個對象的刪除、整個類的刪除。
2.如權利要求1所述的方法,其特征在于在刪除單個對象時回收對象標識符的步驟為(1)對類中的被刪除對象或被更新對象加標記;(2)掃描單個對象的標記,將被刪除對象的對象標識符回收,并存貯到回收文件中。
3.如權利要求1所述的方法,其特征在于直接清理整個類的所有對象時回收對象標識符的步驟為(1)為該事務分配一個臨時文件;(2)在刪除該類的過程中,掃描該類所有對象,并將其中的live對象和廢棄對象的OID存放在該臨時文件中;當在事務提交時,將該臨時文件中的所有對象標識符全部導入回收文件;當事務發(fā)生回滾時,將該臨時文件中的內容拋棄。
4.如權利要求1所述的方法,其特征在于對象標識符再利用的步驟包括(1)將塊變量所指向的文件塊拷貝到該緩沖區(qū)中;(2)當對新的對象分配對象標識符時,系統(tǒng)從緩沖區(qū)中取出對象標識符變量所對應的對象標識符,同時將對象標識符變量減1;當對象標識符變量為空時,將該緩沖區(qū)在磁盤上對應的塊清空,并從回收文件中拷貝出前一個塊到緩沖區(qū)中,同時將塊變量減1;當塊變量為空時,則轉入到原對象標識符分配機制。
5.如權利要求1所述的方法,其特征在于它還包括系統(tǒng)恢復處理的步驟,系統(tǒng)恢復處理的步驟包括將兩個變量記錄到檢查點中的步驟。
6.如權利要求1所述的方法,其特征在于它還包括系統(tǒng)恢復處理的步驟,系統(tǒng)恢復處理的步驟為包括(1)將兩個變量記錄在日志中;(2)系統(tǒng)恢復時,根據(jù)日志找到最后一次分配的對象標識符,當在系統(tǒng)對象標識符的原分配模式之下,直接將該對象標識符變量加1,作為下一個可分配的對象標識符;當在回收對象標識符的分配模式,還要在日志記錄中找到最后分配的對象標識符對應的塊變量,然后根據(jù)該對象標識符和塊變量在回收文件中匹配,確定下一個可分配的對象標識符。
全文摘要
本發(fā)明涉及數(shù)據(jù)庫中對象標識符回收再利用的方法,它包括建立數(shù)據(jù)結構的步驟、對象標識符回收的步驟、對象標識符再利用的步驟。在本發(fā)明方法中,OID的回收與對象物理空間的回收過程相一致,能自動回收對象標識符,可充分利用現(xiàn)有的計算機資源并提高系統(tǒng)性能。
文檔編號G06F11/07GK1588359SQ200410060940
公開日2005年3月2日 申請日期2004年10月9日 優(yōu)先權日2004年10月9日
發(fā)明者彭智勇, 施源, 翟博譞, 莊繼峰 申請人:武漢大學