
为何需要插件
通常来说,一个数据库拥有多种sql对象,如表、函数、数据类型、操作符。多种多样的sql对象大大丰富了数据库的可用性,使得不同用户在不同场景下都能获得不错的体验。
但是随着数据库对象以及功能的增多,数据库将会变得非常冗余。一般来说在同一个场景下,客户使用到的数据库对象和功能可能还不到数据库提供的1%。
对于两款都能提供类似功能的数据库,用户肯定偏向于选择安装包较小的一款。那么,数据库插件的出现就很好的解决了这个问题,对于那些不是客户通用的功能,Vastbase G100可以将其插件化,如果用不到该插件的相关功能对象,则不必加载它。
插件是什么
插件定义与使用语法
插件是一种可加载模块,用来增强Vastbase G100的功能。插件可以提供新的数据类型、操作符、函数、表或表索引类型等。Vastbase G100的插件架构可以使用户自定义功能的开发和部署变得非常容易。
创建插件的语法如下

修改插件语法如下

卸载插件语法如下

插件使用示例——新增数据类型&函数
在数据库
$GAUSSHOME/share/postgresql/extension
目录下添加如下文件testextension.control

testextension--1.0.sql

上述两个文件定义了一个 testextension 插件,插件的默认版本是 1.0,插件的 sql 脚本
中定义了一个 testtype 类型和该类型的加法函数 testadd。下面介绍怎么使用这个定义
好的插件。
创建插件

查看该插件信息

查看插件中的对象是否存在

使用插件中提供的类型和函数

删除插件,如果有对象依赖于插件
中的对象,则使用cascade删除

插件的组成
由上面的简单插件可以了解到,一个插件的组成包括一个控制文件以及一个 sql 脚本文件。如果插件需要使用 C 函数,则需要额外提供 C 代码编译而成的共享库文件。
●控制文件:定义插件的version、schema、comment等属性信息,目录为$GAUSSHOME/share/postgresql/extension,命名为“插件名.control”,如plpgsql.control。
●sql脚本文件:定义插件的对象,命名为“插件名--版本.sql”,目录为$GAUSSHOME/share/postgresql/extension,如plpgsql--1.0.sql。
●共享库文件:sql脚本中language C函数对应的C函数实现,目录为$GAUSSHOME/lib/postgresql,命名为“扩展名.so”,如dblink.so。
控制文件
创建插件时会读取插件的控制文件,解析相关参数,常见参数含义如下
⚫default_version:插件的默认版本,设置后将使用对应版本的 sql 脚本文件来创建对
象。
⚫ comment:插件的描述信息。
⚫ sysadmin:插件是否只有系统管理员可以创建,默认为 true。
⚫ requires:依赖插件的列表,就是创建当前插件前必须创建的插件列表,当前插件
可能会使用到依赖插件的一些方法。
⚫ module_pathname:这个参数的值将被用来替换 sql 脚本文件中每一次出现的
MODULE_PATHNAME,通常被设置为'$libdir/extension_name',如'$libdir/dblink'
⚫ relocatable:插件在创建之后是否可以将其和对象移动到一个不同的 schema 中,
默认为 false。
⚫ schema:插件创建的 schema,只有 relocatable 为 false 时可设置该参数。不指定
可以在创建插件的语句中指定,都没有指定则使用 search_path 中的 schema。
⚫ dbcompatibilities:插件的兼容性列表,即哪些兼容模式下可以创建该插件,可选
值包括 A、B、C、PG、MSSQL,不指定则支持在所有模式下创建。
sql脚本文件
创建插件时会读取对应版本的 sql 脚本文件,解析执行其中的 sql 语句,创建插件的对象,具体步骤如下
⚫检查用户权限,如果控制文件中定义了 sysadmin,则只有系统管理员可以创建该插件。
⚫ 强制设置 guc 参数 client_min_messages 和 log_min_messages 为至少 warning。
⚫ 设置 guc 参数 search_path 为插件安装的 schema + 插件所有依赖的插件所在的schema。
⚫ 设置线程变量 create_extension 为 true,表示有插件正在创建中,此时再执行创建插件的语句会报错,即不允许嵌套创建插件。
⚫读取插件 sql 脚本内容,替换脚本中的"@extschema@"为创建插件所在的 schema
(只有 relocatable 为 false 才会替换),替换脚本中的"MODULE_PATHNAME"为控制文件的 module_pathname(指定了才替换)。
⚫ 调用接口 execute_sql_string 来执行脚本。首先会将脚本中的所有 sql 语句经过解析生成解析树的链表,然后分别对每个解析树进行分析和重写、计划,最后执行,目前 DML 语句仅支持 INSERT 和 SELECT(后续考虑开放其它)。
⚫ 重置 guc 参数到运行脚本之前。
共享库文件
共享库文件一般在第一次使用到相应的函数时加载,然后放到缓存中,如果想要在数据库启动时提前加载共享库,则可将其名称添加到 shared_preload_libraries 参数中。
插件的应用效果
Vastbase G100提供了丰富的插件功能,可以为不同客户针对性地提供不同的使用体验。
PostGIS插件是在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力的开源GIS数据库,它在PostgreSQL的基础上增加了表达地理信息的空间数据类型和操作这些类型的函数,Vastbase G100已经充分适配了PostGIS,可以为用户带来更好的空间数据操作体验。
pg_zhtrgm插件的主要作用是做相似度匹配,该插件提供了多种用于字母数字文本相似度匹配的函数和操作符,可以简化全文索引的使用方式,该扩展不仅支持对英文字符的全文检索,还允许对中文字符进行全文检索。
PGroonga是一个全文检索插件,Vastbase已经内置了 PGroonga扩展,用户只需要创建扩展,即可使用PGroonga支持的语言进行超高速全文检索。wal2json是逻辑解码插件,使用该插件可以访问INSERT和UPDATE生成的元组,解析WAL中的内容。总的来说,Vastbase G100针对特性的用户场景提供了特性的插件支持,在扩展功能的前提下又降低了数据库的冗余性。
另外,Vastbase G100的插件机制使得用户的自由开发定制成为了可能。一般来说,客户在使用数据库时需要为不同场景撰写不同的sql脚本,当然我们可以在需要时直接加载这些脚本,而有了插件机制,我们就可以将sql脚本包装成一个插件对象,使用时只需create extension即可。
使用一个插件而不是只运行SQL脚本载入一堆“松散”对象到数据库的主要优点是,Vastbase G100将能理解该扩展的对象是一起的。你可以用一个单一的DROP EXTENSION命令删除所有的对象(不用维护一个单独的“卸载”脚本)。甚至更有用的一点是,pg_dump知道它不应该转储该扩展中的个体成员对象 — 它将只在转储中包括一个CREATE EXTENSION命令。这大大简化了迁移到一个包含不同于旧版扩展中对象的新版扩展的工作。
稿件提供|开发部门
图文编辑|程筱淇
内容审核|市场营销部、解决方案部
关于海量数据
北京海量数据技术股份有限公司(股票代码:603138.SH)成立于2007年,是国内首家以数据库为主营业务的主板上市企业。公司十余年来秉承“专注做好数据库”的初心,始终致力于数据库产品的研发、销售和服务。核心产品海量数据库Vastbase系列、数据库一体机Vastcube系列、海量大数据Datalink系列,全栈国产化,应用满足度高,目前广泛应用于政务、制造、金融、通信、能源、交通等多个重点行业,已成为国产企业级数据库的首选之一。





