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。 |
| |
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;