This is the multi-page printable view of this section. Click here to print.
安装使用
1 - 快速上手
Pigsty 让您可以直接在 PGSQL
集群中,通过声明式的方式启用 PostgreSQL 插件。
概览
通常想要在一套 PostgreSQL 集群中使用插件,涉及到 下载、安装、加载、启用 四个核心问题:
-
怎样下载扩展:
repo_upstream
&repo_packages
在 Pigsty 默认在线安装时,已经默认下载了当前首要PG大版本(16)可用的所有扩展,如果不需要添加额外或者冷门扩展,通常都不需要您操心
repo_upstream
与repo_packages
以及扩展下载相关的问题。 -
安装哪些扩展:
pg_extensions
&pg_packages
在 Pigsty 配置模板中的样例集群中,已经提供了完整可用的扩展清单,您只需要将想要 安装 的扩展,添加到
pg_packages
与pg_extensions
中即可。 -
一小部分使用了 PostgreSQL HOOK 的扩展需要动态加载并重启数据库后才可以使用,您需要将这些扩展添加到
pg_libs
中,并在重启加载后生效。 -
启用哪些扩展:
pg_databases.extensions
绝大多数扩展在安装之后,都需要执行
CREATE EXTENSION
DDL 语句,才会真实在具体的数据库中被创建并启用。您可以手工执行此 DDL,或者在pg_datbasese.extensions
中显式指定,则数据库会在初始化的时候自动启用这些扩展。
开箱即用
Pigsty 为用户封装了扩展管理的复杂度,您不需要知道这些扩展的 RPM 包名,也不需要知道如何下载,安装,加载,启用这些扩展,只需要在配置文件中声明您需要的扩展即可。
例如,下面的配置文件片段声明了一个 PostgreSQL 集群,安装 了所有可用的扩展插件,动态 加载 了三个扩展,并 启用 了三个扩展。
pg-meta:
hosts:
10.10.10.10: { pg_seq: 1, pg_role: primary }
vars:
pg_cluster: pg-meta
pg_databases:
- name: meta
extensions:
- { name: postgis }
- { name: timescaledb }
- { name: vector }
pg_libs: 'timescaledb, pg_stat_statements, auto_explain'
pg_extensions:
- timescaledb periods temporal_tables emaj table_version pg_cron pg_later pg_background pg_timetable #[TIME]#
- postgis pgrouting pointcloud pg_h3 q3c ogr_fdw geoip #[GIS]#
- pgvector pgvectorscale pg_vectorize pg_similarity pg_tiktoken pgml #[RAG]#
- pg_search pg_bigm zhparser hunspell #[FTS]#
- hydra pg_lakehouse duckdb_fdw pg_fkpart pg_partman plproxy #citus pg_strom #[OLAP]#
- age hll rum pg_graphql pg_jsonschema jsquery pg_hint_plan hypopg imgsmlr pg_ivm pgmq pgq #[FEAT]#
- pg_tle plv8 pllua plprql pldebugger plpgsql_check plprofiler plsh pljava #plr faker pgtap #[LANG]#
- prefix semver pgmp pguint pgunit roaringbitmap md5hash asn1oid numeral pg_rational ip4r pgsphere pgfaceting timestamp9 #[TYPE]# #[FUNC]# #[ADMIN]# #[STAT]# #[SEC]#
- pg_gzip pg_http topn pg_net pgjwt shacrypt pgsql_tweaks pg_extra_time count_distinct extra_window_functions first_last_agg tdigest pgpcre icu_ext pg_idkit pg_hashids pg_uuidv7 permuteseq sequential_uuids
- pg_repack pg_squeeze pg_dirtyread pgfincore pgdd ddlx pg_prioritize pg_checksums pg_readonly safeupdate pg_permissions pg_auto_failover preprepare pg_catcheck
- pg_profile pg_show_plans pg_stat_kcache pg_stat_monitor pg_qualstats pg_store_plans pg_track_settings pg_wait_sampling system_stats bgw_replstatus pg_sqlog powa pgmeminfo toastinfo
- passwordcheck supautils pgsodium pg_vault anonymizer pg_tde pgsmcrypto pgaudit pgauditlogtofile pg_auth_mon credcheck pgcryptokey pg_jobmon logerrors login_hook set_user tablelog pg_snakeoil pgextwlist
- wrappers multicorn mongo_fdw mysql_fdw tds_fdw sqlite_fdw hdfs_fdw pgbouncer_fdw firebird_fdw #oracle_fdw db2_fdw #[FDW]#
- mysqlcompat pgmemcache pgtt orafce pg_statement_rollback pg_dbms_lock pg_dbms_metadata #pg_dbms_job babelfish #[SIM]#
- pglogical pgl_ddl_deploy decoderbufs wal2json wal2mongo pg_failover_slots mimeo pg_fact_loader pg_bulkload #repmgr slony #[ETL]#
- gis-stack rag-stack fdw-stack fts-stack etl-stack feat-stack olap-stack supa-stack stat-stack json-stack #[STACK]#
您可能注意到这里的扩展名称既非 RPM / DEB 包名,而是由 Pigsty 封装简化过的 标准扩展名(Alias)。
在不同的操作系统发行版中,Pigsty 将标准扩展名翻译为对应 PG 大版本的 RPM / DEB 包名,这样您就无需关心不同操作系统发行版的扩展包名差异了。
在 Pigsty configure
过程中,针对特定操作系统发行版生成的默认配置里已经带有上述清单。
要安装这些扩展,您只需要根据自己的需求,在配置文件中将需要的扩展取消注释即可。
请注意,您依然可以在这里直接使用操作系统特定的 RPM/DEB 包名称。
预定义的扩展集合
如果您不清楚应该安装哪些扩展,Pigsty 为您提供了一些预定义的扩展集合(Stack),您可以根据自己的需求场景,选择其中一个集合与任意组合,将其添加到 pg_extensions
中即可。
gis-stack
: 地理空间扩展集合,包括:postgis
,pgrouting
,pointcloud
,h3
,q3c
,ogr_fdw
rag-stack
: 向量检索扩展集合,包括:pgvector
,pgvectorscale
,pg_vectorize
,pg_similarity
,pg_tiktoken
,pgml
fts-stack
: 全文检索扩展集合,包括:pg_search
,pg_bigm
,zhparser
,hunspell
fdw-stack
: 外部数据扩展集合,包括:wrappers
,mysql_fdw
,tds_fdw
,sqlite_fdw
etl-stack
: 数据ETL/CDC集合,包括:pglogical
,pgl_ddl_deploy
,wal2json
,wal2mongo
,decoderbufs
,pg_fact_loader
,pg_bulkload
,pgloader
,pgcopydb
feat-stack
: 类型函数扩展集合,包括:age
,hll
,rum
,pg_graphql
,pg_jsonschema
,jsquery
,pg_ivm
,pgq3
,gzip
,http
,topn
,pgjwt
olap-stack
: 数据仓库OLAP集合,包括:duckdb
,duckdb_fdw
,pg-lakehouse
,hydra
,timescaledb
,pg-fkpart
,pg-partman
,plproxy
supa-stack
: Supabase扩展集合,包括:pg-graphql
,pg-jsonschema
,wrappers
,pgvector
,cron
,supautils
,pgsodium
,vault
,pgjwt
,http
,pg-net
stat-stack
: 统计监控扩展集合,包括:show-plans
,pg-stat-kcache
,pg-qualstats
,pg-track-settings
,pg-wait-sampling
,pg-sqlog
json-stack
: JSON处理扩展集合,包括:plv8
,pg-jsonschema
,pgjwt
,jsquery
,pg-graphql
,ferretdb
当您在 pg_extensions
或 pg_packages
中指定了这些扩展集合时,Pigsty 会自动翻译,展开并安装其中的所有扩展插件。
安装、加载与启用
Pigsty 不仅允许您在配置文件中声明需要安装的扩展,还允许您在配置文件中直接声明需要加载的扩展,以及需要启用的扩展。
下面是一个具体的例子:Supabase。 Supabase 是一个封装 PostgreSQL 作为底层存储的“上层抽象数据库”,它深度使用了 PostgreSQL 的扩展机制。 以下是使用 Pigsty 创建一套 Supabase 所需 PostgreSQL 集群的样例配置文件:
# supabase example cluster: pg-meta
# this cluster needs to be migrated with app/supabase/migration.sql :
# psql postgres://supabase_admin:[email protected]:5432/supa -v ON_ERROR_STOP=1 --no-psqlrc -f ~pigsty/app/supabase/migration.sql
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_users:
- { name: supabase_admin ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: true ,superuser: true ,replication: true ,createdb: true ,createrole: true ,bypassrls: true }
pg_databases:
- name: supa
baseline: supa.sql # the init-scripts: https://github.com/supabase/postgres/tree/develop/migrations/db/init-scripts
owner: supabase_admin
comment: supabase postgres database
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions:
- { name: pgcrypto ,schema: extensions } # 1.3 : cryptographic functions
- { name: pg_net ,schema: extensions } # 0.9.2 : async HTTP
- { name: pgjwt ,schema: extensions } # 0.2.0 : json web token API for postgres
- { name: uuid-ossp ,schema: extensions } # 1.1 : generate universally unique identifiers (UUIDs)
- { name: pgsodium } # 3.1.9 : pgsodium is a modern cryptography library for Postgres.
- { name: supabase_vault } # 0.2.8 : Supabase Vault Extension
- { name: pg_graphql } # 1.5.7 : pg_graphql: GraphQL support
- { name: pg_jsonschema } # 0.3.1 : pg_jsonschema: Validate json schema
- { name: wrappers } # 0.4.1 : wrappers: FDW collections
- { name: http } # 1.6 : http: allows web page retrieval inside the database.
- { name: pg_cron }
# supabase required extensions
pg_libs: 'pg_net, pg_cron, pg_stat_statements, auto_explain' # add pg_net to shared_preload_libraries
pg_extensions:
- wal2json pg_repack
- supa-stack # pgvector pg_cron pgsodium pg_graphql pg_jsonschema wrappers pgjwt pgsql_http pg_net supautils
pg_parameters:
cron.database_name: supa
pgsodium.enable_event_trigger: off
pg_hba_rules: # supabase hba rules, require access from docker network
- { user: all ,db: supa ,addr: intra ,auth: pwd ,title: 'allow supa database access from intranet' }
- { user: all ,db: supa ,addr: 172.0.0.0/8 ,auth: pwd ,title: 'allow supa database access from docker network'}
- { user: all ,db: supa ,addr: all ,auth: pwd ,title: 'allow supa database access from entire world' } # not safe!
在这里,我们声明了一个名为 pg-meta
的 PostgreSQL 集群,它包含了一个名为 supa
的数据库,以及一系列的扩展插件。
在 pg_extensions
中定义的 supa-stack
被翻译为 pgvector pg_cron pgsodium pg_graphql pg_jsonschema wrappers pgjwt pgsql_http pg_net supautils
,并自动安装。
与此同时,pg_libs
指定了两个需要动态加载的扩展: pg_net
与 pg_cron
;此外,pgsodium
与 pg_cron
扩展所必须的配置参数,也通过 pg_parameters
预先指定;
接下来,这些扩展在 pg_databases.extensions
中被依次创建到指定的/或默认的 Schema 中,正式启用。
最后,这样一个开箱即用,可以直接供无状态 Supabase 容器使用的高可用 PostgreSQL 集群,就能在一行 ./pgsql.yml
命令中被完整拉起,开箱即用。
2 - 下载扩展
在 Pigsty 默认安装模式中,扩展插件的下载与安装是分离的。在 安装扩展前 ,您需要确保目标节点上已经添加了相应的软件源,否则安装过程会因为找不到软件包而失败。
Pigsty 在安装过程中会下载当前首要PG大版本(16)可用的所有扩展至 INFRA节点 ,并构建一个 本地软件仓库,供包括本机在内的所有节点使用。 这样做可以加速安装,避免重复下载,减少网络流量消耗,提高交付可靠性性,并解决重复安装版本不一致的风险。
您也可以选择使用另一种方式:直接在 Pigsty 纳管的目标节点上添加上游 PostgreSQL 软件仓库及其依赖仓库(操作系统软件源)。 然后直接从互联网上游进行安装,这样做可以方便地将插件更新至最新版本,但要求环境有互联网访问或 HTTP 代理,同时可能会受网络条件影响,并有潜在的安装版本不一致风险。
软件仓库
在首次安装过程中,Pigsty 会从 repo_upstream
指定的上游软件仓库中下载 repo_packages
指定的软件包。
EL 系统与 Debian/Ubuntu 系统的软件包名称有所不同,完整列表请参考以下地址:
极个别插件因为各种原因被排除在外,默认没有下载。如果您需要使用这些扩展,请参考扩展列表里的 RPM / DEB 包名,将其加入到 repo_upstream
中后下载。
- 依赖过重:
pljava
,plr
- 生态位重叠:
repmgr
,pgexporterext
,pgpool
- EL9 独占:
pljava
,sequential_uuids
,firebird_fdw
下载扩展
要想下载新的扩展插件,您可以将其添加至 repo_upstream
中,并执行以下任务更新本地软件仓库,并刷新所有节点的软件源缓存:
./infra.yml -t repo # 重新下载指定的软件包至本地软件仓库
./node.yml -t node_repo # 刷新所有节点的本地软件仓库元数据缓存
Pigsty 默认使用位于 INFRA节点 上的本地软件源,如果您不想将这些扩展下载至本地软件源,而是直接使用在线软件仓库进行安装,那么可以直接将上游软件源添加到节点上:
./node.yml -t node_repo -e node_repo_modules=node,pgsql # 添加 Postgres 插件仓库与操作系统软件源(依赖)
完成这些任务后,您就可以通过标准操作系统包管理器(yum/apt)的方式,安装 PostgreSQL 扩展插件了。
3 - 扩展仓库
YUM仓库
Pigsty 目前针对 EL 系统提供了补充插件仓库,在官方 PGDG YUM 仓库的基础上提供了 65 个额外的 RPM 插件。
- Pigsty YUM 仓库: https://repo.pigsty.io/yum/
- PGDG YUM 仓库: https://download.postgresql.org/pub/repos/yum/
Pigsty Yum 仓库只收录那些 不存在于 PGDG Yum 仓库的扩展,一旦某个扩展进入 PGDG YUM 仓库,Pigsty Yum 仓库将移除此扩展或与 PGDG 仓库保持一致。
对于 EL 7/8/9 及其兼容系统,使用以下命令依次添加 Pigsty 仓库的 GPG 公钥与上游仓库文件:
curl -fsSL https://repo.pigsty.io/key | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty >/dev/null # 添加公钥
curl -fsSL https://repo.pigsty.io/yum/repo | sudo tee /etc/yum.repos.d/pigsty.repo >/dev/null # 添加仓库
中国大陆地区的用户,可以使用国内 CDN 镜像 YUM 仓库:
curl -fsSL https://repo.pigsty.cc/key | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty >/dev/null # 添加公钥
curl -fsSL https://repo.pigsty.cc/yum/repo | sudo tee /etc/yum.repos.d/pigsty.repo >/dev/null # 添加仓库
所有的 RPM 包都使用指纹为 9592A7BC7A682E7333376E09E7935D8DB9BD8B20
(B9BD8B20
) 的 GPG 密钥进行签名。
手工写入Repo文件
sudo tee /etc/yum.repos.d/pigsty-io.repo > /dev/null <<-'EOF'
[pigsty-infra]
name=Pigsty Infra for $basearch
baseurl=https://repo.pigsty.io/yum/infra/$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
[pigsty-pgsql]
name=Pigsty PGSQL For el$releasever.$basearch
baseurl=https://repo.pigsty.io/yum/pgsql/el$releasever.$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
EOF
sudo yum makecache;
APT仓库
Pigsty 目前针对 Debian / Ubuntu 系统提供了补充插件仓库,在官方 PGDG YUM 仓库的基础上提供了 77 个额外的 DEB 插件包。
- Pigsty APT 仓库: https://repo.pigsty.io/apt/
- PGDG APT 仓库: http://apt.postgresql.org/pub/repos/apt/
Pigsty APT 仓库只收录那些 不存在于 PGDG ATP 仓库的扩展:一旦某个扩展进入 PGDG APT 仓库,Pigsty APT 仓库将移除此扩展或与 PGDG 仓库保持一致。
对于 Debian / Ubuntu 及其兼容系统,使用以下命令依次添加 Pigsty 仓库的 GPG 公钥与上游仓库文件:
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.io/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg # 添加公钥
# 获取 Debian 发行版代号,distro_codename=jammy, focal, bullseye, bookworm,并将对应上游仓库地址写入 APT List 文件
distro_codename=$(lsb_release -cs)
sudo tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/pgsql ${distro_codename} main
EOF
# 刷新 APT 仓库缓存
sudo apt update
中国大陆地区的用户,可以使用国内 CDN 镜像 APT 仓库:
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.cc/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg # 添加公钥
# 获取 Debian 发行版代号,distro_codename=jammy, focal, bullseye, bookworm,并将对应上游仓库地址写入 APT List 文件
distro_codename=$(lsb_release -cs)
sudo tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/pgsql/${distro_codename} ${distro_codename} main
EOF
# 刷新 APT 仓库缓存
sudo apt update
所有的 DEB 包都使用指纹为 9592A7BC7A682E7333376E09E7935D8DB9BD8B20
(B9BD8B20
) 的 GPG 密钥进行签名。
扩展安装
Pigsty 目前针对 EL 系统提供了补充插件仓库,在官方 PGDG YUM 仓库的基础上提供了 65 个额外的 RPM 插件。
- Pigsty YUM 仓库: https://repo.pigsty.io/yum/
- PGDG YUM 仓库: https://download.postgresql.org/pub/repos/yum/
Pigsty Yum 仓库只收录那些 不存在于 PGDG Yum 仓库的扩展,一旦某个扩展进入 PGDG YUM 仓库,Pigsty Yum 仓库将移除此扩展或与 PGDG 仓库保持一致。
4 - 安装扩展
Pigsty 使用操作系统标准的包管理器(yum/apt)来安装 PostgreSQL 扩展插件。
扩展安装相关参数
您可以在以下变量中指定要安装哪些扩展,两者的效果基本相同:
通常 pg_packages
用于在全局指定整个环境中所有 PostgreSQL 集群都需要统一安装的软件包:
例如 PostgreSQL 内核,高可用组建 Patroni,连接池 pgBouncer,监控 pgExporter 等。
Pigsty 默认也会在这里指定安装两个必选扩展: pg_repack
和 wal2json
用于膨胀治理和 CDC 变更抽取。
而 pg_extensions
则通常用于在特定集群中,指定本集群需要安装的扩展插件。
Pigsty 默认安装三个PG生态的重要扩展:postgis
, timescaledb
, pgvector
,您可以在这里指定需要安装的其他扩展插件。
pg_packages: # pg packages to be installed, alias can be used
- postgresql
- patroni pgbouncer pgbackrest pg_exporter pgbadger vip-manager wal2json pg_repack
pg_extensions: # pg extensions to be installed, alias can be used
- postgis timescaledb pgvector
另一个重要区别是:pg_packages
安装的软件包只确保存在,而 pg_extensions
安装的软件包会默认升级到最新可用版本。
当使用本地软件源时,这并不是一个问题。当您直接使用互联网上游软件源时,请充分考虑这一点,并将不希望升级的扩展插件转移到 pg_packages
中。
在 PGSQL 集群初始化时,Pigsty 会自动安装 pg_packages
和 pg_extensions
中指定的扩展插件。
在已有集群上安装扩展
对于一个已经完成置备初始化的 PostgreSQL 集群,您可以首先将所需的扩展添加至 pg_packages
或 pg_extensions
中,然后通过以下命令安装扩展:
./pgsql.yml -t pg_extension # 安装 pg_extensions 中指定的扩展插件
扩展名翻译机制
在 Pigsty 中,您可以在 pg_packages
和 pg_extensions
中使用:
- 原始的操作系统包名
- 标准扩展名(Alias)
例如:
postgis # 安装当前 PG 大版本对应的 PostGIS 包
postgis34_$v* # 安装当前 PG 大版本对应的 PostGIS RPM 包
postgis34_15* # 安装 PG 15 大版本对应的 PostGIS RPM 包
postgresql-$v-postgis-3* # 安装当前 PG 大版本对应的 PostGIS DEB 包
postgresql-14-postgis-3* # 安装 PG 14 大版本对应的 PostGIS DEB 包
我们建议使用 Pigsty 提供的标准化扩展名(Alias),在不同的操作系统发行版中,Pigsty 将标准扩展名翻译为对应 PG 大版本的 RPM / DEB 包名,这样用户可以无需关心不同操作系统发行版的扩展包名差异:
Pigsty 尽最大努力对齐 EL 操作系统与 Debian 操作系统生态的 PostgreSQL 扩展,但仍有少量扩展因为各种原因难以/尚未移植, 请参考 RPM扩展列表 与 DEB扩展列表 了解更多信息。
5 - 加载扩展
安装 PostgreSQL 扩展后,您便可以在 PostgreSQL 的 pg_available_extensions
视图中看到它们。
除了纯 SQL 编写的扩展外,绝大多数扩展都会提供一个 .so
文件,这是一个动态连接库文件。
大部分扩展并不需要显式加载,只需要通过 CREATE EXTENSION
启用即可。
但一小部分扩展使用 PostgreSQL 的 Hook 机制,这些扩展必须通过 shared_preload_libraries
参数预先加载,并重启 PostgreSQL 后才能生效。
如果您在未加载/重启生效的情况下直接执行 CREATE EXTENSION
会报错。
在 Pigsty 中,您可以在集群的 pg_libs
参数中预先指定集群需要加载的扩展,或者在集群初始化后 修改集群配置。
需要加载的扩展
在 扩展列表 中,带有 LOAD
标记的扩展,即为需要动态加载并重启的扩展,包括:
扩展名 | 标准名 | 说明 |
---|---|---|
timescaledb |
timescaledb | 时序数据库扩展插件 |
pgml |
pgml | PostgresML:用SQL运行机器学习算法并训练模型 |
citus |
citus | Citus 分布式数据库 |
pg_squeeze |
pg_squeeze | 从关系中删除未使用空间 |
pgautofailover |
pgautofailover | PG 自动故障迁移 |
pg_prewarm |
pg_prewarm | 预热关系数据 |
pg_stat_kcache |
pg_stat_kcache | 内核统计信息收集 |
bgw_replstatus |
bgw_replstatus | 用于汇报本机主从状态的后台工作进程 |
auto_explain |
auto_explain | 提供一种自动记录执行计划的手段 |
pg_stat_statements |
pg_stat_statements | 跟踪所有执行的 SQL 语句的计划和执行统计信息 |
passwordcheck_cracklib |
passwordcheck | 使用cracklib加固PG用户密码 |
supautils |
supautils | 用于在云环境中确保数据库集群的安全 |
pg_tde |
pg_tde | 试点性质的加密存储引擎 |
pgaudit |
pgaudit | 提供审计功能 |
pg_snakeoil |
pg_snakeoil | PostgreSQL动态链接库反病毒功能 |
pgextwlist |
pgextwlist | PostgreSQL扩展白名单功能 |
sepgsql |
sepgsql | 基于SELinux标签的强制访问控制 |
auth_delay |
auth_delay | 在返回认证失败前暂停一会,避免爆破 |
passwordcheck |
passwordcheck | 用于强制拒绝修改弱密码的扩展 |
pg_statement_rollback |
pg_statement_rollback | 在服务端提供类似Oracle/DB2的语句级回滚能力 |
babelfishpg_tsql |
babelfishpg_tsql | SQL Server SQL语法兼容性扩展 |
加载顺序
在 shared_preload_libraries
中,如果有多个扩展插件需要加载,可以使用逗号分隔,例如:
'timescaledb, pg_stat_statements, auto_explain'
请注意,Citus 和 TimescaleDB 这两个扩展显式提出要求,要在 shared_preload_libraries
中预先加载,也就是放在最前面。
虽然同时使用 Citus 与 TimescaleDB 的情况非常罕见,但在这种情况中,建议将 citus
放在 timescaledb
之前。
Pigsty 默认会加载两个扩展:pg_stat_statements
与 auto_explain
,这两个扩展对于优化数据库性能非常实用,强烈建议安装。
6 - 启用扩展
CREATE EXTENSION
在 PostgreSQL 数据库中真正启用扩展?列出可用扩展
安装 PostgreSQL 扩展后,您可以在 PostgreSQL 的 pg_available_extensions
视图中看到它们。但想要实际启用扩展,通常还需要额外的步骤:
- 一部分扩展要求被添加到
shared_preload_libraries
中动态加载,例如timescaledb
,citus
等。 - 大部分扩展都需要通过 SQL 语句:
CREATE EXTENSION <name>;
启用,极少量扩展不需要,例如wal2json
。
- 修改
shared_preload_libraries
: - 执行
CREATE EXTENSION
:- 在数据库集群初始化前,可以在
pg_databases
.extensions
列表中指定。 - 当数据库已经初始化完毕后,您可以直接连接数据库执行此 SQL 命令,或使用其他模式变更工具管理扩展。
- 在数据库集群初始化前,可以在
从原理上讲:PostgreSQL 的扩展通常由 Control文件(元数据,一定存在),SQL文件(SQL语句,可选),So文件(二进制动态连接库,可选)三部分组成。 提供
.so
文件的扩展有可能需要添加到shared_preload_libraries
才能生效,例如citus
与timescaledb
,但也有许多扩展不用,例如postgis
,pgvector
。 不通过 SQL 接口对外服务的扩展不需要执行CREATE EXTENSION
,例如提供 CDC 抽取能力的wal2json
扩展。
在您希望启用扩展的数据库中执行 CREATE EXTENSION
SQL 语句,即可完成扩展的创建:
CREATE EXTENSION vector; -- 安装向量数据库扩展
CREATE EXTENSION hydra; -- 安装列存数据库扩展
7 - 更新扩展
8 - 卸载扩展
要卸载某个扩展,通常需要执行以下步骤:
DROP EXTENSION "<extname>";
请注意,如果有其他扩展,或者使用此扩展的数据库对象依赖,您需要首先卸载/删除这些依赖,然后再卸载此扩展;
或者,也可以使用以下语句一次性强制卸载扩展及其依赖:
DROP EXTENSION "<extname>" CASCADE;
注意:
CASCADE
选项会删除依赖于此扩展的所有对象,包括数据库对象、函数、视图等,慎用!
如果您希望移除扩展的软件包,可以操作系统的包管理器进行卸载: