天天看點

PostgreSQL 10.0 preview 功能增強 - 背景運作(pg_background)

postgresql , 10.0 , 背景運作 , pg_background_launch , pg_background_result , pg_background_detach , pg_background

當使用者在管理資料庫時,如果要在互動式界面跑一些query,但是不知道query要運作多久,擔心網絡問題或者其他問題導緻終端斷開,query執行情況不明的話。就需要背景運作這個功能了。

背景運作在linux中也很常見,比如

這樣的話,即使斷開會話也沒關系,這條指令會在背景運作,并将标準輸出存入/tmp/result,标準錯誤也重定向到标準輸出。

對于postgresql資料庫,在10.0的這個特性出來之前,使用者可以使用dblink的異步調用,達到類似的目的,但是不能斷開會話,注意了。

使用dblink異步調用,可以達到背景運作的目的,但是别忘了,dblink連接配接是目前會話建立的,目前會話退出,連接配接也會退出。

斷開本地會話,異步會話也會斷開,未送出的異步事務自動復原。

使用dblink異步接口,可以完成一些背景運作的功能,但是比較繁瑣,也不完美(比如目前會話不能退出)

<a href="https://www.postgresql.org/docs/9.6/static/contrib-dblink-get-result.html">https://www.postgresql.org/docs/9.6/static/contrib-dblink-get-result.html</a>

postgresql 10.0 新增了background session的功能,這個功能可以對标類似oracle的自治事務的功能。(是plsql函數或存儲過程遷移到postgresql plpgsql的有利相容性,此前需要使用dblink模拟自治事務)

基于background session,開發了一個背景運作的管理接口。可以友善的執行背景事務了。

參考

<a href="https://github.com/digoal/blog/blob/master/201703/20170312_22.md">《postgresql 10.0 preview 功能增強 - 匿名、自治事務(oracle 相容性)》</a>

一開始的設計比較簡單,提供了三個api函數

最開始的讨論細節如下

社群讨論後,這個架構改成了這樣的,架構更優雅一些。

讨論細節如下

後面的讨論又改成了這樣,還是朝着優雅的方向在改進

這個patch在commit前,還有一些變數,比如可能将這個功能合并到dblink裡面。而不是新開一個extension插件.

這個patch的讨論,詳見郵件組,本文末尾url。

postgresql社群的作風非常嚴謹,一個patch可能在郵件組中讨論幾個月甚至幾年,根據大家的意見反複的修正,patch合并到master已經非常成熟,是以postgresql的穩定性也是遠近聞名的。

<a href="https://commitfest.postgresql.org/13/893/">https://commitfest.postgresql.org/13/893/</a>

<a href="https://www.postgresql.org/message-id/flat/caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com#caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com">https://www.postgresql.org/message-id/flat/caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com#caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com</a>