為了載入附加的功能或者達到提高性能的目的,可用多個設置來預先載入共享庫到服務器中。例如'$libdir/mylib'設置可能會導致mylib.so(或者某些平臺上的mylib.sl)從安裝的標準庫目錄被預裝載。這些設置之間的區別在于生效的時間以及改變它們所需的特權。
可以用這個方法預裝載TeleDB的過程語言庫,通常是使用'$libdir/plXXX'語法,其中的XXX是pgsql、perl、tcl或python。
只有特別為與TeleDB一起使用設計的共享庫才能以這種方式載入。每一個TeleDB支持的庫都有一個“魔法塊”,它會被檢查以保證兼容性。由于這個原因,非TeleDB無法以這種方式被載入。你可能可以使用操作系統的工具(如LD_PRELOAD)載入它。
總之,請參考特定模塊的文檔來用推薦的方法載入它。
local_preload_libraries (string)
這個變量指定一個或者多個要在連接開始時預載入的共享庫。它包含逗號分隔的庫名稱列表,其中每個名稱都被解釋為LOAD命令。項之間的空白被忽略;如果需要在名稱中包含空格或逗號,請用雙引號括住庫名。這個參數在連接啟動時起作用,對后續更改沒有影響。 如果指定的庫沒有找到,連接嘗試將會失敗。任何用戶都能設置這個選項。正因為如此,能被這樣載入的庫被嚴格限制為出現于安裝的標準庫目錄中plugins子目錄下的共享庫(保證只有“安全的”庫被安裝到 這里是數據庫管理員的責任)。local_preload_libraries中的項可以顯式 指定這個目錄,例如?libdir/plugins/mylib,或者只是指定庫的名稱— mylib 和 libdir/plugins/mylib的效果是相同的。這個功能的目的是允許非特權用戶加載調試或性能測量庫到特定會話, 而不需要顯式的LOAD命令。為達到此目的,典型的使用PGOPTIONS環境變量或使用ALTER ROLE SET設置這個參數。除非一個模塊被特別設計成由非超級用戶以這種方式使用,通常不推薦使用這個設置。應該看看 session_preload_libraries。
session_preload_libraries (string)
這個變量指定一個或者多個要在連接開始時預載入的共享庫。它包含逗號分隔的庫名稱列表,其中每個名稱都被解釋為LOAD命令。項之間的空白被忽略; 如果需要在名稱中包含空格或逗號,請用雙引號括住庫名。 這個參數只在連接開始時起效。后續的改變沒有效果。如果指定的庫沒有找到,連接嘗試將會失敗。只有超級用戶更夠更改這個設置。這個特性的意圖是允許在特定會話中載入調試用的或者測量性能的庫,而不需要顯式的給出一個 LOAD命令。例如,通過用ALTER ROLE SET設置這個參數可以 為一個給定用戶名下的所有會話啟用auto_explain。還有,無需重啟 服務器就能更改這個參數(但是只有新會話啟動時才會生效),這樣可以以這種方式更容易地增加新模塊,即便它們會應用到所有會話。和shared_preload_libraries不同,相對于在庫被第一次使用時載入它,在會話開始時載入庫并沒有什么性能優勢。不過,當使用連接池時這樣做還是有一些優勢。
shared_preload_libraries (string)
這個變量指定一個或者多個要在服務器啟動時預載入的共享庫。它包含逗號分隔的庫名稱列表,其中每個名稱都被解釋為LOAD命令。項之間的空白被忽略;如果需要在名稱中包含空格或逗號,請用雙引號括住庫名。這個參數只能在服務器啟動時設置。如果指定的庫沒有找到,服務器將無法啟動。有些庫需要執行只能在postmaster啟動時發生的特定操作,例如分配共享內存、保留輕量級鎖 或者啟動后臺工作者。這些庫必須通過這個參數在服務器啟動時載入。其他庫也能被預載入。通過預載入一個共享庫,當該庫被第一次使用時就可以避免庫的啟動時間。不過,啟動每個新服務器進程的時間可能會略有增加,即使該進程從不使用該庫。因此,推薦只把這個參數用于那些要在大多數會話中使用的庫上。還有,改變這個參數要求重啟服務器,因此對于短期的調試任務來說這不是好的選擇,應該轉用 session_preload_libraries。注意在 Windows 主機上,在服務器啟動時預載入一個庫并不會減少啟動每個新服務器進程所需的時間;每一個服務器進程將會重新載入預載入的庫。不過,對于那些要在postmaster啟動時執行操作的庫來說,Windows 主機上的 shared_preload_libraries任然有用。