ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
> PostgreSQL设计的初衷为易于扩展,而安装的扩展功能就可以像内置的特性一样在数据库中运行 **安装扩展前置条件:** 1. 如果以源码方式进行编译安装,则需要源码目录和安装目录存在 2. 如果以yum或者rpm方式安装,则所在服务器需要可以访问到对应的yum源 **以源码安装方式安装扩展的三种方式:** 1. pgsql的源码目录的`contrib/ `目录下包含了多个可直接编译安装的扩展,只需要进入该目录,进入对应的扩展目录下,执行`make && make install`即可 2. 手动自定义安装方式:pgsql的扩展是支持独立开发的,此方法适用于所有使用扩展规范构建的contrib模块。详见[自定义创建扩展]() 3. 在安装目录下直接引用外部编译好的so文件以及sql文件。 **实例一:引用外部so扩展的方式安装last、first聚合扩展:** > 此方式实现后,可以直接在sql语句中直接使用last、first聚合函数 > 扩展文件下载地址:https://debian.pkgs.org/sid/debian-main-amd64/postgresql-13-first-last-agg_0.1.4-4-gd63ea3b-3+b1_amd64.deb.html 1、解压扩展文件 ``` // 该扩展文件为.deb压缩包,可以直接使用dpkg命令进行解压 [root@izwz91quxhnlkan8kjak5hz ~]# yum install -y dpkg.x86_64 // 解压.deb文件到 ./postgresql_last_first_agg/目录下 [root@izwz91quxhnlkan8kjak5hz ~]# dpkg -X postgresql-13-first-last-agg_0.1.4-4-gd63ea3b-3.pgdg90+1_amd64.deb ./postgresql_last_first_agg/ ``` 2、将解压后文件夹内的so文件和sql文件拷贝至对应的安装目录下 ``` [root@izwz91quxhnlkan8kjak5hz ~]# cd postgresql_last_first_agg/ [root@izwz91quxhnlkan8kjak5hz postgresql_last_first_agg]# ll usr/lib/postgresql/13/lib/first_last_agg.so -rw-r--r-- 1 root root 5984 10月 19 04:14 usr/lib/postgresql/13/lib/first_last_agg.so // 拷贝usr/lib/postgresql/13/lib/first_last_agg.so到安装目录的lib目录下 [root@izwz91quxhnlkan8kjak5hz postgresql_last_first_agg] cp usr/lib/postgresql/13/lib/first_last_agg.so /www/server/postgresql/lib/ [root@izwz91quxhnlkan8kjak5hz postgresql_last_first_agg]# ll usr/share/postgresql/13/extension/ 总用量 16 -rw-r--r-- 1 root root 307 10月 19 04:14 first_last_agg--0.1.0--0.1.1.sql -rw-r--r-- 1 root root 0 10月 19 04:14 first_last_agg--0.1.1--0.1.2.sql -rw-r--r-- 1 root root 0 10月 19 04:14 first_last_agg--0.1.2--0.1.3.sql -rw-r--r-- 1 root root 0 10月 19 04:14 first_last_agg--0.1.3--0.1.4.sql -rw-r--r-- 1 root root 1397 10月 19 04:14 first_last_agg--0.1.4.sql -rw-r--r-- 1 root root 166 10月 19 04:14 first_last_agg.control -rw-r--r-- 1 root root 288 10月 19 04:14 first_last_agg--unpackaged--0.1.0.sql // 拷贝usr/share/postgresql/13/extension/6目录下的所有sql文件到安装目录的extension目录下 [root@izwz91quxhnlkan8kjak5hz postgresql_last_first_agg] cp usr/share/postgresql/13/extension/* /www/server/postgresql/share/extension/ ``` 3、更改安装目录下的so文件和sql文件的用户组和权限 ``` [root@izwz91quxhnlkan8kjak5hz ~]# chown postgres:postgres /www/server/postgresql/lib/first_last_agg.so [root@izwz91quxhnlkan8kjak5hz ~]# chmod 755 /www/server/postgresql/lib/first_last_agg.so [root@izwz91quxhnlkan8kjak5hz ~]# chown postgres:postgres /www/server/postgresql/share/extension/first_last_agg* [root@izwz91quxhnlkan8kjak5hz ~]# chmod 644 /www/server/postgresql/share/extension/first_last_agg* ``` 4、进入数据库执行添加扩展即可 ``` create extension first_last_agg; ``` ![](https://img.kancloud.cn/61/e7/61e7b98e25facbe00354f38ce8a56b85_801x568.png) **实例二:安装pgsql自带的pg_trgm扩展** > pg_trgm扩展是用于字符串的相似度匹配,在特定场景下可以用于全文检索字符串匹配。 > 此扩展的功能作用详见 [pgsql模糊查询不走索引的解决方案](pgsql%E6%A8%A1%E7%B3%8A%E6%9F%A5%E8%AF%A2%E4%B8%8D%E8%B5%B0%E7%B4%A2%E5%BC%95%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.md) 1、pg_trgm扩展为pgsql自带的扩展,位置在源码目录的`contrib`目录下,因此,只需切换到该目录的对应扩展目录下 ``` [root@izwz91quxhnlkan8kjak5hz postgresql-13.0]# cd contrib/ [root@izwz91quxhnlkan8kjak5hz contrib]# ls adminpack bool_plperl cube file_fdw intagg lo pageinspect pg_prewarm pg_trgm sepgsql tcn uuid-ossp amcheck btree_gin dblink fuzzystrmatch intarray ltree passwordcheck pgrowlocks pg_visibility spi test_decoding vacuumlo auth_delay btree_gist dict_int hstore isn ltree_plpython pg_buffercache pg_standby postgres_fdw sslinfo tsm_system_rows xml2 auto_explain citext dict_xsyn hstore_plperl jsonb_plperl Makefile pgcrypto pg_stat_statements README start-scripts tsm_system_time bloom contrib-global.mk earthdistance hstore_plpython jsonb_plpython oid2name pg_freespacemap pgstattuple seg tablefunc unaccent [root@izwz91quxhnlkan8kjak5hz contrib]# cd pg_trgm/ [root@izwz91quxhnlkan8kjak5hz pg_trgm]# ls data Makefile pg_trgm--1.1--1.2.sql pg_trgm--1.3--1.4.sql pg_trgm--1.4--1.5.sql sql trgm_gist.c trgm_op.c expected pg_trgm--1.0--1.1.sql pg_trgm--1.2--1.3.sql pg_trgm--1.3.sql pg_trgm.control trgm_gin.c trgm.h trgm_regexp.c ``` 2、执行`make`和`make install`命令,这两个命令会自动拷贝编译后的相关文件至安装目录(因为在安装的时候已经设置好了全局变量,如果未自动拷贝,则需要手动拷贝过去), ``` // 执行完make命令后,可以看到该命令已经自动将编译结果拷贝至安装目录的lib下:/www/server/postgresql/lib [root@izwz91quxhnlkan8kjak5hz pg_trgm]# make make -C ../../src/backend generated-headers make[1]: 进入目录“/postgresql/postgresql-13.0/src/backend” ... -O2 -fPIC -shared -o pg_trgm.so trgm_gin.o trgm_gist.o trgm_op.o trgm_regexp.o -L../../src/port -L../../src/common -Wl,--as-needed -Wl,-rpath,'/www/server/postgresql/lib',--enable-new-dtags // make install:安装扩展,此命令会将扩展文件(.sql文件)拷贝至安装目录的share/extension目录下 [root@izwz91quxhnlkan8kjak5hz pg_trgm]# make install ... /usr/bin/install -c -m 644 ./pg_trgm--1.4--1.5.sql ./pg_trgm--1.3--1.4.sql ./pg_trgm--1.3.sql ./pg_trgm--1.2--1.3.sql ./pg_trgm--1.1--1.2.sql ./pg_trgm--1.0--1.1.sql '/www/server/postgresql/share/extension/' ``` 3、更改安装目录下新增的`pg_trgm.so`文件和.sql相关文件的权限和用户组 ``` [root@izwz91quxhnlkan8kjak5hz lib]# ll pg_trgm.so -rwxr-xr-x 1 root root 58264 3月 29 22:56 pg_trgm.so [root@izwz91quxhnlkan8kjak5hz lib]# chown postgres:postgres pg_trgm.so [root@izwz91quxhnlkan8kjak5hz lib]# chmod 755 pg_trgm.so [root@izwz91quxhnlkan8kjak5hz lib]# ll pg_trgm.so -rwxr-xr-x 1 postgres postgres 58264 3月 29 22:56 pg_trgm.so [root@izwz91quxhnlkan8kjak5hz lib]# cd ../share/extension/ [root@izwz91quxhnlkan8kjak5hz extension]# chown postgres:postgres pg_trgm* [root@izwz91quxhnlkan8kjak5hz extension]# chmod 644 pg_trgm* ``` 4、进入数据库,执行`create extension pg_trgm`命令,添加扩展 ![](https://img.kancloud.cn/e0/1e/e01ebc039e08d70c3c3621f3d982a281_323x207.png)