PGA結構?今天主要講講PG的數據結構,PG數據存儲結構分為:邏輯結構和物理存儲,下面我們就來說一說關于PGA結構?我們一起去了解并探讨一下這個問題吧!
今天主要講講PG的數據結構,PG數據存儲結構分為:邏輯結構和物理存儲。
其中邏輯存儲結構是内部的組織和管理數據的方式。物理存儲結構是操作系統中組織和管理數據的方式。邏輯存儲結構适用于不同的操作系統和硬件平台。
邏輯結構包括:
所有數據庫對象都有各自的oid(object identifiers),oid是一個無符号的四字節整數,相關對象的oid都存放在相關的system catalog表中,比如數據庫的oid和表的oid分别存放在pg_database,pg_class表中。
1、數據庫集群-Database cluster
2、數據庫-Database
3、表空間-tablespace
數據庫在邏輯上分成多個存儲單元,稱作表空間。表空間用作把邏輯上相關的結構放在一起。數據庫邏輯上是由一個或多個表空間組成。
新創建的數據庫默認創建下面的表空間:
1)Catalog表空間 存放系統表信息 2)System表空間 存放用戶數據 3)Temp表空間
4、模式-Schema
自動創建的系統模式如下:
1)PG_CATALOG 2)PG_LARGEOBJECT 3)PG_TOAST 4)PG_PARTITION
默認的用戶模式PUBLIC。
5、段-segment
6、區-extent
7、塊-block
8、數據庫對象-Database object
1)模式對象 表、索引、序列、大對象、視圖、函數、存儲過程、觸發器、包 … … 2)非模式對象 用戶、數據庫
9、數據表-Table
10、索引-Index
11、序列-Sequence
12、視圖-View
在執行initdb的時候會初始化一個目錄,通常我們都會在系統配置相關的環境變量$PGDATA來表示,初始化完成後,會再這個目錄生成相關的子目錄以及一些文件。在postgresql中,tablespace的概念并不同于其他關系型數據庫,這裡一個tablespace對應的都是一個目錄。如下圖就是PG的物理結構:
1、存儲系統主要包括三個部分:
内存中:buffer,MemoryContext;
數據文件,臨時文件;
日志文件,日志緩存。
2、文件和目錄相關作用描述:
3、數據文件結構
3.1、頁
将數據文件中的空間從邏輯上劃分成一個個頁面(數據塊)。頁面是數據庫I/O的基本單位,即隻能整頁讀寫數據文件, 頁面的大小默認是8K。
頁面可以分成兩種:
1)數據頁面:數據頁面是用來存儲用戶數據的。
2)控制頁面:控制頁面用來管理這些數據頁面。
數據庫共享緩存中的空間劃分也是按頁為基本單位, 一個頁的大小與數據文件中頁的大小一緻, 這樣便于整頁讀取數據文件,并放入到數據庫Buffer中, 從Buffer寫入數據文件也同理,保證了緩存與數據文件結構和内容上的一緻性。
3.2、Block(塊)
概念上基本等同于Page, 但Block更多用于說明DMS中對數據文件中Page的描述。
例如: 對文件的讀寫的操作, 文件讀寫位置的定位, 數據文件空間回收等操作, 單位均是以塊進行。
數據塊的大小在系統初始化時指定,默認是8K,可以取值4K,8K,16K,32K。
3.3、Extent(區)
把數據文件中8個連續的Page構成的空間稱為一個Extent。Extent是數據庫進行數據文件空間分配/釋放的基本單位。每個表、索引、序列對象都是由若幹個區組成。數據文件被創建後,除自動保留部分區作為控制區外,其他區全部處于未分配狀态。表、索引、序列對象的所有數據都存放在Extent中,當向這些Extent中插入數據時,若該Extent的所有頁面都已占滿,系統就會自動在所屬表空間的數據文件中尋找一個尚未分配的區,并将其狀态修改為數據區。
3.4、控制頁面
用于空間管理的控制頁面:PFS/GAM/IAM。
用于增量備份的控制頁面:DCM。
判斷可見性的控制頁面:VM。
預留的控制頁面:BCM/SGAM。
3.5、PFS
Page Free Space,簡稱PFS頁.
用于記錄本數據文件中頁面的空間使用情況。對文件中的每個頁面,PFS中都有一個“字節”與之對應,該字節記錄了該頁面的狀态。
PFS頁前64bytes被預留為頁頭, 剩下81024-64=8128一共覆蓋81288K=64MB空間.
故PFS頁每隔8128個頁面出現一次, 系統初始化把第一個PFS頁放在數據文件的第二個頁面位置,即:第1号數據頁面, 由此可知,第N個PFS頁的位置在8128*N 1.
3.6、GAM
Global Allocation Map,簡稱GAM頁。
功能:記錄所在數據文件的Extent的分配情況,GAM頁中除GAM頭外,剩下空間的每一位(bit)均對應一個Extent的分配情況。若某bit位為1,則表明該bit位所關聯的Extent已被分配出去,反之未被分配。
若一個GAM頁面大小為8K,則除GAM頭(64 bytes)外,一個GAM頁面所能覆蓋的文件範圍是: (81024-64)8(88K),約4GB空間。此外,GAM頁每隔881288個頁面出現一個,系統要求第一個GAM頁出現在文件的第3個頁面位置(即:第2個索引位置),由此得知,第N個GAM頁的出現位置是: 881288*N 2
3.7、IAM
Index Allocation Map,簡稱IAM頁。
功能:每個IAM頁隻隸屬于一個數據庫對象(例如:表),但一個數據庫對象可包含多個IAM頁,由此可見IAM頁與數據庫對象的關系是1對1,而數據庫對象與IAM頁的關系是1對多.
IAM的結構與GAM頁類似,除IAM頭外,剩下空間的每一位(bit)均對應着一個與IAM相關的Extent。若某bit位為1,則表明該bit位所關聯的Extent已被分配給該IAM,反之未被分配。若一個IAM頁面大小為8K,則除IAM頭(64 bytes)外,一個IAM頁面所能覆蓋的文件範圍是: (81024-64)8(88K),約4GB空間。
但與GAM也不同之處在于:IAM的出現位置不固定,隻在在創建數據庫對象的時候才分配。
1、邏輯關系存在表空間;
2、表空間存在對應的數據文件中;
新創建的數據庫對應的數據文件的名稱:
Catalog表空間 – databasename.dbf System表空間 – Udatabasename.dbf Temp表空間-- Tdatabasename.dbf
前面加 “U” 前綴代表用戶數據表空間,用于保存用戶表的數據。
不帶 U 代表 是系統表的表空間,用于保存系統表的數據。
U 前綴的數據文件代表的表空間名為PG。
不帶U 的數據文件代表的表空間為 CATALOG。
1、關系圖如下:
說明:
1)每一個數據庫具有一個或多個數據文件,用戶存放數據庫的所有數據。
2)數據庫的數據文件有以下特征:
一個數據庫文件隻能與一個數據庫的一個表空間相連。
一個表空間可以由多個數據文件組成。
3)數據庫對象與文件關系:
數據庫對象放到表空間中。
表空間有多個數據文件。
表空間中有多個數據庫對象。
4)數據庫對象邏輯上是存儲在表空間中,物理上是存儲在與表空間相關聯的數據文件中。
2、數據庫包含的文件種類:
1)數據庫文件:data/DB
數據庫對象,如:數據庫、表,索引,序列等對象。
2)控制文件:data/CTL
用來記錄數據庫集群的狀态信息,如:版本信息、集群所管理的各種文件信息、檢查點信息、事務狀态信息等。
3)日志文件:data/REDOLOG
記錄數據修改操作的日志,用于系統發生故障時進行數據恢複。
4)臨時文件:data/DB
存放數據庫進行計算的過程中,生成的各種中間對象,如排序運算的外存歸并單元。
5)參數文件:data目錄下
Postgresql的每個數據庫均存放在一個目錄中,以db_oid命名,該目錄中存放每個表對應的文件,文件名以該數據表對應的relfilenode_oid命名。當表中的數據量足夠大,導緻表文件的大小大于1GB的時候,postgresql會自動創建新的文件用于存放新插入的數據。新文件的名稱為: relfilenode_iod.1, relfilenode_iod.2 等。使用該策略是為了防止在某些文件系統中,最大支持文件尺寸不能大于1GB的情形。
db_oid, relfilenode_oid可以從pg_class系統表中查詢得出。
每個table對應的文件内部又按照Page的方式組織。每個Page的大小默認為8KB。所以每個數據庫對應文件的Disk 分布由下圖所示:
每個Page中包含Page Header以及Data段,Page Header中,pg_lower指向Free Space的起始地址,pg_upper指向Free Space的結束地址。
Data 段中,包含有: ItemIdData 段,Free Space段, Items段 以及Special space段。
ItemIdData 段: Array of (offset,length) pairs pointing to the actual items. 4 bytes per item.
Free Space 段:The unallocated space. New item pointers are allocated from the start of this area, new items from the end.
Items 段: The actual items themselves.
Special space 段: Index access method specific data. Different methods store different data. Empty in ordinary tables.
Item的存儲是從pg_upper向pg_lower(類似堆)方向增長。ItenIdData的存儲是從pg_lower向pg_upper方向增長(類似棧)。
後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!