Hologres中支持加載擴展(Extension)以實現更豐富的功能,本文為您介紹Hologres中支持的Extension擴展以及如何加載、查看、卸載Extension。
使用限制
一個數據庫只能在一個Schema下加載一次Extension。例如在某數據庫的默認Schema下加載了Extension,則此數據庫下其他的Schema不能再加載Extension。
可以將extension加載在全局空間pg_catalog系統Schema下,默認該數據庫的所有Schema都能訪問該Extension的功能;如果不指定Schema,則會默認加載在public Schema下。
賬號具有Superuser權限才能加載、卸載Extension。
目前僅支持加載系統內置Extension,不支持加載自定義及外部Extension。
Extension擴展
Extension名稱 | 適用場景 | 相關文檔 | 使用說明 |
spm、slpm | 開啟權限模型調用函數的開關。 | 默認加載到hologres Schema下,不能指定Schema。 | |
hive_compatible | 使用 | 建議加載到pg_catalog Schema下。 | |
hologres_fdw | Hologres跨庫查詢。 |
| |
dlf_fdw | 通過DLF讀取OSS數據。 | 建議加載到pg_catalog Schema下。 | |
proxima | 使用Proxima進行向量計算。 |
| |
flow_analysis | 使用明細圈人、漏斗分析函數。 | 默認加載到public Schema下,且只能加載到public Schema下,不能加載到其他Schema。 | |
roaringbitmap | 使用Roaring Bitmap函數。 |
| |
hg_binlog | 消費Hologres Binlog。 |
| |
foreign_table_exposer | 針對特定BI工具優化訪問外表。 | 建議加載到pg_catalog Schema下。 | |
postgis | 使用空間函數。 |
| |
clickhouse | 兼容ClickHouse遷移函數。 |
| |
pgcrypto | GEN_RANDOM_UUID函數使用。 | 建議加載到pg_catalog Schema下。 | |
bsi | BSI函數使用。 | 默認加載到public Schema下,且只能加載到public Schema下,不能加載到其他Schema。 | |
hg_anon | 數據脫敏使用。 | 只能加載到pg_catalog Schema下。 | |
mysql_compatible | MySQL兼容函數 | 默認加載到hologres Schema下,不能指定Schema。 |
加載Extension
加載Extension時,建議將Extension直接加載到pg_catalog系統Schema下,默認所有Schema都能使用該Extension,加載語法及示例如下:
如果未指定Schema,則Extension會被默認加載到public Schema下。但需注意,部分Extension只能加載到指定的Schema下,詳情請參見Extension擴展。
語法示例
加載Extension的SQL命令如下。
-- 需Superuser權限執行 CREATE extension IF NOT EXISTS <extension_name> SCHEMA <schema_name>;
參數
說明
extension_name
需要加載的extension名稱,Hologres支持的部分Extension參見本文上述列表。
schema_name
加載Extension所在的schema名稱。如果不指定schema,則會默認在public下加載Extension,建議加載在pg_catalog下,數據庫級別可用。
使用示例
在pg_catalog下加載postgis擴展示例如下。
CREATE extension if not exists postgis schema pg_catalog;
查看當前數據庫已加載Extension
通過如下SQL命令可以查看當前數據庫下已加載的Extension,包括系統默認加載的Extension。
SELECT
e.extname AS "Name",
e.extversion AS "Version",
n.nspname AS "Schema",
c.description AS "Description"
FROM
pg_catalog.pg_extension e
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid
AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
ORDER BY 1;
卸載Extension
卸載Extension的SQL命令如下。
不推薦使用DROP EXTENSION <extension_name> CASCADE;
命令級聯卸載Extension。CASCADE(級聯)刪除命令不僅會刪除指定擴展本身,還會一并清除擴展數據(例如PostGIS數據、RoaringBitmap數據、Proxima數據、Binlog數據、BSI數據等)以及依賴該擴展的對象(包括元數據、表、視圖、Server數據等)。
-- 需Superuser權限執行
DROP extension <extension_name>;
參數 | 說明 |
extension_name | 需要卸載的Extension名稱,Hologres支持的部分Extension參見本文上述列表。 |
跨Schema查詢Extension示例
部分Extension只能被加載到指定的Schema下,不能被加載到pg_catalog,例如roaringbitmap extension只能被加載到public Schema下,當表存在于非public Schema時,使用RB函數查詢會報錯function xxx does not exist
,因此在使用函數時需要加上函數的默認Schema名稱。roaringbitmap Extension的使用示例如下。
數據準備。
創建非public Schema的表并導入數據。
CREATE EXTENSION roaringbitmap; CREATE SCHEMA test; --創建表在指定Schema下 CREATE TABLE test.t1 ( id integer, bitmap roaringbitmap ); --數組位置對應的BIT值為1 INSERT INTO test.t1 SELECT 1, RB_BUILD (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 200]); --將輸入的多條記錄的值對應位置的BIT值設置為1,最后聚合為一個roaringbitmap INSERT INTO test.t1 SELECT 2, RB_BUILD_AGG (e) FROM GENERATE_SERIES(1, 100) e;
在public Schema下使用RB函數查詢,成功執行。
SELECT RB_OR (a.bitmap, b.bitmap) FROM ( SELECT bitmap FROM test.t1 WHERE id = 1) AS a, ( SELECT bitmap FROM test.t1 WHERE id = 2) AS b;
切換到指定Schema使用RB函數查詢,報錯。
set search_path to test; SELECT RB_OR (a.bitmap, b.bitmap) FROM ( SELECT bitmap FROM test.t1 WHERE id = 1) AS a, ( SELECT bitmap FROM test.t1 WHERE id = 2) AS b; RROR: function rb_or(public.roaringbitmap, public.roaringbitmap) does not exist
解決方法:在RB函數前加public Schema,將函數放入public Schema執行。
SELECT public.RB_OR (a.bitmap, b.bitmap) FROM ( SELECT bitmap FROM test.t1 WHERE id = 1) AS a, ( SELECT bitmap FROM test.t1 WHERE id = 2) AS b;
常見問題
Extension被加載到了錯誤的Schema下,導致切換Schema后無法訪問對應的函數或語法,報錯function xxx does not exist
。
問題原因:通常是因為Extension被加載到了public Schema下,切換Schema后,無法訪問。
解決方法:卸載Extension,并將Extension重新加載到pg_catalog Schema下,這樣所有的Schema都能訪問。示例如下:
重要卸載Extension時,不建議使用
DROP EXTENSION <extension_name> CASCADE;
的語法,否則會將該Extension依賴的相關對象全部刪除,容易對業務產生影響。drop extension hologres_fdw; create extension if not exists hologres_fdw schema pg_catalog;