資料庫在磁碟上的儲存布局HeapFile,布局heapfile

來源:互聯網
上載者:User

資料庫在磁碟上的儲存布局HeapFile,布局heapfile

----《大規模分布式儲存系統:原理解析與架構實戰》讀書筆記

這篇依然是學習《大規模分布式儲存系統:原理解析與架構實戰》一書之外的一個話題。通過學習本書,知道了分布式鍵值系統,通常使用SSTable(一個無序的鍵值對集合容器)作為其磁碟上的布局。這不禁讓人產生聯想,傳統資料庫使用的是什麼儲存布局來儲存資料呢?這就是今天要探討的主題----HeapFile.

HeapFile是什嗎?

HeapFile是一種儲存Page資料的資料結構,類似於鏈表,HeapFile也是一種無序容器。
HeapFile和SSTable其實都是具有特殊結構的檔案。既然都是儲存資料,為什麼不直接使用檔案呢?因為系統檔案並不區分檔案的內容。處理起來粒度大。而HeapFile和SSTable都能夠提供記錄層級的管理,從這一點上來說,二者的功能都是相同的,都是為系統提供更細粒度的儲存管理。

基本上,Oracle,MySql,PostgreSql,SQLServer等傳統資料庫都使用HeapFile作為其儲存布局管理。如同SSTable一樣,HeapFile的結構實際很簡單,但是你需要時刻知道,資料庫中儲存使用的是HeapFile。

我們都知道,資料庫通常使用B+樹作為索引,但是國內很少有人提到資料庫使用的是HeapFile來管理記錄的儲存。國外的一些大學在“資料庫系統實現”這門課上通常會讓學生實現一個簡單的資料庫,因此有不少HeapFile的資料。

基於Page的HeapFile

採用鏈表形式的是HeapFile如下:

Heap file和鏈表結構類似的地方:

  • 支援增加(append)功能
  • 支援大規模順序掃描
  • 不支援隨機訪問

這種方式的HeapFile在尋找具有合適空間的半空Page時需要遍曆多個頁,I/O開銷大。因此一般常用的是採用基於索引的HeaFile.在HeapFile中使用一部分空間來儲存Page作為索引,並記錄對應Page的剩餘量。如下:

像那樣,索引單獨存在一個page上。資料記錄存在其他page上,如果有多個索引的page,則可以表示為:

下面是Heap file自有的一些特性:

  • 資料儲存在二級儲存體(disk)中:Heapfile主要被設計用來高效儲存大資料量,資料量的大小隻受儲存體容量限制;

  • Heapfile可以跨越多個磁碟空間或機器:heapfile可以用大地址結構去標識多個磁碟,甚至於多個網路;

  • 資料被組織成頁;

  • 頁可以部分為空白(並不要求每個page必須裝滿);

頁面可以被分割在某個儲存體的不同的物理地區,也可以分布在不同的儲存體上,甚至是不同的網路節點中。我們可以簡單假設每一個page都有一個唯一的地址標識符PageAddress,並且作業系統可以根據PageAddress為我們定位該Page。

一般情況下,使用page在其所在檔案中的位移量就可以表示了。

一種簡單的布局實現方案File的布局

在實現資料在檔案中的布局的時候,為了實現更簡單,我先做了一個簡單的約定:一個檔案表示一個關係。
這意味著一個關係的記錄的條數受到檔案系統的限制,如果是FAT32位系統,一個檔案最大隻能是4G,如果是普通的etx3,單個檔案則是2TB。

同樣為了實現簡單,採用了數組的方式來組織頁。
HeapFile的組織如下:


其中N和P為檔案的最開始的16(或32)個位元組。即N和P實際儲存的是兩個long型的值。N表示檔案中頁的數目,P表示每頁的大小。則:

  • 檔案的總大小 FileSize = N * P + 2 * sizoeof(long).
  • 任意一頁的頁首地址 Page(k) = P * ( k - 1 ) +2 * sizeof(long) (k = 1,2,...,N)
Page的布局

頁中可以包含多條記錄。如果每天記錄的長度都相同,則稱為定長記錄,如果每條記錄的長度有不相同,則稱為變長記錄。定長記錄可以採用數組的方式記錄,但是變長記錄不行。因此採用位移量的方式來記錄。page的布局如下:

從頁首開始一條條記錄。頁尾用一個int整形記錄剩餘空間的位移量,再用一個Int整形該頁已儲存的記錄數,每一條記錄在頁中的位移量和是否被刪除的標記。
其中,

  • FreeSpace表示該頁空間剩餘量的首地址,也是最後一條記錄的尾地址+1;
  • N表示該頁中已經存在的記錄的條數,包括哪些被標記為刪除的記錄;
  • 尾部的R1,R2,..表示其對應記錄在頁內的位移地址,同時還會分出1個bit位標記這條記錄是否被刪除。如果要支援記錄跨頁儲存的話,還需要再分出2bit來標記其是否是跨頁的記錄。
    尾部的R1,R2等可以定義為如下結構體:
    struct IndexRecord{unsigned int pos:29; //記錄在頁內的位移地址unsigned int isdelete:1; //是否刪除的標記unsigned int spanned:2;  //是否跨頁儲存};
    IndexRecord總共為32bit,其中29bit表示記錄的頁內位移地址 ; 1bit表示記錄是否被刪除 ; 2bit表示是否跨頁儲存,0x00表示不跨頁,0x01表示跨頁,記錄為開始的部分,0x10表示跨頁,記錄為中間部分,中間部分可以有多條,0x11表示跨頁,記錄為結尾的部分。
    則:
  • 任意一條記錄的IndexRecord首地址為 R(k) = P-(2+k)*sizeof(int); (k=1,2,..,N)
  • 計算一個頁還能容納的長度為 FreeLength = P-(2+N)*sizeof(int)
  • 判斷一個頁是否裝滿的條件為 FreeLength > 0

一個Page通常的大小為2K,4K,8K,16K等。

這裡還要再提下空隙的問題,同時刪除記錄時直接採用標記法,但是當更新記錄的時候,由於是變長記錄。存在以下3種情況:

  1. 新記錄和原記錄一樣長:原處更新記錄即可
  2. 新紀錄比原記錄長:原記錄標記刪除,並新增一條記錄,如果有索引,更新索引檔案。
  3. 新紀錄變原記錄短:原處更新記錄,無需更新索引檔案,但是出現了記錄的空隙。

當空間緊張時,可以嘗試壓縮頁,剔除其中的空隙。

記錄的布局

定長記錄的布局可以比較簡單,此處不提。本節主要討論變長記錄的布局,也叫記錄的序列化。

一個常見的例子為給定表Person的定義,使name可以是不超過1024個字元。Schema如下:

CREATE TABLE Person (    name      VARCHAR(1024) NOT NULL,    age       INTEGER NOT NULL,    birthdate DATETIME)

上面表的記錄是變長的原因為:

  1. name欄位是一個變長的字串;
  2. birthdate可以為NULL;

變長record的序列化的關鍵是欄位邊界的界定。一種比較流行的方法是在record的首部儲存欄位邊界的offset。
Person的record的編排方式如下:


Note:我們在首部設定4個整型去儲存三個欄位的四個邊界offset。
上面的編排方式很自然的提供一種NULL欄位的編排方式--可以標識該欄位的值為NULL,如:


第三個offset和第四個offset指向同一個位置,那麼就表明第三個欄位的大小是零,即是一個NULL值。

可以看到,使用位移量無論是Page的布局,還是記錄的序列化,都是非常方便的。

根據以上介紹, 可以有以下推斷:

  • 記錄的總長度 RecordLength = R[k] k為欄位數
  • 每個欄位的長度為 ColnumLength(k) = R[k] - R[k-1] , (k=1,2,3,...)
  • 判斷一個欄位是否為NULL ColnumLength[k] = 0 ,(k=1,2,3,...)

最後我們在來看一遍關係Person的HeapFile檔案的整體布局圖


參考

這裡有一篇關於HeapFile的翻譯 關係型資料在磁碟上的儲存布局
原文來自http://dblab.cs.toronto.edu/courses/443/tas/

歡迎光臨我的網站----蝴蝶忽然的部落格園----人既無名的專欄。
如果閱讀本文過程中有任何問題,請聯絡作者,轉載請註明出處!



資料存放區在磁碟上,其原理是什?

檔案在磁碟上的儲存就像是一個鏈表,表頭是檔案的起始地址,整個檔案並不一定是連續的,而是一個節點一個節點的串連起來的。要訪問某個檔案時,只要找到表頭就行了。刪除檔案時,其實只是把表頭刪除了,後面的資料並沒有刪除,直到下一次進行寫磁碟操作需要佔用節點所在位置時,才會把相應的資料覆蓋掉。資料恢複軟體正是利用了這一點。所以,就算你誤刪了檔案之後又進行了其他寫磁碟操作,只要沒有覆蓋掉那些資料,都是可以恢複的。

檔案之所以能被恢複,須從檔案在硬碟上的資料結構和檔案的儲存原理談起。新買回的硬碟需分區、格式化後才能安裝系統使用。一般要將硬碟分成主開機磁區、作業系統開機磁區、檔案配置表(FAT)、目錄區(DIR)和資料區(Data)五部分。
在檔案刪除與恢複中,起重要作用的是“檔案配置表”的“目錄區”,為安全起見,系統通常會存放兩份相同的FAT;而目錄區中的資訊則定位了檔案資料在磁碟中的具體儲存位置——它記錄了檔案的起始單元(這是最重要的)、檔案屬性、檔案大小等。
在定位檔案時,作業系統會根據目錄區中記錄的起始單元,並結合檔案配置表區知曉檔案在磁碟中的具體位置和大小。
實際上,硬碟檔案的資料區儘管佔了絕大部分空間,但如果沒有前面各部分,它實際上沒有任何意義。

人們平常所做的刪除,只是讓系統修改了檔案配置表中的前兩個代碼(相當於作了“已刪除”標記),同時將檔案所佔簇號在檔案配置表中的記錄清零,以釋放該檔案所佔空間。因此,檔案被刪除後硬碟剩餘空間就增加了;而檔案的真實內容仍儲存在資料區,它須等寫入新資料時才被新內容覆蓋,在覆蓋之前原資料是不會消失的。恢複工具(如FinalData等)就是利用這個特性來實現對已刪除檔案的恢複。
對硬碟分區和格式化,其原理和檔案刪除是類似的,前者只改變了分區表資訊,後者只修改了檔案配置表,都沒有將資料從資料區真正刪除,所以才會有形形色色的硬碟資料恢複工具。
那麼,如何讓被刪除的檔案無法恢複呢?很多朋友說,將檔案刪除後重新寫入新資料,反覆多次後原始檔案就可能找不回啦。但操作起來比較麻煩,而且不夠保險。
因此,最好能藉助一些專業的移除工具來處理,可以自動重寫資料N次,讓未經處理資料面貌全非 .
 
檔案管理與資料庫的關係?磁碟上的資料是以資料庫的形式儲存,還是需使用者建立資料庫再加入資料?

下面回答您的問題:
1、 檔案管理方式與資料庫管理方式有什麼根本不同:
所謂檔案管理,就是作業系統中實現檔案統一管理的一組軟體、被管理的檔案以及為實施檔案管理所需要的一些資料結構的總稱(是作業系統中負責存取和管理檔案資訊的機構)。
從系統角度來看,檔案系統是對檔案儲存體器的儲存空間進行組織,分配和回收,負責檔案的儲存,檢索,共用和保護。
從使用者角度來看,檔案系統主要是實現"按名取存",檔案系統的使用者只要知道所需檔案的檔案名稱,就可存取檔案中的資訊,而無需知道這些檔案究竟存放在什麼地方。
檔案系統作為一個統一的資訊管理機制,應具有下述功能:
①統一管理檔案儲存體空間(即外存),實施儲存空間的分配與回收。
②確定檔案資訊的存放位置及存放形式。
③實現檔案從名字空間到外存地址空間的映射,即實現檔案的按名存取。
④有效實現對檔案的各種控制操作(如建立、撤銷、開啟、關閉檔案等)和存取操作(如讀、寫、修改、複製、轉儲等)。

2、資料庫管理系統,簡稱DBMS,是指為資料庫的建立,使用和維護而配置的軟體,它提功能,包括定義表,在表中增加,修改,刪除資料,同時還提供靈活的查詢資料的功能.而這些功能可以被進階語言調用.利用進階語言及其開發工具,同時調用資料庫管理系統提供的功能,我們可以編製程式實現對我們日常工作中大量的非數值的資料進行管理。
你說的它們之間的層次應該為 硬體、作業系統、dbms(或編譯器、診斷程式等其他系統軟體)、應用軟體。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.