PostgreSQL学习实践:contrib模块浅谈

PostgreSQL作为一款诞生近四十年的数据库,其历史可追溯至1986年作为加州大学伯克利分校 POSTGRES 项目的一部分,经过30多年发展,已成为数据库领域一款非常受欢迎的数据库。作为一款长期坚持开源的数据库,PostGreSQL使用者众多,在很多大中小型企业广受欢迎。因为使用者众多,加之在很多领域被广泛使用,也进一步促进了其更新迭代块,BUG修复能力强。

网上有一张图很好的解释了PostgreSQL数据库的特点,使得其特别适合作为很多组织和企业使用。

因其开源稳定的特性,很多组织或企业选择基于PostgreSQL进行二次开发打造成自己的开源和商业数据库软件,比如国内很多国产数据库都是基于PostgreSQL不同版本进行二次开发的。

2024年,在国际知名的db-engines.com数据库排名网站上,从检测的417个系统中PostgreSQL脱颖而出,成为2023年流行度增长最快的数据库系统,成为2023年的年度数据库冠军,原文链接:https://db-engines.com/en/blog_post/106

以下一副图是db-engines官网近期对当前主流数据库做的流行度排名,显示PostgreSQL近几年上升趋势猛进。

根据资料显示,Stack Overflow对超过9万名开发者进行了调查,显示PostgreSQL 取代 MySQL 成为2023年最流行数据库。


作为一名长期从事Oracle数据库的从业者,我最近也在去学习PostgreSQL数据库,我平时也比较喜欢技术分享,经常在如墨天网站上分享自己的文章,我也希望能用文字记录自己的学习过程,去跟大家一起做这方面分享交流。

今天跟大家分享的是PostgreSQL的contrib模块,对于contrib模块,作为一位PG的初学者,我不是特别的了解,于是我查阅并整理了该模块的相关内容知识。

contrib模块是什么,我首先咨询了chatGPT,其给与的回答是:PostgreSQL数据库contrib模块是一系列附加的、可选的、由社区开发和维护的扩展功能。这些模块提供了各种额外的功能,例如数据类型、函数、工具、扩展插件等,以满足特定需求或提供特定功能。它们不是核心的数据库系统的一部分,但可以根据需要安装和使用。

一些常见的contrib模块包括:

hstore:提供了hstore数据类型,允许在单个字段中存储键值对。
pg_trgm:实现了文本相似性搜索功能,用于模糊匹配和相似度分析。
pgcrypto:提供了加密功能,包括对称加密、哈希函数和数字签名等。
uuid-ossp:生成和处理UUID(通用唯一标识符)。
unaccent:用于文本搜索和匹配,支持去除文本中的重音和附加符号。
这些扩展模块允许用户根据自己的需求和特定的数据库应用场景来扩展和定制PostgreSQL。安装并启用这些模块可以为数据库提供额外的功能和灵活性。

contrib模块作为PostGreSQL的一个功能模块,可以在下载的安装包里找到这个模块,比如,如下显示为PostgreSQL 16.1版本contrib模块的相关内容,具体如下所示:

进入contrib模块目录后,可以看到很多的文件夹,每一个文件夹就代表一个用户定义模块,里面可能包含一个或者多个用户定义的函数。

比如选择contrib模块dblink这个目录,可以看到里面含有一些.sql、.c和.conf等文件。

比如我们选择其中一个其中一个dblink–1.0–1.1.sql文件,可以看到其中的内容如下:

/ contrib/dblink/dblink—1.0—1.1.sql /

— complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use “ALTER EXTENSION dblink UPDATE TO ‘1.1’” to load this file. \quit

CREATE FUNCTION dblink_fdw_validator(
options text[],
catalog oid
)
RETURNS void
AS ‘MODULE_PATHNAME’, ‘dblink_fdw_validator’
LANGUAGE C STRICT;

CREATE FOREIGN DATA WRAPPER dblink_fdw VALIDATOR dblink_fdw_validator;

上面这段代码的具体作用就是用于升级 dblink 扩展到 1.1 版本,并创建了用于验证外部数据封装器的函数和相关配置。

从上面图可以看到目录下含有一些C语言代码文件,PostgreSQL是使用C语言编写的,而C语言代码在调用底层硬件方面具有天然的优势,这也是PostgreSQL相对其它一些语言代码开发的数据库的优势所在。

在 https://pgpedia.info/c/contrib-module.html这篇文章里,对contrib 模块有比较详细的解释,我将这段英文内容翻译成中文如下:

contrib 模块是作为源代码分发的附加功能,但默认情况下未启用的。它们通常提供作为扩展模块或额外的客户端或服务器应用程序。它们是核心分发的一部分,但默认情况下未启用,因为它们要么提供特定的功能,要么被视为实验性质的,或者在某些情况下被用于提供已整合到 PostgreSQL 核心的功能的向后兼容性。

将 PostgreSQL 作为软件包提供的操作系统通常会提供 contrib 模块作为子软件包,通常称为 “postgresql-contrib” 或类似的名称。contrib 模块的源代码可以在 PostgreSQL 源代码分发的 “contrib/” 目录中找到。除非使用 “make world” 目标,否则不会自动构建任何 contrib 模块,在这种情况下将构建所有 contrib 模块。在 “contrib/” 目录中运行 “make && make install” 也将导致构建所有模块。

另外随着PostgreSQL版本的不断迭代,不同版本所含的contrib模块在兼容性上也有差别,以下是这幅图也是来自https://pgpedia.info/c/contrib-module.html 对不同PostgreSQL版本contrib模块兼容性差异的对比。


在 https://www.mankier.com/package/postgresql-contrib 这篇文章中,对于部分PostgreSQL的一些contrib 模块的组件也有相应的解释,我将原文翻译成中文,内容如下:

常用命令

oid2name: 解析 PostgreSQL 数据目录中的 OID 和文件节点
pg_amcheck: 检查一个或多个 PostgreSQL 数据库的损坏情况
pg_archivecleanup: 清理 PostgreSQL WAL(写前日志)归档文件
pg_recvlogical: 控制 PostgreSQL 逻辑解码流
pg_test_fsync: 确定 PostgreSQL 的最快的 wal_sync_method
pg_test_timing: 测量时间开销
pg_waldump: 显示 PostgreSQL 数据库集群的写前日志的可读版本
pgbench: 在 PostgreSQL 上运行基准测试
vacuumlo: 从 PostgreSQL 数据库中删除孤立的大对象

库函数

dblink: 在远程数据库中执行查询
dblink_build_sql_delete: 使用提供的主键字段值构建 DELETE 语句
dblink_build_sql_insert: 使用本地元组构建 INSERT 语句,替换主键字段值为替代提供的值
dblink_build_sql_update: 使用本地元组构建 UPDATE 语句,替换主键字段值为替代提供的值
dblink_cancel_query: 取消指定连接上的任何活动查询
dblink_close: 在远程数据库中关闭游标
dblink_connect: 向远程数据库建立持久连接
dblink_connect_u: 不安全地向远程数据库建立持久连接
dblink_disconnect: 关闭向远程数据库的持久连接
dblink_error_message: 获取指定连接上的最后一个错误消息
dblink_exec: 在远程数据库中执行命令
dblink_fetch: 从远程数据库的打开游标返回行
dblink_get_connections: 返回所有打开的命名 dblink 连接的名称
dblink_get_notify: 在连接上检索异步通知
dblink_get_pkey: 返回关系主键字段的位置和字段名
dblink_get_result: 获取异步查询结果
dblink_is_busy: 检查连接是否在忙于异步查询
dblink_open: 在远程数据库中打开游标
dblink_send_query: 向远程数据库发送异步查询
如果想使用PostGreSQL的contrib 模块里的相应组件的功能,该如何使用呢,首先,要安装contrib 模块,比如可以通过如下源码方式来安装contrib 模块。

— 进入到contrib模块目录
cd /db/postgresql/soft/postgresql-16.1/contrib
— 执行make编译
make
— 执行make install安装
make install
执行make install后,会创建一些目录和文件并赋权,比如如下是执行make install命令结果部分截图。

如果希望详细了解contrib模块里各用户定义模块的具体含义,可以仔细阅读github上https://github.com/postgres/postgres/tree/master/contrib 这部分对各模块的详细介绍,不过这需要很强的代码阅读能力,对于初学者来说确实是一个很大的挑战。

本文主要是对contrib模块进行功能和内容方面的介绍,后面,我也将花时间好好研究这部分的内容,详细了解各模块的功能使用,有基础的同学也可以参考网上挺多对contrib模块的案例介绍。

路漫漫其修远兮,吾将上下而求索。

学习PostgreSQL是一条漫长的求索过程,不仅要学习原理,更要多去动手实践。

让我们一起踏上探索PostgreSQL的升级打怪之路。


本文分享自微信公众号 - 开源软件联盟PostgreSQL分会(kaiyuanlianmeng)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部