postgresql數(shù)據(jù)庫(kù)是由:連接管理系統(tǒng)(系統(tǒng)控制器)、編譯執(zhí)行系統(tǒng)、存儲(chǔ)管理系統(tǒng)、事務(wù)系統(tǒng)、系統(tǒng)表 五大部分組成。
①:連接管理系統(tǒng):接收外部操作對(duì)系統(tǒng)的請(qǐng)求,對(duì)操作請(qǐng)求進(jìn)行預(yù)處理和分發(fā),起系統(tǒng)邏輯控制作用。
②:編譯執(zhí)行系統(tǒng):由查詢編譯器、查詢執(zhí)行器組成,完成操作請(qǐng)求在數(shù)據(jù)庫(kù)中的分析處理和轉(zhuǎn)化工作,最終實(shí)現(xiàn)物理存儲(chǔ)介質(zhì)中數(shù)據(jù)的操作。
③:存儲(chǔ)管理系統(tǒng):由索引管理器、內(nèi)存管理器、外存管理器組成,負(fù)責(zé)存儲(chǔ)和管理物理數(shù)據(jù),提供對(duì)編譯查詢系統(tǒng)的支持;
④:事務(wù)系統(tǒng):是由事務(wù)管理器、日志管理器、并發(fā)控制、鎖管理器組成,日志管理器和事務(wù)管理器完成對(duì)操作請(qǐng)求處理的事務(wù)一致性支持,鎖管理器 和并發(fā)控制提供對(duì)并發(fā)訪問(wèn)數(shù)據(jù)的一致性支持;
⑤:系統(tǒng)表:是postgresql數(shù)據(jù)庫(kù)的元信息管理中心,包括數(shù)據(jù)庫(kù)對(duì)象信息和數(shù)據(jù)庫(kù)管理控制信息。系統(tǒng)表管理元數(shù)據(jù)信息,將postgresql數(shù)據(jù)庫(kù)的各個(gè)模塊有機(jī)地連接在一起,形成一個(gè)高效的數(shù)據(jù)管理系統(tǒng)。
1、系統(tǒng)表:
數(shù)據(jù)字典是關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)管理控制信息的核心,在postgresql數(shù)據(jù)庫(kù)系統(tǒng)中,系統(tǒng)表扮演著數(shù)據(jù)字典的角色。
系統(tǒng)表是postgresql數(shù)據(jù)庫(kù)存放結(jié)構(gòu)元數(shù)據(jù)的地方,它在postgresql中表現(xiàn)為存放有系統(tǒng)信息的普通表或者視圖。用戶可以刪除然后重建這些表、增加列、插入和更新數(shù)值,然而由用戶去修改系統(tǒng)會(huì)導(dǎo)致系統(tǒng)信息的不一致性,進(jìn)而導(dǎo)致系統(tǒng)控制絮亂。正常情況下不應(yīng)該由用戶手工修改系統(tǒng)表,而是由sql命令關(guān)聯(lián)的系統(tǒng)表操作自動(dòng)維護(hù)系統(tǒng)表信息。
postgresql的每一個(gè)數(shù)據(jù)庫(kù)中都有自己的一套系統(tǒng)表,其中大多數(shù)系統(tǒng)表都是在數(shù)據(jù)庫(kù)創(chuàng)建時(shí)從模板數(shù)據(jù)庫(kù)中拷貝過(guò)來(lái)的,因此這些系統(tǒng)表里的數(shù)據(jù)都是與所屬數(shù)據(jù)庫(kù)相關(guān)的。只有少數(shù)系統(tǒng)表是所有數(shù)據(jù)庫(kù)共享的(比如pg_database),這些系統(tǒng)表里的數(shù)據(jù)是關(guān)于所有數(shù)據(jù)庫(kù)的。
由于系統(tǒng)表保存了數(shù)據(jù)庫(kù)的所有元數(shù)據(jù),所以系統(tǒng)運(yùn)行時(shí)對(duì)系統(tǒng)表的訪問(wèn)是非常頻繁的。為了提高系統(tǒng)性能,在內(nèi)存中建立了共享的系統(tǒng)表cache,使用hash函數(shù)和hash表提高查詢效率。
主要系統(tǒng)表功能:
①:pg_namespace:
pg_namespace用于存儲(chǔ)命名空間。命名空間是sql92模式下層的結(jié)構(gòu):每個(gè)名字空間有獨(dú)立的關(guān)系、類型等集合,但并不會(huì)相互沖突。postgresql的名字空間層次是:數(shù)據(jù)庫(kù)、模式、表、屬性。
②:pg_tablespace:
pg_tablespace存儲(chǔ)表空間信息,將表放置在不同的表空間有助于實(shí)施磁盤文件布局。pg_tablespace在整個(gè)數(shù)據(jù)簇里只有一份,也就是說(shuō)同一個(gè)數(shù)據(jù)集簇內(nèi)的所有數(shù)據(jù)庫(kù)共享一個(gè)pg_tablespace表,而不是每個(gè)數(shù)據(jù)庫(kù)都有自己的pg_tablespace表。
③:pg_database:
pg_database中存放了當(dāng)前數(shù)據(jù)集簇中數(shù)據(jù)庫(kù)的信息,它也是一個(gè)在整個(gè)集簇范圍內(nèi)共享的系統(tǒng)表。該表中每一個(gè)元祖就表示集簇中的一個(gè)數(shù)據(jù)庫(kù),每一個(gè)數(shù)據(jù)庫(kù)都被分配一個(gè)OID作為唯一標(biāo)識(shí),并且存儲(chǔ)在對(duì)應(yīng)元祖的隱藏屬性中。
④:pg_class:
pg_class存儲(chǔ)表及表類似結(jié)構(gòu)的數(shù)據(jù)庫(kù)對(duì)象信息,包含索引、序列、視圖、復(fù)合數(shù)據(jù)類型、toast表等。每一個(gè)對(duì)象都在pg_class中表示為一個(gè)元祖,并且每一個(gè)對(duì)象都會(huì)被分配一個(gè)OID作為唯一標(biāo)識(shí),該OID作為該元祖的一個(gè)隱藏屬性存儲(chǔ)。
⑤:pg_type:
pg_type存儲(chǔ)數(shù)據(jù)類型信息?;緮?shù)據(jù)類型和枚舉類型由create type創(chuàng)建,域類型由create domain創(chuàng)建,復(fù)合數(shù)據(jù)類型在表創(chuàng)建時(shí)自動(dòng)創(chuàng)建。
⑥:pg_attribute:
pg_attribute存儲(chǔ)表的屬性信息,對(duì)于數(shù)據(jù)庫(kù)中表的每個(gè)屬性都有一個(gè)元祖。
⑦:pg_index:
pg_index存儲(chǔ)索引的具體信息。
系統(tǒng)視圖如下:
這些系統(tǒng)視圖提供了查詢系統(tǒng)表和訪問(wèn)數(shù)據(jù)庫(kù)內(nèi)部狀態(tài)的方法,如下大部分系統(tǒng)視圖及其用途:
pg_cursors ---打開的游標(biāo)
pg_group ---數(shù)據(jù)庫(kù)用戶的組
pg_indexes ---索引
pg_locks ---當(dāng)前持有的鎖
pg_prepared_statements --預(yù)備語(yǔ)句
2、數(shù)據(jù)集簇
postgresql安裝完成后,必須先使用initdb程序初始化磁盤上的數(shù)據(jù)存儲(chǔ)區(qū),即數(shù)據(jù)集簇,由postgresql管理的用戶數(shù)據(jù)庫(kù)以及系統(tǒng)數(shù)據(jù)庫(kù)總稱為數(shù)據(jù)集簇。在postgresql的實(shí)現(xiàn)中,數(shù)據(jù)庫(kù)就是磁盤上一些文件的集合,只不過(guò)這些文件有特定的文件名、存儲(chǔ)位置等,并且有些文件之間會(huì)相互關(guān)聯(lián)。默認(rèn)情況下,postgresql的所有數(shù)據(jù)讀存儲(chǔ)在其數(shù)據(jù)目錄里,這個(gè)數(shù)據(jù)目錄通常會(huì)用環(huán)境變量pgdata來(lái)引用。
pgdata中還保存有數(shù)據(jù)集簇的配置文件和其他子目錄,各個(gè)目錄及用途說(shuō)明如下:
pg_version :一個(gè)包含postgresql主版本號(hào)的文件。
base目錄:包含每個(gè)數(shù)據(jù)庫(kù)目錄,數(shù)據(jù)庫(kù)目錄以數(shù)據(jù)庫(kù)的OID編號(hào)命名,其中名為1的目錄對(duì)應(yīng)模板數(shù)據(jù)庫(kù)template1
global目錄:包含整個(gè)集簇共享的全局表,比如pg_database
pg_clog目錄:包含事務(wù)提交狀態(tài)數(shù)據(jù)的子目錄
pg_multixact目錄:包含多重事務(wù)狀態(tài)數(shù)據(jù)的子目錄(用于共享的行鎖)
pg_stat_tmp目錄:包含統(tǒng)計(jì)子系統(tǒng)所需臨時(shí)文件的子目錄。
pg_subtrans目錄:包含子事務(wù)狀態(tài)數(shù)據(jù)的子目錄。
pg_tblspc目錄:包含指向表空間的符合鏈接的子目錄。
pg_twophase目錄:包含用于預(yù)備事務(wù)的狀態(tài)文件的子目錄
pg_xlog目錄:包含WAL(預(yù)寫日志)文件的子目錄。
postmaster.opts文件:記錄服務(wù)器上一次啟動(dòng)時(shí)使用的命令行參數(shù)。
postmaster.pid文件:一個(gè)鎖文件,記錄著當(dāng)前的守護(hù)進(jìn)程postmaster的進(jìn)程號(hào)和共享內(nèi)存段ID,在服務(wù)器關(guān)閉之后此文件將被刪除。
postgresql.conf文件:主要配置文件,除基于主機(jī)的訪問(wèn)控制和用戶名映射之外的其他用戶可設(shè)置參數(shù)都保存在這個(gè)文件中。
pg_hba.conf文件:基于主機(jī)的訪問(wèn)控制文件,保存對(duì)客戶端認(rèn)證方式的設(shè)置信息。
pg_indent.conf文件:用戶名映射文件,定義了操作系統(tǒng)系統(tǒng)用戶名和postgresql用戶名之間的對(duì)應(yīng)關(guān)系,這些對(duì)應(yīng)關(guān)系會(huì)被pg_hba.conf用到。
initdb的主要參數(shù)介紹:
-A method 指定本地連接的默認(rèn)用戶認(rèn)證方式。
-D datadir 數(shù)據(jù)目錄的路徑,必須是對(duì)當(dāng)前用戶可讀寫的空目錄,也可以使用環(huán)境變量pgdata來(lái)指定
-E encodinc 指定默認(rèn)數(shù)據(jù)庫(kù)編碼方式
-U name 指定數(shù)據(jù)庫(kù)超級(jí)用戶名
-W 指示超級(jí)用戶設(shè)置口令
-d 以調(diào)試模式運(yùn)行,可以打印出很多調(diào)試信息
-L 指定輸入文件(比如postgres.bki)位置。
3、系統(tǒng)數(shù)據(jù)庫(kù):
在初始化完成之后,會(huì)默認(rèn)創(chuàng)建3個(gè)系統(tǒng)數(shù)據(jù)庫(kù):template1,template0和postgres。其中template0和postgres都是在初始化過(guò)程中從template1拷貝過(guò)來(lái)的。
template1和template0 數(shù)據(jù)庫(kù)用于創(chuàng)建數(shù)據(jù)庫(kù)。postgresql中采用從模板數(shù)據(jù)庫(kù)復(fù)制的方式來(lái)創(chuàng)建新的數(shù)據(jù)庫(kù),在創(chuàng)建數(shù)據(jù)庫(kù)的命令中可以用-T選項(xiàng)來(lái)指定以哪個(gè)數(shù)據(jù)庫(kù)為模板來(lái)創(chuàng)建新數(shù)據(jù)庫(kù)。
postgres用于給初始化用戶提供了一個(gè)可連接的數(shù)據(jù)庫(kù),就像Linux系統(tǒng)中一個(gè)用戶的主目錄一樣。
注意:
這些系統(tǒng)數(shù)據(jù)庫(kù)都是可以刪除的,但是兩個(gè)模板數(shù)據(jù)庫(kù)在刪除之前必須將其在pg_database中元組的datistemplate屬性改為false,否則刪除時(shí)會(huì)提示“不能刪除一個(gè)模板數(shù)據(jù)庫(kù)”。
4、postgresql進(jìn)程結(jié)構(gòu):
postgresql使用一種專用服務(wù)器進(jìn)程體系結(jié)構(gòu),其中,最主要的兩個(gè)進(jìn)程就是守護(hù)進(jìn)程postmaster和服務(wù)進(jìn)程postgres。從本質(zhì)上來(lái)說(shuō),postmaster和postgres都是通過(guò)載入postgres程序而形成的進(jìn)程,只是在運(yùn)行時(shí)所處的分支不同而已。守護(hù)進(jìn)程postmaster負(fù)責(zé)整個(gè)系統(tǒng)的啟動(dòng)和關(guān)閉。它監(jiān)聽(tīng)并接受客戶端的連接請(qǐng)求,為其分配服務(wù)進(jìn)程postgres。服務(wù)進(jìn)程postgres接受并執(zhí)行客戶端發(fā)送的命令。它在底層模塊(如存儲(chǔ)、事務(wù)管理、索引等)之上調(diào)用各個(gè)主要功能模塊(如編譯器、優(yōu)化器、執(zhí)行器等),完成客戶端的各種數(shù)據(jù)庫(kù)操作,并返回執(zhí)行結(jié)果。
4.1、守護(hù)進(jìn)程postmaster
它是一個(gè)運(yùn)行在服務(wù)器上的總控進(jìn)程,負(fù)責(zé)整個(gè)系統(tǒng)的啟動(dòng)和關(guān)閉,并且在服務(wù)進(jìn)程出現(xiàn)錯(cuò)誤時(shí)完成系統(tǒng)的恢復(fù)。它管理數(shù)據(jù)庫(kù)文件、監(jiān)聽(tīng)并接受來(lái)自客戶端的連接請(qǐng)求,并且為客戶端連接請(qǐng)求fork一個(gè)postgres服務(wù)進(jìn)程,來(lái)代表客戶端在數(shù)據(jù)庫(kù)上執(zhí)行各種命令。同時(shí)postmaster還管理與數(shù)據(jù)庫(kù)運(yùn)行相關(guān)的輔助進(jìn)程。用戶可以使用postmaster、postgres或者pg_ctl命令啟動(dòng)postmaster。
postmaster就像一個(gè)處理客戶端請(qǐng)求的調(diào)度中心。當(dāng)客戶端程序需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),首先會(huì)發(fā)出一個(gè)起始消息給postmaster進(jìn)行請(qǐng)求。postmaster將根據(jù)這個(gè)起始消息中的信息對(duì)客戶端的身份進(jìn)行驗(yàn)證,如果身份驗(yàn)證通過(guò),postmaster就為該客戶端新建一個(gè)服務(wù)進(jìn)程postgres。隨后postmaster將于客戶端的交互工作轉(zhuǎn)交給postgres服務(wù)進(jìn)程,由postgres來(lái)完成客戶端所需要的數(shù)據(jù)庫(kù)操作。
postmaster也負(fù)責(zé)整個(gè)系統(tǒng)范圍的操作,例如:中斷等操作,postmaster本身不進(jìn)行這些操作,它只是指派一個(gè)子進(jìn)程在適當(dāng)?shù)臅r(shí)間去處理它們。同時(shí)它要在數(shù)據(jù)庫(kù)崩潰的時(shí)候重啟系統(tǒng)。postmaster進(jìn)程在起始時(shí)會(huì)建立共享內(nèi)存和信號(hào)庫(kù),postmaster及其子進(jìn)程的通信就通過(guò)共享內(nèi)存和信號(hào)來(lái)實(shí)現(xiàn)。這種多進(jìn)程設(shè)計(jì)使得整個(gè)系統(tǒng)的穩(wěn)定性更好,即使某個(gè)后臺(tái)進(jìn)程崩潰也不會(huì)影響系統(tǒng)中其他進(jìn)程的工作,postmaster只需要重置共享內(nèi)存即可從單個(gè)后臺(tái)進(jìn)程的崩潰中恢復(fù)。
4.1.1、輔助進(jìn)程啟動(dòng):
在postgresql中,守護(hù)進(jìn)程postmaster負(fù)責(zé)整個(gè)系統(tǒng)的啟動(dòng)和關(guān)閉。在一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)例中,除了守護(hù)進(jìn)程postmaster和服務(wù)進(jìn)程postgres外,還包括一些其他后臺(tái)進(jìn)程,用于專門負(fù)責(zé)某項(xiàng)具體的工作。在這些輔助進(jìn)程出現(xiàn)問(wèn)題時(shí),postmaster進(jìn)程重新產(chǎn)生出現(xiàn)問(wèn)題的輔助進(jìn)程。在postmaster的創(chuàng)建過(guò)程中會(huì)首先啟動(dòng)syslogger日志進(jìn)程,并完成pgstat進(jìn)程、autovacuum進(jìn)程的初始化工作,而在postmaster的監(jiān)聽(tīng)循環(huán)中檢測(cè)輔助進(jìn)程的狀態(tài),并新建或者重新創(chuàng)建這些輔助進(jìn)程。
①:syslogger輔助進(jìn)程
postmaster進(jìn)程調(diào)用syslogger_start函數(shù)啟動(dòng)syslogger子進(jìn)程。syslogger是8.0后新加的特性,它通過(guò)一個(gè)管道從postmaster、所有后臺(tái)進(jìn)程及其他的子進(jìn)程那里收集所有的stderr輸出,并將這些輸出寫入到日志文件中。在postgresql.conf配置文件中設(shè)置了日志文件的大小和存在時(shí)間,若當(dāng)前的日志文件達(dá)到這些限制時(shí),就會(huì)被關(guān)閉,并且一個(gè)新的日志文件會(huì)被創(chuàng)建。
②:輔助進(jìn)程初始化
syslogger輔助進(jìn)程啟動(dòng)完成后,postmaster開始對(duì)輔助進(jìn)程pgstat進(jìn)程、autovacuum進(jìn)程進(jìn)行初始化操作,為進(jìn)程分配必要的資源。
在pgstat進(jìn)程的初始化過(guò)程中,主要完成用于發(fā)送和接收統(tǒng)計(jì)消息的UDP端口創(chuàng)建和測(cè)試,UDP端口的創(chuàng)建過(guò)程與前面描述的TCP端口創(chuàng)建流程相同,但是socket端口類型改為sock_dgram。
4.2、輔助進(jìn)程:
postgresql的各個(gè)輔助進(jìn)程完成特定的功能,支撐postgresql系統(tǒng)運(yùn)行和管理工作。在postmaster進(jìn)程中,為每個(gè)輔助進(jìn)程設(shè)置了一個(gè)全局變量來(lái)標(biāo)識(shí)該進(jìn)程號(hào),分別為sysloggerPID、多個(gè)writerPID、walwriterPID、autovacPID、pgarchPID、pgstatPID。當(dāng)這些變量值為0時(shí),標(biāo)識(shí)相應(yīng)的進(jìn)程尚未啟動(dòng)。
4.2.1、syslogger系統(tǒng)日志進(jìn)程:
日志信息是數(shù)據(jù)庫(kù)管理員獲取數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行狀態(tài)的有效手段。在syslogger的配置選項(xiàng)中可以設(shè)置日志文件的大小,syslogger會(huì)在日志文件達(dá)到指定大小時(shí)關(guān)閉當(dāng)前日志文件,產(chǎn)生新的日志文件。在postgresql.conf配置文件可以配置日志操作的相關(guān)參數(shù)如下:
log_destination:配置日志輸出目標(biāo),根據(jù)不同的運(yùn)行平臺(tái)會(huì)設(shè)置不同的值,Linux下默認(rèn)為stderr。
logging_collector:是否開啟日志收集器,當(dāng)設(shè)置on時(shí)啟動(dòng)日志功能,否則系統(tǒng)將不產(chǎn)生系統(tǒng)日志輔助進(jìn)程。
log_directory:配置日志輸出文件夾。
log_filename:配置日志文件名稱命名規(guī)則。
log_rotation_size:配置日志文件大小,當(dāng)前日志文件達(dá)到這個(gè)大小時(shí)會(huì)被關(guān)閉,然后創(chuàng)建一個(gè)新的文件來(lái)作為當(dāng)前日志文件。
(當(dāng)然,postgresql.conf中還提供了其他配置參數(shù),可以根據(jù)需要進(jìn)行設(shè)置。)
4.2.2、后臺(tái)寫進(jìn)程bgwriter
BgWriter進(jìn)程是把共享內(nèi)存中的臟頁(yè)寫到磁盤上的進(jìn)程。它的作用有兩個(gè):一是定期把臟數(shù)據(jù)從內(nèi)存緩沖區(qū)刷出到磁盤中,減少查詢時(shí)的阻塞;二是PG在定期作檢查點(diǎn)時(shí)需要把所有臟頁(yè)寫出到磁盤,通過(guò)BgWriter預(yù)先寫出一些臟頁(yè),可以減少設(shè)置檢查點(diǎn)(CheckPoint,數(shù)據(jù)庫(kù)恢復(fù)技術(shù)的一種)時(shí)要進(jìn)行的IO操作,使系統(tǒng)的IO負(fù)載趨向平穩(wěn)。BgWriter是PostgreSQL 8.0以后新加的特性,它的機(jī)制可以通過(guò)postgresql.conf文件中以"bgwriter_"開頭配置參數(shù)來(lái)控制:
bgwriter_delay:
backgroud writer進(jìn)程連續(xù)兩次flush數(shù)據(jù)之間的時(shí)間的間隔。默認(rèn)值是200,單位是毫秒。
bgwriter_lru_maxpages:
backgroud writer進(jìn)程每次寫的最多數(shù)據(jù)量,默認(rèn)值是100,單位buffers。如果臟數(shù)據(jù)量小于該數(shù)值時(shí),寫操作全部由backgroud writer進(jìn)程完成;反之,大于該值時(shí),大于的部分將有server process進(jìn)程完成。設(shè)置該值為0時(shí)表示禁用backgroud writer寫進(jìn)程,完全有server process來(lái)完成;配置為-1時(shí)表示所有臟數(shù)據(jù)都由backgroud writer來(lái)完成。(這里不包括checkpoint操作)
bgwriter_lru_multiplier:
這個(gè)參數(shù)表示每次往磁盤寫數(shù)據(jù)塊的數(shù)量,當(dāng)然該值必須小于bgwriter_lru_maxpages。設(shè)置太小時(shí)需要寫入的臟數(shù)據(jù)量大于每次寫入的數(shù)據(jù)量,這樣剩余需要寫入磁盤的工作需要server process進(jìn)程來(lái)完成,將會(huì)降低性能;值配置太大說(shuō)明寫入的臟數(shù)據(jù)量多于當(dāng)時(shí)所需buffer的數(shù)量,方便了后面再次申請(qǐng)buffer工作,同時(shí)可能出現(xiàn)IO的浪費(fèi)。該參數(shù)的默認(rèn)值是2.0。
bgwriter的大數(shù)據(jù)量計(jì)算方式:
1000/bgwriter_delay*bgwriter_lru_maxpages*8K=大數(shù)據(jù)量
bgwriter_flush_after:
數(shù)據(jù)頁(yè)大小達(dá)到bgwriter_flush_after時(shí)觸發(fā)BgWriter,默認(rèn)是512KB。
4.2.3、PgArch(歸檔)進(jìn)程
類似于Oracle數(shù)據(jù)庫(kù)的ARCH歸檔進(jìn)程,不同的是ARCH是吧redo log進(jìn)行歸檔,PgArch是把WAL日志進(jìn)行歸檔。再深入點(diǎn),WAL日志會(huì)被循環(huán)使用,也就是說(shuō),過(guò)去的WAL日志會(huì)被新產(chǎn)生的日志覆蓋,PgArch進(jìn)程就是為了在覆蓋前把WAL日志備份出來(lái)。歸檔日志的作用是為了數(shù)據(jù)庫(kù)能夠使用全量備份和備份后產(chǎn)生的歸檔日志,從而讓數(shù)據(jù)庫(kù)回到過(guò)去的任一時(shí)間點(diǎn)。PG從8.X版本開始提供的PITR(Point-In-Time-Recovery)技術(shù),就是運(yùn)用的歸檔日志。
PgArch進(jìn)程通過(guò)postgresql.conf文件中的如下參數(shù)進(jìn)行配置:
# - Archiving - #archive_mode = off # enables archiving; off, on, or always # (change requires restart) #archive_command = '' # command to use to archive a logfile segment # placeholders: %p = path of file to archive # %f = file name only # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' #archive_timeout = 0 # force a logfile segment switch after this # number of seconds; 0 disables archive_mode:表示是否進(jìn)行歸檔操作,可選擇為off(關(guān)閉)、on(啟動(dòng))和always(總是開啟),默認(rèn)值為off(關(guān)閉)。 archive_command:由管理員設(shè)置的用于歸檔WAL日志的命令。在用于歸檔的命令中,預(yù)定義變量“%p”用來(lái)指代需要?dú)w檔的WAL全路徑文件名,“%f”表示不帶路徑的文件名(這里的路徑都是相對(duì)于當(dāng)前工作目錄的路徑)。每個(gè)WAL段文件歸檔時(shí)將調(diào)用archive_command所指定的命令。當(dāng)歸檔命令返回0時(shí),PostgreSQL就會(huì)認(rèn)為文件被成功歸檔,然后就會(huì)刪除或循環(huán)使用該WAL段文件。否則,如果返回一個(gè)非零值,PostgreSQL會(huì)認(rèn)為文件沒(méi)有被成功歸檔,便會(huì)周期性地重試直到成功。 archive_timeout:表示歸檔周期,在超過(guò)該參數(shù)設(shè)定的時(shí)間時(shí)強(qiáng)制切換WAL段,默認(rèn)值為0(表示禁用該功能)。
4.2.4、PgStat(統(tǒng)計(jì)數(shù)據(jù)收集)進(jìn)程:
PgStat進(jìn)程是PostgreSQL數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息收集器,用來(lái)收集數(shù)據(jù)庫(kù)運(yùn)行期間的統(tǒng)計(jì)信息,如表的增刪改次數(shù),數(shù)據(jù)塊的個(gè)數(shù),索引的變化等等。收集統(tǒng)計(jì)信息主要是為了讓優(yōu)化器做出正確的判斷,選擇最佳的執(zhí)行計(jì)劃。postgresql.conf文件中與PgStat進(jìn)程相關(guān)的參數(shù),如下:
#------------------------------------------------------------------------------ # RUNTIME STATISTICS #------------------------------------------------------------------------------ # - Query/Index Statistics Collector - #track_activities = on #track_counts = on #track_io_timing = off #track_functions = none # none, pl, all #track_activity_query_size = 1024 # (change requires restart) #stats_temp_directory = 'pg_stat_tmp' track_activities:表示是否對(duì)會(huì)話中當(dāng)前執(zhí)行的命令開啟統(tǒng)計(jì)信息收集功能,該參數(shù)只對(duì)超級(jí)用戶和會(huì)話所有者可見(jiàn),默認(rèn)值為on(開啟)。 track_counts:表示是否對(duì)數(shù)據(jù)庫(kù)活動(dòng)開啟統(tǒng)計(jì)信息收集功能,由于在AutoVacuum自動(dòng)清理進(jìn)程中選擇清理的數(shù)據(jù)庫(kù)時(shí),需要數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息,因此該參數(shù)默認(rèn)值為on。 track_io_timing:定時(shí)調(diào)用數(shù)據(jù)塊I/O,默認(rèn)是off,因?yàn)樵O(shè)置為開啟狀態(tài)會(huì)反復(fù)的調(diào)用數(shù)據(jù)庫(kù)時(shí)間,這給數(shù)據(jù)庫(kù)增加了很多開銷。只有超級(jí)用戶可以設(shè)置 track_functions:表示是否開啟函數(shù)的調(diào)用次數(shù)和調(diào)用耗時(shí)統(tǒng)計(jì)。 track_activity_query_size:設(shè)置用于跟蹤每一個(gè)活動(dòng)會(huì)話的當(dāng)前執(zhí)行命令的字節(jié)數(shù),默認(rèn)值為1024,只能在數(shù)據(jù)庫(kù)啟動(dòng)后設(shè)置。 stats_temp_directory:統(tǒng)計(jì)信息的臨時(shí)存儲(chǔ)路徑。路徑可以是相對(duì)路徑或者絕對(duì)路徑,參數(shù)默認(rèn)為pg_stat_tmp,設(shè)置此參數(shù)可以減少數(shù)據(jù)庫(kù)的物理I/O,提高性能。此參數(shù)只能在postgresql.conf文件或者服務(wù)器命令行中修改。4.2.5、AutoVacuum(自動(dòng)清理)進(jìn)程
在PG數(shù)據(jù)庫(kù)中,對(duì)數(shù)據(jù)進(jìn)行UPDATE或者DELETE操作后,數(shù)據(jù)庫(kù)不會(huì)立即刪除舊版本的數(shù)據(jù),而是標(biāo)記為刪除狀態(tài)。這是因?yàn)镻G數(shù)據(jù)庫(kù)具有多版本的機(jī)制,如果這些舊版本的數(shù)據(jù)正在被另外的事務(wù)打開,那么暫時(shí)保留他們是很有必要的。當(dāng)事務(wù)提交后,舊版本的數(shù)據(jù)已經(jīng)沒(méi)有價(jià)值了,數(shù)據(jù)庫(kù)需要清理垃圾數(shù)據(jù)騰出空間,而清理工作就是AutoVacuum進(jìn)程進(jìn)行的。postgresql.conf文件中與AutoVacuum進(jìn)程相關(guān)的參數(shù)有:
#------------------------------------------------------------------------------ # AUTOVACUUM PARAMETERS #------------------------------------------------------------------------------ #autovacuum = on # Enable autovacuum subprocess? 'on' # requires track_counts to also be on. #log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and # their durations, > 0 logs only # actions running at least this number # of milliseconds. #autovacuum_max_workers = 3 # max number of autovacuum subprocesses # (change requires restart) #autovacuum_naptime = 1min # time between autovacuum runs #autovacuum_vacuum_threshold = 50 # min number of row updates before # vacuum #autovacuum_analyze_threshold = 50 # min number of row updates before # analyze #autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum #autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze #autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum # (change requires restart) #autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age # before forced vacuum # (change requires restart) #autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for # autovacuum, in milliseconds; # -1 means use vacuum_cost_delay #autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for # autovacuum, -1 means use # vacuum_cost_limit autovacuum:是否啟動(dòng)系統(tǒng)自動(dòng)清理功能,默認(rèn)值為on。 log_autovacuum_min_duration:這個(gè)參數(shù)用來(lái)記錄 autovacuum 的執(zhí)行時(shí)間,當(dāng) autovaccum 的執(zhí)行時(shí)間超過(guò) log_autovacuum_min_duration參數(shù)設(shè)置時(shí),則autovacuum信息記錄到日志里,默認(rèn)為 "-1", 表示不記錄。 autovacuum_max_workers:設(shè)置系統(tǒng)自動(dòng)清理工作進(jìn)程的大數(shù)量。 autovacuum_naptime:設(shè)置兩次系統(tǒng)自動(dòng)清理操作之間的間隔時(shí)間。 autovacuum_vacuum_threshold和autovacuum_analyze_threshold:設(shè)置當(dāng)表上被更新的元組數(shù)的閾值超過(guò)這些閾值時(shí)分別需要執(zhí)行vacuum和analyze。 autovacuum_vacuum_scale_factor和autovacuum_analyze_scale_factor:設(shè)置表大小的縮放系數(shù)。 autovacuum_freeze_max_age:設(shè)置需要強(qiáng)制對(duì)數(shù)據(jù)庫(kù)進(jìn)行清理的XID上限值。 autovacuum_vacuum_cost_delay:當(dāng)autovacuum進(jìn)程即將執(zhí)行時(shí),對(duì) vacuum 執(zhí)行 cost 進(jìn)行評(píng)估,如果超過(guò) autovacuum_vacuum_cost_limit設(shè)置值 時(shí),則延遲,這個(gè)延遲的時(shí)間即為 autovacuum_vacuum_cost_delay。如果值為 -1, 表示使用 vacuum_cost_delay 值,默認(rèn)值為 20 ms。 autovacuum_vacuum_cost_limit:這個(gè)值為 autovacuum 進(jìn)程的評(píng)估閥值, 默認(rèn)為 -1, 表示使用 "vacuum_cost_limit " 值,如果在執(zhí)行 autovacuum 進(jìn)程期間評(píng)估的cost 超過(guò) autovacuum_vacuum_cost_limit, 則 autovacuum 進(jìn)程則會(huì)休眠。2.4.6、WalWriter(預(yù)寫式日志寫)進(jìn)程
預(yù)寫式日志W(wǎng)AL(Write Ahead Log,也稱為Xlog)的中心思想是對(duì)數(shù)據(jù)文件的修改必須是只能發(fā)生在這些修改已經(jīng)記錄到日志之后,也就是先寫日志后寫數(shù)據(jù)(日志先行)。使用這種機(jī)制可以避免數(shù)據(jù)頻繁的寫入磁盤,可以減少磁盤I/O。數(shù)據(jù)庫(kù)在宕機(jī)重啟后可以運(yùn)用這些WAL日志來(lái)恢復(fù)數(shù)據(jù)庫(kù)。postgresql.conf文件中與WalWriter進(jìn)程相關(guān)的參數(shù)如下:
#------------------------------------------------------------------------------ # WRITE AHEAD LOG #------------------------------------------------------------------------------ # - Settings - #wal_level = minimal # minimal, replica, or logical # (change requires restart) #fsync = on # flush data to disk for crash safety # (turning this off can cause # unrecoverable data corruption) #synchronous_commit = on # synchronization level; # off, local, remote_write, remote_apply, or on #wal_sync_method = fsync # the default is the first option # supported by the operating system: # open_datasync # fdatasync (default on Linux) # fsync # fsync_writethrough # open_sync #full_page_writes = on # recover from partial page writes #wal_compression = off # enable compression of full-page writes #wal_log_hints = off # also do full page writes of non-critical updates # (change requires restart) #wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers # (change requires restart) #wal_writer_delay = 200ms # 1-10000 milliseconds #wal_writer_flush_after = 1MB # measured in pages, 0 disables #commit_delay = 0 # range 0-100000, in microseconds #commit_siblings = 5 # range 1-1000 wal_level:控制wal存儲(chǔ)的級(jí)別。wal_level決定有多少信息被寫入到WAL中。 默認(rèn)值是最小的(minimal),其中只寫入從崩潰或立即關(guān)機(jī)中恢復(fù)的所需信息。replica 增加 wal 歸檔信息 同時(shí)包括 只讀服務(wù)器需要的信息。(9.6 中新增,將之前版本的 archive 和 hot_standby 合并) logical 主要用于logical decoding 場(chǎng)景 fsync:該參數(shù)直接控制日志是否先寫入磁盤。默認(rèn)值是ON(先寫入),表示更新數(shù)據(jù)寫入磁盤時(shí)系統(tǒng)必須等待WAL的寫入完成??梢耘渲迷搮?shù)為OFF,表示更新數(shù)據(jù)寫入磁盤完全不用等待WAL的寫入完成。 synchronous_commit:參數(shù)配置是否等待WAL完成后才返回給用戶事務(wù)的狀態(tài)信息。默認(rèn)值是ON,表明必須等待WAL完成后才返回事務(wù)狀態(tài)信息;配置成OFF能夠更快地反饋回事務(wù)狀態(tài)。 wal_sync_method:WAL寫入磁盤的控制方式,默認(rèn)值是fsync,可選用值包括open_datasync、fdatasync、fsync_writethrough、fsync、open_sync。open_datasync和open_sync分別表示在打開WAL文件時(shí)使用O_DSYNC和O_SYNC標(biāo)志;fdatasync和fsync分別表示在每次提交時(shí)調(diào)用fdatasync和fsync函數(shù)進(jìn)行數(shù)據(jù)寫入,兩個(gè)函數(shù)都是把操作系統(tǒng)的磁盤緩存寫回磁盤,但前者只寫入文件的數(shù)據(jù)部分,而后者還會(huì)同步更新文件的屬性;fsync_writethrough表示在每次提交并寫回磁盤會(huì)保證操作系統(tǒng)磁盤緩存和內(nèi)存中的內(nèi)容一致。 full_page_writes:表明是否將整個(gè)page寫入WAL。 wal_buffers:用于存放WAL數(shù)據(jù)的內(nèi)存空間大小,系統(tǒng)默認(rèn)值是64K,該參數(shù)還受wal_writer_delay、commit_delay兩個(gè)參數(shù)的影響。 wal_writer_delay:WalWriter進(jìn)程的寫間隔時(shí)間,默認(rèn)值是200毫秒,如果時(shí)間過(guò)長(zhǎng)可能造成WAL緩沖區(qū)的內(nèi)存不足;時(shí)間過(guò)短將會(huì)引起WAL的不斷寫入, 增加磁盤I/O負(fù)擔(dān)。 wal_writer_flush_after: commit_delay:表示一個(gè)已經(jīng)提交的數(shù)據(jù)在WAL緩沖區(qū)中存放的時(shí)間,默認(rèn)值是0毫秒,表示不用延遲;設(shè)置為非0值時(shí)事務(wù)執(zhí)行commit后不會(huì)立即寫入WAL 中,而仍存放在WAL緩沖區(qū)中,等待WalWriter進(jìn)程周期性地寫入磁盤。 commit_siblings:表示當(dāng)一個(gè)事務(wù)發(fā)出提交請(qǐng)求時(shí),如果數(shù)據(jù)庫(kù)中正在執(zhí)行的事務(wù)數(shù)量大于commit_siblings值,則該事務(wù)將等待一段時(shí)間(commit_delay的值);否則該事務(wù)則直接寫入WAL。系統(tǒng)默認(rèn)值是5,該參數(shù)還決定了commit_delay的有效性。 wal_writer_flush_after:當(dāng)臟數(shù)據(jù)超過(guò)閾值時(shí),會(huì)被刷出到磁盤。2.4.7、CheckPoint(檢查點(diǎn))進(jìn)程
檢查點(diǎn)是系統(tǒng)設(shè)置的事務(wù)序列點(diǎn),設(shè)置檢查點(diǎn)保證檢查點(diǎn)前的日志信息刷到磁盤中。postgresql.conf文件中與之相關(guān)的參數(shù)有:
# - Checkpoints - #checkpoint_timeout = 5min # range 30s-1d #max_wal_size = 1GB #min_wal_size = 80MB #checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 #checkpoint_flush_after = 256kB # measured in pages, 0 disables #checkpoint_warning = 30s # 0 disables另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:postgresql數(shù)據(jù)庫(kù)體系結(jié)構(gòu)-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://chinadenli.net/article10/cephgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制開發(fā)、定制網(wǎng)站、網(wǎng)站排名、網(wǎng)站導(dǎo)航、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容