常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析_第1頁(yè)
常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析_第2頁(yè)
常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析_第3頁(yè)
常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析_第4頁(yè)
常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

常用(閉源、開源)關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理解析

【摘要】常用的關(guān)系型數(shù)據(jù)庫(kù)有閉源系列和開源系列,閉源系列有國(guó)外數(shù)據(jù)庫(kù)(如Oracle、DB2等)和國(guó)產(chǎn)數(shù)據(jù)庫(kù)(如GaussDBT等);開源系列有MySQL、PostgreSQL等。本文擬介紹幾種常用關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)和實(shí)現(xiàn)原理,以方便廣大用戶更進(jìn)一步了解和選擇。一、Oracle(一)

Oracle架構(gòu)OracleServer包括數(shù)據(jù)庫(kù)(Database)和實(shí)例(Instance)兩大部分,兩者相互獨(dú)立。數(shù)據(jù)庫(kù)由數(shù)據(jù)文件、控制文件和日志文件組成,實(shí)例由內(nèi)存池和后臺(tái)進(jìn)程組成,示意圖如下:一臺(tái)OracleServer可創(chuàng)建多個(gè)Database,不同的Database之間相互獨(dú)立。每個(gè)Database有屬于自己的全套相關(guān)文件,如:密碼文件,參數(shù)文件,數(shù)據(jù)文件,控制文件和日志文件Database由一系列物理文件(如二維表文件)組成。用戶不能直接讀取Database中的內(nèi)容,必須通過(guò)Oracleinstance才能讀取,一個(gè)Instance只能連接一個(gè)Database,但是一個(gè)Database可以被多個(gè)Instance連接。各功能組件說(shuō)明如下:1、用戶連接進(jìn)程用戶連接進(jìn)程是連接用戶和OracleInstance的橋梁。包括:用戶進(jìn)程、服務(wù)進(jìn)程和PGA用戶進(jìn)程UserProcess當(dāng)一個(gè)DatabaseUser請(qǐng)求連接到OracleServer時(shí),OracleServer創(chuàng)建的UserProcess。ServerProcess服務(wù)進(jìn)程用于處理DatabaseUser和OracleServer之間的連接。程序全局區(qū)PGAPGA:由ServerProcess分配,用于當(dāng)前UserSession的內(nèi)存區(qū),不同的用戶擁有不同的PGA。PGA包含了ServerProcess數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。包括??臻g、SessionInfo、私有SQL區(qū)。2、SGA(SystemGlobalArea)SGA與Oracle性能息息相關(guān),在Instance啟動(dòng)時(shí)被分配,關(guān)閉時(shí)被釋放。主要包含如下幾種數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)庫(kù)緩沖區(qū)(Databasebuffercache)oracle執(zhí)行SQL語(yǔ)句的區(qū)域。當(dāng)進(jìn)行數(shù)據(jù)更新或數(shù)據(jù)查詢時(shí),用戶執(zhí)行的SQL語(yǔ)句不會(huì)直接對(duì)磁盤上的數(shù)據(jù)文件進(jìn)行更改操作,而是首先將數(shù)據(jù)文件復(fù)制到數(shù)據(jù)庫(kù)緩沖區(qū)緩存,再更改或查詢緩存中的副本。此外,被頻繁訪問的數(shù)據(jù)塊會(huì)存在于數(shù)據(jù)庫(kù)緩沖區(qū)緩存中。日志緩沖區(qū)(RedologBuffer)用于短期存儲(chǔ)redolog。共享池(SharedPool)用于緩存所有頻繁執(zhí)行的代碼和頻繁訪問的對(duì)象定義。共享池內(nèi)有下列三種數(shù)據(jù)結(jié)構(gòu):庫(kù)緩沖(librarycache):存儲(chǔ)最近執(zhí)行的代碼數(shù)據(jù)字典緩存(datadictionarycache):存儲(chǔ)最近使用的對(duì)象定義PL/SQL緩沖區(qū)(PL/SQLbuffer):用于存儲(chǔ)過(guò)程、函數(shù)、打包的過(guò)程、打包的函數(shù)、對(duì)象類型定義和觸發(fā)器。大型池(LargeBuffer)用于共享的服務(wù)器進(jìn)程。JAVA池(JavaBuffer):只有當(dāng)應(yīng)用程序需要在數(shù)據(jù)庫(kù)中運(yùn)行java存儲(chǔ)程序時(shí),才需要java池。3、后臺(tái)進(jìn)程后臺(tái)進(jìn)程主要用于數(shù)據(jù)庫(kù)管理,是OracleInstance和OracleDatabase的聯(lián)系紐帶,分為核心進(jìn)程和非核心進(jìn)程。1)

核心進(jìn)程:數(shù)據(jù)庫(kù)寫入進(jìn)程(DBWn)Serverprocess連接Oracle后,通過(guò)數(shù)據(jù)庫(kù)寫進(jìn)程(DBWn)將數(shù)據(jù)緩沖區(qū)中的“臟緩沖區(qū)”的數(shù)據(jù)塊寫入到數(shù)據(jù)文件;檢查點(diǎn)進(jìn)程(CKPT)Checkpoint(CKPT)檢查點(diǎn)進(jìn)程主要用于更新數(shù)據(jù)文件頭,更新控制文件和觸發(fā)DBWn數(shù)據(jù)庫(kù)寫進(jìn)程。進(jìn)程監(jiān)視進(jìn)程(PMON)當(dāng)后臺(tái)進(jìn)程執(zhí)行失敗后負(fù)責(zé)清理數(shù)據(jù)庫(kù)緩存和閑置資源,是Oracle的自動(dòng)維護(hù)機(jī)制。

系統(tǒng)監(jiān)視進(jìn)程(SMON)用途如下:當(dāng)數(shù)據(jù)庫(kù)實(shí)例崩潰時(shí),用于數(shù)據(jù)庫(kù)實(shí)例的自動(dòng)恢復(fù)。清除作廢的排序臨時(shí)段,回收整理碎片,合并空閑空間,釋放臨時(shí)段,維護(hù)閃回的時(shí)間點(diǎn)。重做日志文件和日志寫入進(jìn)程用于記錄數(shù)據(jù)庫(kù)的改變和記錄數(shù)據(jù)庫(kù)被改變之前的原始狀態(tài),當(dāng)滿足以下條件時(shí),激活LGWR:

提交指令日志緩沖區(qū)超過(guò)1/3每三秒每次DBWn執(zhí)行之前2)

非核心進(jìn)程歸檔進(jìn)程(ARCn)是可選的后臺(tái)進(jìn)程,當(dāng)數(shù)據(jù)庫(kù)處于ArchiveLog模式時(shí),自動(dòng)歸檔redolog,并保存數(shù)據(jù)庫(kù)的所有修改記錄。SGA(SystemGlobalArea)和后臺(tái)進(jìn)程組成Instance。

4、存儲(chǔ)結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu)可從物理結(jié)構(gòu)和邏輯結(jié)構(gòu)兩方面理解。1)

物理結(jié)構(gòu)Database物理結(jié)構(gòu):是Database在操作系統(tǒng)中的文件集合,即:磁盤上的物理文件,主要由數(shù)據(jù)文件、控制文件、重做日志文件、歸檔日志文件、參數(shù)文件、口令文件組成。數(shù)據(jù)文件、重做日志文件、控制文件、跟蹤文件、警告文件屬于數(shù)據(jù)庫(kù)文件DataFiles數(shù)據(jù)文件是數(shù)據(jù)的存儲(chǔ)倉(cāng)庫(kù),數(shù)據(jù)被使用時(shí)才被調(diào)入內(nèi)存中的。RedoLogFiles重做日志文件包含對(duì)數(shù)據(jù)庫(kù)所做的更改操作記錄,在Oracle發(fā)生故障時(shí)能夠恢復(fù)數(shù)據(jù)。ControlFiles

控制文件包含維護(hù)和驗(yàn)證數(shù)據(jù)庫(kù)完整性的必要的信息。例如,控制文件用于識(shí)別數(shù)據(jù)文件和重做日志文件,一個(gè)數(shù)據(jù)庫(kù)至少需要一個(gè)控制文件。跟蹤文件(TraceFiles)在instance中運(yùn)行的每一個(gè)后臺(tái)進(jìn)程都有一個(gè)跟蹤文件(tracefile)與之相連。Tracefile記載后臺(tái)進(jìn)程所遇到的重大事件的信息。警告日志(AlertLog)是一種特殊的跟蹤文件,每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)跟蹤文件,同步記載數(shù)據(jù)庫(kù)的消息和錯(cuò)誤。參數(shù)文件、口令文件、歸檔文件屬于非數(shù)據(jù)庫(kù)文件。ParameterFile實(shí)例參數(shù)文件,當(dāng)啟動(dòng)oracle實(shí)例時(shí),SGA結(jié)構(gòu)會(huì)根據(jù)此參數(shù)文件的設(shè)置內(nèi)存,后臺(tái)進(jìn)程會(huì)據(jù)此啟動(dòng)。PasswordFile用戶通過(guò)提交username/password來(lái)建立會(huì)話,Oracle根據(jù)存儲(chǔ)在數(shù)據(jù)字典的用戶定義對(duì)用戶名和口令進(jìn)行驗(yàn)證。歸檔文件是重做日志文件的脫機(jī)副本,這些副本可能對(duì)于從介質(zhì)失敗中進(jìn)行恢復(fù)很必要。2)

邏輯結(jié)構(gòu)表空間用于存儲(chǔ)數(shù)據(jù)庫(kù)對(duì)象的邏輯空間,是信息存儲(chǔ)的最大邏輯單位,是一系列數(shù)據(jù)文件的集合。一個(gè)數(shù)據(jù)庫(kù)可以由多個(gè)表空間組成,每個(gè)表空間包括多個(gè)段。段:是對(duì)象在數(shù)據(jù)庫(kù)中占用的空間。段是區(qū)的集合區(qū):是為數(shù)據(jù)一次性預(yù)留的一個(gè)較大的存儲(chǔ)空間,區(qū)是塊的集合塊:ORACLE最基本的存儲(chǔ)單位,在建立數(shù)據(jù)庫(kù)的時(shí)候指定,并被映射到磁盤塊。3)

邏輯空間到物理空間的映射(二)

OracleRDBMS的運(yùn)行過(guò)程

1.

User訪問OracleServer之前提交一個(gè)請(qǐng)求(包含了db_name、password、instance_name、username等信息);2.

OracleServer接收到請(qǐng)求并通過(guò)PasswordFile的驗(yàn)證后,分配SGA內(nèi)存池,啟動(dòng)后臺(tái)進(jìn)程同時(shí)創(chuàng)建并啟動(dòng)實(shí)例;3.

啟動(dòng)實(shí)例之后,UserProcess與ServerProcess建立Connect;4.

Serverprocess和OracleInstance建立Sesscion,隨后接收用戶請(qǐng)求,執(zhí)行相關(guān)操作;(三)

寫SQL語(yǔ)句的執(zhí)行過(guò)程1.

用戶執(zhí)行SQL語(yǔ)句,Serverprocess收到后,將SQL語(yǔ)句送到Instance,再將SQL語(yǔ)句載入數(shù)據(jù)庫(kù)緩沖區(qū)。2.

ServerProcess通知OracleDatabase將與SQL語(yǔ)句相關(guān)的數(shù)據(jù)塊副本加載到緩沖區(qū)中。3.

在數(shù)據(jù)庫(kù)緩存區(qū)執(zhí)行SQL語(yǔ)句,修改數(shù)據(jù)文件副本,形成“臟緩沖區(qū)”4.

CKPT檢查到”臟緩沖區(qū)”,調(diào)用DBWn數(shù)據(jù)庫(kù)寫進(jìn)程,5.

在DBWn運(yùn)行之前,先運(yùn)行了LGWR,將數(shù)據(jù)文件的原始狀態(tài)和數(shù)據(jù)庫(kù)的改變記錄到RedoLogFiles6.

運(yùn)行DBWn,將“臟緩沖區(qū)的內(nèi)容寫入到數(shù)據(jù)文件”7.

同時(shí)CKPT修改控制文件和數(shù)據(jù)文件頭8.

SMON回收不必要的空閑資源9.

返回結(jié)果給用戶(四)

Oracle的高可用性架構(gòu)1.

OracleRAC(RealApplicationClusters)RAC是Oracle數(shù)據(jù)庫(kù)的一個(gè)群集解決方案,包括計(jì)算層和存儲(chǔ)層。如下圖所示:1)

存儲(chǔ)層——共享存儲(chǔ)OracleRAC的核心是共享磁盤子系統(tǒng),集群中所有節(jié)點(diǎn)必須能夠訪問所有數(shù)據(jù)文件、重做日志文件、控制文件和參數(shù)文件,因此,這些文件必須存放在共享存儲(chǔ)中。常用的共享存儲(chǔ)方式有OCFS、OCFS2、RAW、NFS、ASM等。說(shuō)明如下:OCFS(OracleClusterFileSystem)和OCFS2都是文件系統(tǒng),和NFS一樣,提供集群環(huán)境共享存儲(chǔ)的文件系統(tǒng)。RAW裸設(shè)備也是一種存儲(chǔ)方式。把共享存儲(chǔ)映射到RAWDevice,Oracle在存儲(chǔ)數(shù)據(jù)時(shí),選擇RAWdevice存儲(chǔ)即可。但相對(duì)于文件系統(tǒng)來(lái)說(shuō),RAW不直觀,不便于管理,而且有數(shù)量的限制,現(xiàn)已被OCFS取代。ASM是一種數(shù)據(jù)庫(kù)存儲(chǔ)的方案,并不是cluster的方案,使用ASM時(shí),還需使用OCFS/OCFS2或RAW。2)

計(jì)算層計(jì)算層至少需要兩臺(tái)以上的服務(wù)器,在每臺(tái)服務(wù)器上安裝集群軟件和Oracle的RAC組件,從邏輯結(jié)構(gòu)上看,每個(gè)節(jié)點(diǎn)都有一個(gè)獨(dú)立的實(shí)例,這些實(shí)例訪問同一個(gè)數(shù)據(jù)庫(kù)。節(jié)點(diǎn)之間通過(guò)集群軟件的通信層(CommunicationLayer)進(jìn)行通信,利用高速緩存合并技術(shù),實(shí)現(xiàn)集群中各節(jié)點(diǎn)緩存的高速同步,使得集群中的每個(gè)實(shí)例,都保留了一份相同的數(shù)據(jù)庫(kù)cache。從而最大限度地低降低磁盤I/O。因此,RAC有如下特點(diǎn):每一個(gè)節(jié)點(diǎn)的實(shí)例都有自己的SGA;每一個(gè)節(jié)點(diǎn)的實(shí)例都有自己的后臺(tái)進(jìn)程每一個(gè)節(jié)點(diǎn)的實(shí)力都有自己的redologs每一個(gè)節(jié)點(diǎn)的實(shí)例都有自己的undo表空間所有節(jié)點(diǎn)都共享一份datafiles和controlfiles2、DataGuard在DataGurad環(huán)境中,至少有兩個(gè)數(shù)據(jù)庫(kù),一個(gè)主庫(kù)(PrimaryDatabase)處于Open狀態(tài),另一個(gè)備庫(kù)(StandbyDatabase)處于standby狀態(tài)。備庫(kù)又分物理庫(kù)和邏輯庫(kù)。物理庫(kù)和主庫(kù)完全一樣,通過(guò)REDO應(yīng)用來(lái)保持與主庫(kù)的數(shù)據(jù)一致性,支持只讀服務(wù);邏輯庫(kù)通過(guò)SQL應(yīng)用,在備庫(kù)端執(zhí)行和主庫(kù)同樣的SQL語(yǔ)句,以此來(lái)保持與主庫(kù)的數(shù)據(jù)一致,因此文件的物理結(jié)構(gòu)(甚至數(shù)據(jù)的邏輯結(jié)構(gòu))都可以與主庫(kù)不一致。邏輯庫(kù)支持讀寫服務(wù)。DataGuard適合多機(jī)房方案,實(shí)際部署時(shí),主庫(kù)部署在主機(jī)房,備庫(kù)部署在其他機(jī)房。二、MySQL(一)MySQL架構(gòu)1、連接器(Connectors)MySQL向外提供的接口,如java,.net,php等語(yǔ)言可以通過(guò)該組件來(lái)操作SQL語(yǔ)句,實(shí)現(xiàn)與SQL的交互。2、管理服務(wù)組件和工具組件(ManagementService&Utilities)提供對(duì)MySQL的集成管理,如備份(Backup),恢復(fù)(Recovery),安全管理(Security)等3、連接池組件(ConnectionPool)負(fù)責(zé)監(jiān)聽對(duì)客戶端向MySQLServer端的各種請(qǐng)求,接收請(qǐng)求,轉(zhuǎn)發(fā)請(qǐng)求到目標(biāo)模塊。每個(gè)成功連接MySQLServer的客戶請(qǐng)求都會(huì)被創(chuàng)建或分配一個(gè)線程,該線程負(fù)責(zé)客戶端與MySQLServer端的通信,接收客戶端發(fā)送的命令,傳遞服務(wù)端的結(jié)果信息等。4、SQL接口組件(SQLInterface)接收用戶SQL命令,如DML,DDL和存儲(chǔ)過(guò)程等,并將最終結(jié)果返回給用戶。5、查詢分析器組件(Parser)首先分析SQL命令語(yǔ)法的合法性,并嘗試將SQL命令分解成數(shù)據(jù)結(jié)構(gòu),若分解失敗,則提示SQL語(yǔ)句不合理。6、優(yōu)化器組件(Optimizer)對(duì)SQL命令按照標(biāo)準(zhǔn)流程進(jìn)行優(yōu)化分析。7、緩存主件(Caches&Buffers)

緩存和緩沖組件8、MySQL存儲(chǔ)引擎MySQL屬于關(guān)系型數(shù)據(jù)庫(kù),而關(guān)系型數(shù)據(jù)庫(kù)的存儲(chǔ)是以表的形式進(jìn)行的,對(duì)于表的創(chuàng)建,數(shù)據(jù)的存儲(chǔ),檢索,更新等都是由MySQL存儲(chǔ)引擎完成的。因MySQL的開源性,允許第三方基于MySQL骨架,開發(fā)適合自己業(yè)務(wù)需求的存儲(chǔ)引擎。因此,MySQL支持的存儲(chǔ)引擎種類較多,可以分為官方存儲(chǔ)引擎和第三方存儲(chǔ)引擎。當(dāng)前,MySQL的存儲(chǔ)引擎有MyISAM、InnoDB、NDB、Archive、Federated、Memory、Merge、Parter、Community、Custom等。其中,比較常用的存儲(chǔ)引擎包括InnoDB、MyISAM和Momery。9、物理文件(FileSystem)實(shí)際存儲(chǔ)MySQL數(shù)據(jù)庫(kù)文件和一些日志文件等的系統(tǒng),如Linux,Unix,Windows等。(二)一個(gè)查詢流程圖(三)MySQL的高可用架構(gòu)因MySQL的開源屬性,其高可用架構(gòu)非常靈活,目前常用的主要有以下幾種:1、主從復(fù)制模式這是MySQL自身提供的一種高可用解決方案,數(shù)據(jù)同步方法采用的是MySQLreplication技術(shù)。為了達(dá)到更高的可用性,在實(shí)際的應(yīng)用環(huán)境中,需要配合高可用集群軟件keepalived來(lái)實(shí)現(xiàn)自動(dòng)failover,否則,需要手工切換。2、MHA(MasterHighAvailability)MHA是相對(duì)成熟的高可用解決方案,該軟件由兩部分組成:MHAManager(管理節(jié)點(diǎn))和MHANode(數(shù)據(jù)節(jié)點(diǎn))。搭建MHA時(shí),要求一個(gè)集群必須最少有三臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,一主二從(即一臺(tái)master,一臺(tái)備用master,另外一臺(tái)slave)。MHAManager可以單獨(dú)部署在一臺(tái)獨(dú)立的機(jī)器上管理多個(gè)master-slave集群,或部署在一臺(tái)slave節(jié)點(diǎn)上,MHANode運(yùn)行在每臺(tái)MySQL服務(wù)器上。運(yùn)行時(shí),MHAManager會(huì)定時(shí)探測(cè)集群中的master節(jié)點(diǎn),當(dāng)master故障時(shí),會(huì)自動(dòng)將最新數(shù)據(jù)的slave提升為新的master,然后將其他所有slave重新指向新的master。整個(gè)故障轉(zhuǎn)移過(guò)程對(duì)應(yīng)用程序完全透明。整個(gè)切換過(guò)程如下:從宕機(jī)崩潰的master保存二進(jìn)制日志事件(binlogevents);識(shí)別含有最新更新的slave;應(yīng)用差異的中繼日志(relaylog)到其他的slave;應(yīng)用從master保存的二進(jìn)制日志事件(binlogevents);提升一個(gè)slave為新的master;使其他的slave連接新的master進(jìn)行復(fù)制;3、MGR(MySQLGroupReplication)MGR是MySQL官方推薦的另一種高可用架構(gòu),復(fù)制組間的數(shù)據(jù)同步基于Paxos協(xié)議。當(dāng)客戶端發(fā)起更新事務(wù)時(shí),該事務(wù)先在本地執(zhí)行,執(zhí)行完成之后就要發(fā)起對(duì)事務(wù)的提交操作。在還沒有真正提交之前,需要將產(chǎn)生的復(fù)制寫集廣播出去,復(fù)制到其它成員。如果沖突檢測(cè)成功,組內(nèi)決定該事務(wù)可以提交,其它成員可以應(yīng)用,否則就回滾。組復(fù)制可以在兩種模式下運(yùn)行:?jiǎn)沃髂J较拢M復(fù)制具有自動(dòng)選主功能,每次只有一個(gè)Server成員接受更新,其它成員只提供讀服務(wù)。多主模式下,所有的Server成員都可以同時(shí)接受更新,沒有主從之分,成員角色是完全對(duì)等的。三、PostgreSQL(一)PostgreSQL的體系架構(gòu)PostgreSQL使用C/S模式提供服務(wù)??蛻舳撕头?wù)器可以在不同的主機(jī)上,通過(guò)TCP/IP進(jìn)行網(wǎng)絡(luò)連接,架構(gòu)如下:1、主進(jìn)程Postgres(常駐進(jìn)程)主進(jìn)程是PostgreSQL啟動(dòng)時(shí),第一個(gè)啟動(dòng)的進(jìn)程Postgres。啟動(dòng)時(shí),他會(huì)執(zhí)行恢復(fù)、初始化共享內(nèi)存,啟動(dòng)后臺(tái)進(jìn)程。當(dāng)有客戶端發(fā)起鏈接請(qǐng)求時(shí),postgres會(huì)生成子進(jìn)程,同時(shí)創(chuàng)建后端進(jìn)程。是整個(gè)數(shù)據(jù)庫(kù)實(shí)例的總控進(jìn)程,負(fù)責(zé)啟動(dòng)和關(guān)閉該數(shù)據(jù)庫(kù)實(shí)例。2、Postgres(子進(jìn)程),子進(jìn)程Postgres接受前端請(qǐng)求,對(duì)數(shù)據(jù)庫(kù)進(jìn)行檢索,最后返回結(jié)果。如請(qǐng)求是對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新,會(huì)先記錄日志(PostgreSQL稱為WAL日志),以便宕機(jī)重啟時(shí)的數(shù)據(jù)恢復(fù)。另外,日志會(huì)定期歸檔保存,以便需要時(shí)進(jìn)行數(shù)據(jù)恢復(fù)。3、后臺(tái)進(jìn)程(BackgroundProcess)Syslogger(系統(tǒng)日志)進(jìn)程將錯(cuò)誤信息寫到log日志中。BgWriter(后臺(tái))進(jìn)程周期性的將臟內(nèi)存塊寫入文件。Checkpointer當(dāng)檢查點(diǎn)出現(xiàn)時(shí),將臟內(nèi)存塊寫到數(shù)據(jù)文件WalWrite(預(yù)寫式日志)進(jìn)程將WAL(WriteAheadLog預(yù)寫式日志)緩存寫入WAL文件。PgArch(歸檔)進(jìn)程在歸檔模式下時(shí),復(fù)制WAL文件到特定的路徑下。WAL日志會(huì)被循環(huán)使用,PgArch在歸檔前會(huì)把WAL日志備份出來(lái)。通過(guò)PITY(PointinTimeRecovery)技術(shù),可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次全量備份后,該技術(shù)將備份時(shí)間點(diǎn)之后的WAL日志通過(guò)歸檔進(jìn)行備份,使用數(shù)據(jù)庫(kù)的全量備份再加上后面產(chǎn)生的WAL日志,即可把數(shù)據(jù)庫(kù)向前推到全量備份后的任意一個(gè)時(shí)間點(diǎn)。AutoVacuum(自動(dòng)清理)進(jìn)程當(dāng)自動(dòng)vacuum被啟用時(shí),用來(lái)派生autovacuum工作進(jìn)程。autovacuum進(jìn)程的作用是在需要時(shí)自動(dòng)對(duì)膨脹表執(zhí)行vacuum操作。在PostgreSQL數(shù)據(jù)庫(kù)中,對(duì)表進(jìn)行DELETE操作后,舊的數(shù)據(jù)并不會(huì)立即被刪除,并且,在更新數(shù)據(jù)時(shí),也并不會(huì)在舊的數(shù)據(jù)上做更新,而是新生成一行數(shù)據(jù)。舊的數(shù)據(jù)只是被標(biāo)識(shí)為刪除狀態(tài),只有在沒有并發(fā)的其他事務(wù)讀到這些就數(shù)據(jù)時(shí),它們才會(huì)被清楚。這個(gè)清除工作就有AutoVacuum進(jìn)程完成。PgStat(統(tǒng)計(jì)數(shù)據(jù)收集)進(jìn)程用來(lái)收集數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息。4、共享內(nèi)存和本地內(nèi)存示意圖如下:共享內(nèi)存PostgreSQL啟動(dòng)后,會(huì)生成一塊共享內(nèi)存,用于做數(shù)據(jù)塊的緩沖區(qū),以便提高讀寫性能。WAL日志緩沖區(qū)和Clog緩沖區(qū)也存在共享內(nèi)存中,除此之外還有全局信息比如進(jìn)程、鎖、全局統(tǒng)計(jì)等信息也保存在共享內(nèi)存中。數(shù)據(jù)緩沖區(qū)通過(guò)BgWrite進(jìn)程,定期將數(shù)據(jù)寫入數(shù)據(jù)文件。WAL緩沖區(qū)通過(guò)WALWrite進(jìn)程寫入WAL文件,并通過(guò)PgArch定期進(jìn)行歸檔,寫入歸檔日志本地內(nèi)存非全局存儲(chǔ)的數(shù)據(jù)都存在本地內(nèi)存中,主要包括:臨時(shí)緩沖區(qū):用于臨時(shí)表。默認(rèn)值為8MBwork_mem:用于排序、位圖索引、哈希鏈接和合并鏈接操作。默認(rèn)值為4MB。。manintance_work_mem:用于vacuum和創(chuàng)建索引操作。默認(rèn)值為64MB。(二)數(shù)據(jù)結(jié)構(gòu)1.

數(shù)據(jù)庫(kù)相關(guān)概念:PostgreSQL由一系列數(shù)據(jù)庫(kù)組成。一套PostgreSQL程序稱之為一個(gè)數(shù)據(jù)庫(kù)群集。當(dāng)initdb()命令執(zhí)行后,template0,template1,和postgres數(shù)據(jù)庫(kù)被創(chuàng)建。template0和template1數(shù)據(jù)庫(kù)是創(chuàng)建用戶數(shù)據(jù)庫(kù)時(shí)使用的模版數(shù)據(jù)庫(kù),他們包含系統(tǒng)元數(shù)據(jù)表。initdb()剛完成后,template0和template1數(shù)據(jù)庫(kù)中的表是一樣的。但是template1數(shù)據(jù)庫(kù)可以根據(jù)用戶需要?jiǎng)?chuàng)建對(duì)象。用戶數(shù)據(jù)庫(kù)是通過(guò)克隆template1數(shù)據(jù)庫(kù)來(lái)創(chuàng)建的;2.

表空間相關(guān)概念:initdb()后,創(chuàng)建pg_default和pg_global表空間。建表時(shí)如果沒有指定特定的表空間,表默認(rèn)被存在pg_default表空間中。用于管理整個(gè)數(shù)據(jù)庫(kù)集群的表默認(rèn)被存儲(chǔ)在pg_global表空間中。pg_default表空間的物理位置為$PGDATAbase目錄。pg_global表空間的物理位置為$PGDATAglobal目錄。一個(gè)表空間可以被多個(gè)數(shù)據(jù)庫(kù)同時(shí)使用。此時(shí),每一個(gè)數(shù)據(jù)庫(kù)都會(huì)在表空間路徑下創(chuàng)建為一個(gè)新的子路徑。創(chuàng)建一個(gè)用戶表空間會(huì)在$PGDATApg_tblspc目錄下面創(chuàng)建一個(gè)軟連接,連接到表空間制定的目錄位置。3.

表相關(guān)概念:每個(gè)表有三個(gè)數(shù)據(jù)文件:一個(gè)文件用于存儲(chǔ)數(shù)據(jù)(文件名是表的OID);一個(gè)文件用于管理表的空閑空間(文件名是OID_fsm)。一個(gè)文件用于管理表的塊是否可見(文件名是OID_vm)。索引沒有_vm文件,只有OID和OID_fsm兩個(gè)文件(三)后端進(jìn)程的處理流程接收前端發(fā)送過(guò)來(lái)的查詢(SQL文)構(gòu)文解析。將SQL文(單純的文字)轉(zhuǎn)換成構(gòu)文樹parsertree。構(gòu)文樹解析完以后,換為查詢樹。這時(shí)會(huì)訪問數(shù)據(jù)庫(kù),檢查表是否存在,如果存在的話,則把表名轉(zhuǎn)換為OID。這個(gè)處理稱為分析處理(Analyze)。因PostgreSQL還通過(guò)查詢語(yǔ)句的重寫實(shí)現(xiàn)視圖(view)和規(guī)則(rule),所以需要時(shí),此階段會(huì)對(duì)查詢語(yǔ)句進(jìn)行重寫。解析查詢樹后,可生成計(jì)劃樹。按照?qǐng)?zhí)行計(jì)劃里面的步驟可以完成查詢要達(dá)到的目的。執(zhí)行結(jié)果返回給前端。返回到步驟一重復(fù)執(zhí)行。四、國(guó)產(chǎn)關(guān)系型數(shù)據(jù)庫(kù)國(guó)產(chǎn)關(guān)系型數(shù)據(jù)庫(kù)較多,此處以GaussDBT為例(一)GaussDBT架構(gòu)1.

內(nèi)存結(jié)構(gòu)內(nèi)存結(jié)構(gòu)分為4部分,如下圖:Listener:包括TCPLSNR和IPCLSNR,用于偵聽用戶的連接請(qǐng)求AgentPool:代理的連接池SGA:LogBuffer:全局日志緩沖區(qū),緩存redo日志

DataBuffer:全局?jǐn)?shù)據(jù)頁(yè)緩沖區(qū),用于緩存表索引等數(shù)據(jù)

SQLCache:全局執(zhí)行計(jì)劃緩沖區(qū)

SortArea:全局排序/物化緩沖區(qū)

DictionaryCache:全局?jǐn)?shù)據(jù)字典(元數(shù)據(jù))緩沖區(qū)

Largepool,大池,存放較大的SQL

SessionPool,全局Session池,用于存放Session后臺(tái)進(jìn)程LOGW:日志寫線程,負(fù)責(zé)將logbuffer中的日志寫到磁盤。CKPT:負(fù)責(zé)將臟頁(yè)(DirtyPage)刷到磁盤,保證WAL,并更新ControlFile。SMON:負(fù)責(zé)監(jiān)測(cè)系統(tǒng)的狀態(tài),比如檢測(cè)死鎖,修復(fù)異常的session。JOB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。