概覽
PG是一個(gè)典型的c/s模型
體系結(jié)構(gòu)=實(shí)例+存儲(chǔ)結(jié)構(gòu)
實(shí)例=進(jìn)程+內(nèi)存結(jié)構(gòu)

實(shí)例結(jié)構(gòu)

PG是多進(jìn)程的,類似oracle,區(qū)別于MySQL的單進(jìn)程多線程。
PostMaster進(jìn)程(PM)處理連接層和部分SQL層相關(guān)的;
SP不光是處理連接,還處理會(huì)話中的SQL,包含兩層功能;
BP是后臺(tái)進(jìn)程,比如ckpt,archive等等。
SGA共享內(nèi)存區(qū),功能類似buffer pool;
PGA私有內(nèi)存區(qū),為上面的SP分配區(qū)域。
進(jìn)程結(jié)構(gòu)

我們?cè)贠S上ps -ef |grep postgres能看到這些后臺(tái)進(jìn)程。
- PM進(jìn)程:提供監(jiān)聽、連接協(xié)議、驗(yàn)證、fork其他進(jìn)程。服務(wù)一啟動(dòng)就有。
監(jiān)聽哪個(gè)ip是受到postgressql.conf影響的,提供socket和TCP/IP方式連接。
驗(yàn)證功能是通過pg_hba.conf和用戶驗(yàn)證模塊。 - SP進(jìn)程:會(huì)話進(jìn)程,是真正的工作進(jìn)程。
用戶一旦驗(yàn)證成功就會(huì)fork一個(gè)新的進(jìn)程。
然后完成整個(gè)SQL的預(yù)處理,語義語法檢查,分析優(yōu)化執(zhí)行。
可理解為充當(dāng)了MySQL中連接線程和SQL線程的作用。 - BGW進(jìn)程:background writer,主要負(fù)責(zé)后臺(tái)刷新臟頁。
- sysloger進(jìn)程:主要負(fù)責(zé)數(shù)據(jù)庫狀態(tài)信息的日志記錄。
- ckpt進(jìn)程:checkpoint,檢查點(diǎn)。
- walwriter:WAL日志(就是他的redo)的刷寫進(jìn)程。
- arch:歸檔進(jìn)程,類比oracle的歸檔日志。
-AV:數(shù)據(jù)整理,因?yàn)槎驯?heap table)和索引組織表不一樣。
-SC:狀態(tài)控制進(jìn)程。
內(nèi)存結(jié)構(gòu)

(XLOG就是WAL在舊版本中的名稱。)
存儲(chǔ)結(jié)構(gòu)

重點(diǎn)文件
日志文件種類
- $PGDATA/log 運(yùn)行日志(pg10之前為$PGDATA/pg_log)
- $PGDATA/pg_wal 重做日志(pg10之前為$PGDATA/pg_xlog)
- $PGDATA/pg_xact 事務(wù)提交日志(pg10之前為$PGDATA/pg_clog)
- 服務(wù)器日志,可以在啟動(dòng)的時(shí)候指定,比如pg_ctl start -l ./alert.log
運(yùn)行日志參數(shù)
| 參數(shù)名 | 參數(shù)說明 |
|---|---|
| log_destination = 'csvlog' | 運(yùn)行日志可以存儲(chǔ)成各種格式 ,stderr,csvlog,syslog,and eventlog,csvlog requires logging_collector to be on,一般選擇csvlog,可以導(dǎo)入數(shù)據(jù)庫中查看 |
| logging_collector = on | 選csv格式的日志必須設(shè)置這個(gè)參數(shù)on才行,修改需要重啟才生效 |
| log_directory = 'log' | 日志輸出目錄 |
| log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' | 日志文件名字的格式 |
| log_file_mode=0600 | 日志文件權(quán)限 |
| log_truncate_on_rotation = on | 設(shè)置重用日志 |
| log_rotation_age = 1d | 多長(zhǎng)時(shí)間重用日志 |
| log_rotation_size = 10MB | 日志達(dá)到多大重用 |
| log_min_messages = warning | 可選項(xiàng)由少到多分別有debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic |
| log_min_duration_statement = 5 | 超過多長(zhǎng)時(shí)間記錄慢SQL |
| log_checkpoints = on | 記錄檢查點(diǎn)操作 |
| log_connections = on | 記錄會(huì)話連接操作 |
| log_disconnections = on | 記錄會(huì)話斷開操作 |
| log_duration = on | 記錄SQL執(zhí)行時(shí)間 |
| log_lock_waits = on | log lock waits >= deadlock_timeout記錄時(shí)間長(zhǎng)的阻塞 |
| log_statement='ddl' | none,ddl,mod,all 記錄ddl |
更全的請(qǐng)查看postgresql.conf查看說明,記錄的越多壓力越大,合理取舍。
csv日志入庫存儲(chǔ)
先建表
CREATE TABLE pg_log
(
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
PRIMARY KEY (session_id, session_line_num)
);
再copy上去:
copy pg_log from '$PGLOG/postgresql-20210808.csv' with csv;
postgresql.conf基礎(chǔ)配置
| 參數(shù)名 | 可選值及說明 |
|---|---|
| listen_addresses='*' | 監(jiān)聽客戶端的地址,默認(rèn)只監(jiān)聽本地,需要修改為*或者0.0.0.0 |
| port = 5432 | 端口,默認(rèn)是5432 |
| max_connection = 2000 | 最大連接數(shù),默認(rèn)100 |
| unix_socket_directories | socket文件的位置。默認(rèn)在/tmp下面。一般不會(huì)配置多實(shí)例,所以一般不用修改 |
| shared_buffers | 數(shù)據(jù)緩存區(qū),類比Oracle的buffer cache,建議值1/4至1/2主機(jī)內(nèi)存 |
| maintenance_work_mem | 維護(hù)工作內(nèi)存,用于vacuum,create index,reindex等,建議值(1/4主機(jī)內(nèi)存)/autovacuum_max_workers |
| max_worker_processes | 總worker數(shù) |
| max_parallel_workers_per_gather | 單條query中,每個(gè)node最多允許開啟的并行計(jì)算worker數(shù) |
| wal_level | wal的記錄級(jí)別,11以上的版本默認(rèn)是replica |
| wal_buffers | 類似oracle的log buffer |
| checkpoint_timeout | checkpoint時(shí)間間隔 |
| max_wal_size | 控制wal的數(shù)量,最多不超過多少個(gè) |
| min_wal_size | 控制wal的數(shù)量,默認(rèn)3個(gè)輪轉(zhuǎn) |
| archive_command | 開歸檔的命令,其實(shí)就是拷貝命令,比如'test ! -f /disk1/digoal/arch/%f && cp %p /disk1/digoal/arch/%f' |
| autovacuum | 開啟自動(dòng)vacuum |
pg_hba.conf
PG防火墻訪問控制配置,見之前的安裝配置的遠(yuǎn)程連接配置。
pg_ident.conf
用戶映射配置文件。結(jié)合pg_hba.connf,method為ident可以用特定的操作系統(tǒng)用戶和指定的數(shù)據(jù)庫用戶登錄數(shù)據(jù)庫。使用幾率不大。
控制文件
存儲(chǔ)數(shù)據(jù)庫當(dāng)前狀態(tài)的一些信息,但無法直接讀取,需要通過pg_controldata查看控制文件的內(nèi)容。
pg_controldata $PGDATA
重點(diǎn)關(guān)注dbid,主從信息,控制文件最后修改時(shí)間,checkpoint位置點(diǎn),redo位置點(diǎn),正在使用的redo文件,下一個(gè)事務(wù)id,下一個(gè)對(duì)象ID(oid),wal級(jí)別,最大連接數(shù),數(shù)據(jù)塊大小(默認(rèn)8k),wal數(shù)據(jù)塊大小,單個(gè)wal大小
數(shù)據(jù)文件
pg中,每個(gè)索引和表都是一個(gè)單獨(dú)的文件,pg中叫做page。默認(rèn)是每個(gè)大于1G的page會(huì)被分割pg_class.relfilenode.1這樣的文件。page的大小在initdb的時(shí)候指定(--with-segsize)。
page的物理位置在$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE
查看t1表在哪個(gè)段上:
select relfilenode from pg_class where relname='t1';
查看對(duì)應(yīng)的文件:
select pg_relation_filepath('t1');
查看數(shù)據(jù)目錄:
show data_directory;
然后根據(jù)目錄就能看到對(duì)應(yīng)的文件,文件是二進(jìn)制的無法打開。
online WAL
作用其實(shí)可以理解為redo日志,保證崩潰后的安全,一旦系統(tǒng)崩潰,可以重放從最后一次檢查點(diǎn)以來的日志項(xiàng)來恢復(fù)數(shù)據(jù)庫的一致性。
也存在日志膨脹的問題。
通過max_wal_size和min_wal_size控制wal日志的大小。
wal在$PGDATA/pg_wal下,未見名稱為16進(jìn)制的24個(gè)字符組成,每8個(gè)一組,前8位代表時(shí)間線,中間代表邏輯id,后8位代表物理id,我們比較關(guān)注物理id。
查看wal時(shí)間:
select pg_walfile_name(pg_current_wal_lsn());
select * from pg_ls_waldir() order by modification asc;
可以使用pg_waldump查看wal的具體內(nèi)容,重點(diǎn)關(guān)注commit和commit之間的部分,雖然看不到具體SQL,不過大致進(jìn)行了什么操作可以分辨;比如建庫就是copy一步,建表就有一大堆insert,insert就insert和commit兩步,刪表就有一大堆delete,刪庫就是有delete有drop dir等等。
還可以看歸檔日志,因?yàn)楦袷揭荒R粯印?/p>
手動(dòng)切換下一個(gè):
select pg_switch_wal();
arch WAL
生產(chǎn)環(huán)境中一般需要設(shè)置歸檔;所謂歸檔其實(shí)就是把pg_wal里面的日志備份出來,當(dāng)系統(tǒng)故障后可以通過歸檔的日志文件對(duì)數(shù)據(jù)進(jìn)行恢復(fù)。
配置歸檔需要開啟如下參數(shù):
- wal_level = replica (pg11默認(rèn)是replica,配置文件打開即可)
該參數(shù)的可選值有minimal,replica和logical,WAL的級(jí)別依次增高,在WAL的信息也越多。由于minimal這一級(jí)別的WAL不包含從基礎(chǔ)的備份和WAL日志重建數(shù)據(jù)的足夠信息,在該模式下,無法開啟WAL日志歸檔。 - archive_mode = on
上述參數(shù)為on,表示打開歸檔備份,可選的參數(shù)為on, off, always默認(rèn)值為off,所以要手動(dòng)打開。 - archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
該參數(shù)默認(rèn)值是一個(gè)空字符串,其值可以是一個(gè)shell命令或者一個(gè)復(fù)雜的shell腳本。在shell腳本或命令中,可以用%p表示將要?dú)w檔的wal文件包含完整路徑的信息的文件名,用%f代表不包含路徑信息的wal文件的文件名。
注意:wal_level和archive_mode參數(shù)修改都需要重新啟動(dòng)數(shù)據(jù)庫才可以生效。而修改archive_comman則不需要。因此一般配置新系統(tǒng)時(shí),無論是否需要?dú)w檔,都建議將這兩個(gè)參數(shù)開啟。歸檔日志目錄可以定制,應(yīng)該提前創(chuàng)建好。