PgSQL · 核心開發 · 如何管理你的 PostgreSQL 外掛

weixin_33766168發表於2017-10-21

一.背景

我們都知道 PostgreSQL 提供了豐富資料庫核心程式設計的介面,允許開發者以外掛的形式把功能融入資料庫核心。

PostgreSQL 提供了一個外掛管理模組,用於管理使用者建立的外掛。

本文給大家介紹 PostgreSQL 外掛管理模組,幫助大家管理自己的外掛。

二.PostgreSQL的外掛內容

通常一個 PostgreSQL 核心外掛包括下面的部分

  • 1. 包含功能的邏輯的動態庫,即 so 檔案。
  • 2. 描述外掛資訊的的控制檔案,即 control 檔案。
  • 3. 一組檔案用於建立、更新和刪除外掛,這是一組按照版本命名的 SQL 文字檔案。

如果缺少了上述部分,或版本號不正確,外掛的管理功能會異常。

三.外掛的管理

我們使用 create extension, drop extension alter extension 管理指定的外掛。

1.外掛的建立

例如 postgres_fdw 的建立

create extension postgres_fdw;
drop extension postgres_fdw;

我們可以選擇把外掛建立到指定的模式中。

2.外掛的管理檢視

這是最簡單的部分,建立外掛後,我們可以通過外掛管理檢視看到一些細節資訊

select * from pg_extension ;
   extname    | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
--------------+----------+--------------+----------------+------------+-----------+-------------- 
 postgres_fdw |       10 |         2200 | t              | 1.0        |           | 

可以看到,postgres_fdw 的 owner, 存在的 schema 和外掛的小版本。

3.外掛的刪除

外掛的內容可以是任何的資料庫物件,例如:函式、操作符等等。

這些物件可能被其他的物件引用,例如我們在 postgres_fdw 建立了基於 postgres_fdw 的外部表。

當我們要刪除 postgres_fdw 時,需要加上 cascade 子句,把相關物件一併刪除。

drop extension postgres_fdw cascade;

這麼做帶來的問題是,所有依賴這個外掛的物件都會被刪除。再次使用需要重建。

4.外掛的更新

有時候,我們需要做外掛的 BUGFIX ,或定製一些功能。這就用到了外掛更新功能。

  • 首先,我們需要升級外掛的小版本

修改控制檔案 .control, 增加一個小版本,如果當前版本是 1.1,則檔案中版本號修改成 1.2

  • 新增新版本的的 DDL SQL 檔案

新增新版本的 DDL SQL 檔案 *–1.2.sql, 用於從零建立該外掛。

該 SQL 檔案應該包括該外掛的所有物件的 DDL。

  • 新增使用者老版本升級到新版本的 DDL SQL 檔案

建立 *1.1–1.2.sql,用於從版本 1.1 升級到 1.2

該 SQL 檔案只包含 1.2 版本中新建立的物件。使用者的升級操作會呼叫該 SQL 檔案,從而避免了完全重新建立。

  • 修改原始碼新增新的功能,編譯並安裝到指定目錄。

  • 使用 SQL 升級小版本

alter extension postgres_fdw update;

如果成功更新,我們能從檢視中看到對應的小版本號被更新了。

postgres=# select * from pg_extension ;
   extname    | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
--------------+----------+--------------+----------------+------------+-----------+--------------
postgres_fdw |       10 |         2200 | t              | 1.2        |           | 
(2 rows)

使用 PostgreSQL 的外掛管理功能,使用者很容開發和維護需要的外掛。

其他

有幾點需要特別提醒,這是在開發和管理外掛時,經常碰到的問題,需要多加註意

  • 外掛是通過動態庫形式引入到核心中。和核心在同一個程式中執行,且沒有記憶體保護,影響核心的穩定性。開發中需要特別注意記憶體的使用。不要造成記憶體洩露或越界寫。建議使用 PostgreSQL 的記憶體管理機制,外掛中也能使用。
  • 核心中被標記成 PGDLLIMPORT 的全域性變數都能在外掛中直接使用,這些通常是一些 GUC 引數。
  • 核心中非 static 的函式也能在外掛中使用,只需要先 extern 它們。
  • 我們可以實現 _PG_init 用於實現一些初始化工作,該函式在連線建立後只會被執行一次。
  • 我們可以在 _PG_init 中使用函式 DefineCustom*Variable 定義對應外掛相關的 GUC 引數,他們可以用於開啟和關閉該外掛的一些功能。
  • 外掛的引數需要以外掛名開頭且加上點,例如 oss_fdw.enable_parallel_read。

參考

  1. PostgreSQL 外掛的建立
  2. PostgreSQL 外掛的刪除
  3. PostgreSQL 外掛的修改/升級

相關文章