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;