1 概述
postgresql官方介紹稱是最先進的開源關係型資料庫,支援所有主流的平台,目前已經更新到了最新版本的12.0,在mysql被oracle收購後,postgresql開源社群越來越活躍了,同時還有分布式集群的開源方案greenplum,目前也非常受歡迎。本篇文章討論postgresql內部的架構,內部的元件是如何工作的,這對乙個dba是非常重要的內容。
2 postgresql架構
postgresql的物理結構是非常簡單的,主要是由共享記憶體、後台程序和資料檔案組成的。大致的結構可以參考下面的圖。 橢圓形的都是程序,方形的都是記憶體結構,圓柱形的是檔案。
2.1 程序
在啟動資料庫後,postmaster是第乙個啟動的程序,在啟動過程中,會進行恢復操作(如果有事務未正常提交或者回滾的話),初始化共享記憶體,啟動後台程序等一系列的操作。當客戶程序有乙個連線請求時,會建立相對應的後台程序處理。過程如下:
通過ps -ef|grep postgres查詢可以看到系統總有乙個postmaster程序pid=17201,後面所有的後台程序都是postmaster的子程序
postgres 17201 1 0 jan25 ? 00:06:21 /usr/pgsql-9.6/bin/postgres -d /data1/pgdata
postgres 17202 17201 0 jan25 ? 00:00:10 postgres: logger process
postgres 17204 17201 0 jan25 ? 00:01:01 postgres: checkpointer process
postgres 17205 17201 0 jan25 ? 00:01:39 postgres: writer process
postgres 17206 17201 0 jan25 ? 00:03:37 postgres: wal writer process
postgres 17207 17201 0 jan25 ? 00:05:11 postgres: autovacuum launcher process
postgres 17208 17201 0 jan25 ? 00:00:45 postgres: archiver process
postgres 17209 17201 0 jan25 ? 00:09:20 postgres: stats collector process
postgres 40377 17201 0 jan25 ? 00:01:38 postgres: wal sender process replica 10.***.xx.115(35258) streaming 1/cd5498d0
下表詳細介紹一下各個程序。
程序詳細描述
postmaster
整個資料庫例項的總控程序,負責啟動和關閉該資料庫例項。
logger process
將資料庫的日誌寫入到日誌檔案中
checkpointer process
當檢查點發生時,髒快取(指的是相對於原資料而言被修改過的)寫入到檔案中
writer process
週期性將髒快取寫入到檔案中
wal writer process
write ahead log(預寫式日誌)
autovacuum launcher process
如果autovacuum開啟時,這個是乙個週期性**膨脹表標記為已刪除資料的乙個程序
archiver process
當開啟歸檔模式,週期性將wal日誌寫入到指定的目錄
stats collector process
做資料的統計收集工作。主要用於查詢優化時的代價估算,包括乙個表和索引進行了多少次的插入、更新、刪除操作,磁碟塊讀寫的次數、行的讀次數。pg_statistic中儲存了該程序收集的各類資訊。
wal sender process replica
在開啟流複製的主備模式時,該程序週期性將wal檔案傳送到另一台伺服器作為資料同步備份。
2.2 記憶體結構
共享記憶體一般指的是記憶體中專門為資料庫快取和事務日誌快取分配的區域,而最重要的元件就是共享快取和wal快取。
共享快取的主要目的是減少磁碟的io,比如一些經常訪問的資料塊盡可能長的時間儲存在共享快取中,除此之外還有一些諸如程序、鎖、統計資訊也是在快取中。
wal快取區是一塊臨時儲存資料變更的臨時區域,儲存在該快取區的內容會被週期性寫入到wal檔案中,該區域對於資料庫的備份和恢復都是非常重要的。
2.3 資料庫結構
這裡面說的結構是邏輯結構,不討論物理結構。以下是一些理解資料庫結構非常重要的內容。
關於資料庫:
postgresql是由多個資料庫組成的,也可以稱為資料庫群。
當執行了init(),系統會預設建立3個庫:template0,template1,postgres。
template0和template1是為使用者資料庫建立的模板庫,初始化後,這兩個庫是一模一樣的。
template1可以被定製修改,使用者建立新的資料庫都是轉殖該資料庫的。
關於表空間:
在初始化後,預設建立了兩個表空間pg_default和pg_global。
如果在建立表時候沒有指定表空間,則預設是pg_default。
資料庫群中表的管理預設都是在pg_global中。
pg_default表空間的物理位置在$pgdata\base。
pg_global表空間的物理位置在$pgdata\global。
關於表:
每張表包含三個檔案。
乙個檔案用於儲存資料,檔名是表的oid。
乙個檔案用於管理表的空餘空間,檔名是oid_fsm。
乙個檔案用於管理表塊的可見性,檔名是oid_vm。
索引沒有_vm檔案。
3 總結
總體來說,postgresql的架構還是比較容易掌握的。上面總結的也是非常基礎的內容,這個對於日常維護還是使用都是非常重要的。
gp資料庫與pg資料庫
以前專案採用的都是oracle或者是mysql的資料庫,新的專案採用了gp資料庫 greenplum 在這之前只聽說過pg資料庫 postgresql gp資料庫官網 pg資料庫官網 經過學習和查詢,得知greenplum是利用了postgre資料庫的框架,也就相當於說是,gp資料庫是基於pg資料庫...
pg資料庫連線命令
psql help 命令可檢視資料庫連線幫助文件。pg dump 命令可檢視導數幫助文件。dyb為庫名,username為資料庫使用者 方法一,需要手動輸入密碼 psql u username h 196.128.0.19 p 5432 d dyb enter passwd for username...
python操作pg資料庫
描述 寫道postgresql 至少有至少 3 個 python 介面程式可 以訪問 posgresql psycopg,pypgsql 和 pygresql.第四個,popy,現在已經被廢棄 2003年,它 貢獻出自己的 與pygresql整合在一起 這三個介面程式各有長處,各有缺點,根據實踐結 ...