您的位置:首頁>正文

武漢大學副教授為您解讀PostgreSQL 10.0新版本

5月11日——13日, 第八屆中國資料庫技術大會(DTCC2017)在北京國際會議中心舉行。 會議期間, 共有近5000名IT人士到場交流分享技術理念, 盛況空前。 本屆DTCC大會以“資料驅動·價值發現”為主題, 同時彙集了來自互聯網、電子商務、金融、電信、政府、行業協會等20多個行業領域的120多位技術專家, 共同探討Oracle、MySQL、NoSQL、雲端資料庫、智慧資料平臺、區塊鏈、資料視覺化、深度學習等領域的前瞻性熱點話題與技術。

在13日下午的開源技術分會場上, 武漢大學副教授彭煜瑋對PostgreSQL 10.0 版本的新特性進行瞭解讀, 以幫助大家對此版本有更深入的認識與瞭解。

▲彭煜瑋

PostgreSQL 10.0將是更改版本號規則後的第一個發行版本, 社區在這個新版本中增加了豐富的新特性和加強。 彭煜瑋此次解讀的內容包括功能增強、性能增強、安全性和可靠性增強、應用開發以及遷移的注意事項。

功能增強

·邏輯訂閱。 在多個業務之間有少量的資料需要同步、資料匯總、資料拆分、跨雲線上線下同步等問題中,

邏輯訂閱的應用是非常必要的。

·內置分區表。 PostgreSQL 10.0中將加入內置分區表的功能, 依舊使用了繼承的特性, 但不需要手工寫規則了。 PostgreSQL 10.0 分區表不支援全域索引, 因此無法實現全域的唯一約束;更新資料時不能導致資料跨區移動, 否則會報錯;修改主表的欄位名、欄位類型時, 會自動同時修改所有的分區;TRUNCATE 主表時, 會清除所有繼承表分區的記錄(如果有多級分區, 也會一直級聯下去);目前支持分區表的ON CONFLICT .. DO NOTHING , 暫時還不支援ON CONFLICT .. DO UPDATE。

·流式接收端線上壓縮WAL。 PostgreSQL 10.0 中pg_receivexlog 支援對WAL日誌線上壓縮。 pg_receivexlog支援通過開關控制是否需要開啟壓縮、以及選擇壓縮層級。 pg_receivexlog啟動時, 自動掃描存放歸檔檔的目標目錄,

選擇中斷點續傳的位置, 然後向PostgreSQL資料庫請求相應位置為起點的REDO。

·查看清理進度。 PostgreSQL 10.0增加了對Vacuum的視覺化監控;增加了動態視圖pg_stat_progress_vacuum;顯示每個vacuum worker進程掃描了多少頁面、回收了多少頁面, 結合清理物件的總頁面數, 可以估計進度。

·後臺運行。 10.0增加了對後臺運行的支援, 提供了三個SQL函數。 pg_background_launch : 開啟後臺work進程與會話, 執行使用者提供的SQL, 返回後臺會話的PID;pg_background_result : 根據提供的PID, 返回這個後臺會話執行SQL的結果;pg_background_detach : 根據提供的PID, 返回這個後臺會話執行SQL的結果, 同時關閉這個後臺進程。 pg_background_result還會返回執行所用的時間。

性能增強

·並行增強。 10.0 新增了一個參數max_parallel_workers, 用於控制整個集群允許開啟的用於多核計算的Worker進程。 PostgreSQL還增加了一個對元組進行並行排序的模組:原則上, 任何現有需要調用tuplesort的功能都可以使用這個並行排序模組基於並行排序模組,

將能夠支援B-Tree的並行創建(代價模型比較直接)。

·間接索引。 10.0 引入了間接索引的概念, 索引項目中有堆元組的主鍵值:只要不更新堆元組的主鍵, 索引鍵值不變的間接索引都不需要更新;但間接索引不能單獨服務於查詢, 必須經過主鍵索引中轉;主鍵只能是小於等於 6 位元組的類型。

·用不完全索引支援複合排序。 用索引支援排序是很好的手段:ORDER BY a,b,c 可以利用到索引(a,b,c,*);ORDER BY a,b,c 無法利用索引(a,b)或者(a)。 10.0 將使得第二種情況能夠用上(a,b)或者(a)這樣不完全包含排序列的索引:第一個階段, 利用不完全的索引來做基於前幾個排序列的排序;第二個階段, 對前幾個排序列上值相等的資料,

取出後面的列值進行單獨排序。 當前幾個排序列的值分佈得比較散時這種利用索引的方法效果比較好。

·自動預熱共用緩存。 10.0 中增加了自動預熱共用緩存的技術:建立一個預熱器後臺進程, 它在系統關閉時把緩衝集區中的資料塊資訊轉儲到檔中;重啟時, 預熱器自動把轉儲出來的資料塊重新載入到緩存中。

·JIT支持。 PostgreSQL 10.0 已經開始為 JIT 做鋪墊, 把SQL執行的框架從遞迴呼叫方式改成了非遞迴的opcode驅動模式, 非遞迴式降低了棧使用和開銷, 可以在不同的子運算式之間共用一些狀態, 簡單函數以簡單跳轉實現而不需函式呼叫。

安全性和可靠性

·安全性增強。 PostgreSQL SCRAM機制基於RFC文檔 5802 、7677實現, 目前只支援SCRAM-SHA-256演算法, 但是基於SASL認證方法, 未來可以支持更多的更強的演算法。 SCRAM相比md5,可以避免因為資料庫存儲的加密秘鑰洩露導致用戶端可以篡改認證協定連接資料庫的危險。由於SCRAM和md5不相容,二者只能選其一。

·新增內置角色。PostgreSQL 10.0 開始植入了一些內置的角色:pg_backend_pid:可用來取消、中止任何進程,不包含其他超級用戶許可權;pg_monitor:可以查看統計資訊,便於DBA等檢查資料庫健康狀態;pg_read_all_gucs:可以查看所有的 GUC 配置。未來PostgreSQL還會對植入更多的內置角色,讓資料庫的許可權分組管理更加便捷。逐步形成像Oracle這樣內部有許多角色可選的狀況。

·防止執行不帶條件的更新/刪除。不帶條件的更新/刪除很危險,正常情況下,這樣的SQL不應該在業務邏輯中出現。通常出現在SQL注入或者誤操作中。10.0 提供了一個參數來防止此類SQL,bool allow_empty_deletes = true;bool allow_empty_updates = true;分別控制是否能執行不帶條件的Update或Delete,可以設置為全域、會話級、用戶級、庫級、或者事務級別。

·WAL日誌支援的Hash索引。很長一段時間,PG中的Hash索引是不做WAL日誌的,因此資料庫崩潰可能會導致Hash索引不可用。10.0 中為Hash索引的操作加上了WAL支援,現在對Hash索引的創建、插入、分裂等操作都會記錄WAL日誌,資料庫崩潰後可以用這些資訊來恢復索引

應用開發

·Libpq增強。支援pipeline batch模式,增加多連接功能。

·標準/相容性支援。增加類似serial的identify column:雖然已經可以使用serial來達到同樣效果,不過實現這一標準,可以相容更多的資料庫。

遷移的注意事項

使用pg_upgrade升級時,Hash索引需要重建;XLOG相關的系統管理函數重命名,xlog改為wal;不再支持浮點 datetimes/timestamps類型,編譯項--disable-integer-datetimes去除;不再支持client/server protocol version 1.0;不再支持contrib/tsearch2;不再支援version-0版本的C語言函數。

自PostgreSQL發佈以來就受到了眾多DBA的喜愛,而且廣受好評,此次10.0版本的更新想必也時刻牽動著PostgreSQL粉絲們的心。一年一個大版本是PostgreSQL社區的傳統,不過發佈時間通常為秋天,仍需等待一段時間。看到如此“巨大”的升級更新,大家一定都迫不及待了吧。

SCRAM相比md5,可以避免因為資料庫存儲的加密秘鑰洩露導致用戶端可以篡改認證協定連接資料庫的危險。由於SCRAM和md5不相容,二者只能選其一。

·新增內置角色。PostgreSQL 10.0 開始植入了一些內置的角色:pg_backend_pid:可用來取消、中止任何進程,不包含其他超級用戶許可權;pg_monitor:可以查看統計資訊,便於DBA等檢查資料庫健康狀態;pg_read_all_gucs:可以查看所有的 GUC 配置。未來PostgreSQL還會對植入更多的內置角色,讓資料庫的許可權分組管理更加便捷。逐步形成像Oracle這樣內部有許多角色可選的狀況。

·防止執行不帶條件的更新/刪除。不帶條件的更新/刪除很危險,正常情況下,這樣的SQL不應該在業務邏輯中出現。通常出現在SQL注入或者誤操作中。10.0 提供了一個參數來防止此類SQL,bool allow_empty_deletes = true;bool allow_empty_updates = true;分別控制是否能執行不帶條件的Update或Delete,可以設置為全域、會話級、用戶級、庫級、或者事務級別。

·WAL日誌支援的Hash索引。很長一段時間,PG中的Hash索引是不做WAL日誌的,因此資料庫崩潰可能會導致Hash索引不可用。10.0 中為Hash索引的操作加上了WAL支援,現在對Hash索引的創建、插入、分裂等操作都會記錄WAL日誌,資料庫崩潰後可以用這些資訊來恢復索引

應用開發

·Libpq增強。支援pipeline batch模式,增加多連接功能。

·標準/相容性支援。增加類似serial的identify column:雖然已經可以使用serial來達到同樣效果,不過實現這一標準,可以相容更多的資料庫。

遷移的注意事項

使用pg_upgrade升級時,Hash索引需要重建;XLOG相關的系統管理函數重命名,xlog改為wal;不再支持浮點 datetimes/timestamps類型,編譯項--disable-integer-datetimes去除;不再支持client/server protocol version 1.0;不再支持contrib/tsearch2;不再支援version-0版本的C語言函數。

自PostgreSQL發佈以來就受到了眾多DBA的喜愛,而且廣受好評,此次10.0版本的更新想必也時刻牽動著PostgreSQL粉絲們的心。一年一個大版本是PostgreSQL社區的傳統,不過發佈時間通常為秋天,仍需等待一段時間。看到如此“巨大”的升級更新,大家一定都迫不及待了吧。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示