这是本节的多页打印视图。
.
返回本页常规视图.
扩展
利用 PostgreSQL 扩展的协同超能力
Pigsty 允许您通过三样东西来利用 Postgres 扩展生态系统的协同超能力:目录、仓库和 pig。
扩展目录
完整的 <span class="text-lg font-black text-emerald-500">437</span> 可用 PostgreSQL 扩展列表
软件仓库
提供 PostgreSQL 扩展的 APT/YUM 仓库
v3.7.0 扩展目录共收录 437 个 PostgreSQL 扩展,且 PostgreSQL 18 是默认版本。
下表是归档中保留的 PG13–17 兼容性快照,并未记录最终 PG18 分项统计;PG18 请以 v3.7.0 软件包别名和发布说明为准。

时间
地理
向量
搜索
分析
特性
语言
类型
工具
函数
管理
统计
安全
外部
兼容
数据
MIT
ISC
PostgreSQL
BSD-0
BSD-2
BSD-3
Artistic
Apache-2.0
MPL-2.0
GPL-2.0
GPL-3.0
LGPL-2.1
LGPL-3.0
AGPL-3.0
Timescale
使用方法
索引
1 - 快速开始
安装、加载、创建、更新 PostgreSQL 扩展
Pigsty 为 14 个主流 Linux 发行版提供了无与伦比的 437 扩展。
概述
交付扩展需要 4 个步骤:下载、安装、配置和创建:
步骤 1
[**下载**](#download-extension):要下载哪些扩展包
```yaml tab="config" title="定义要下载的扩展"
repo_extra_packages: [ postgis, timescaledb, vector ]
```
```bash tab="apply" title="下载包"
make repo
```
步骤 2
[**安装**](#install-extension):要安装哪些扩展
```yaml tab="config"
pg_extensions: [ postgis, pgvector, timescaledb ]
```
```bash tab="apply"
./pgsql.yml -t pg_ext # 安装扩展
```
步骤 3
[**加载**](#load-extension):要预加载哪些扩展
```yaml tab="config"
pg_libs: 'timescaledb, pg_stat_statements, auto_explain' # 将扩展添加到预加载库(并非所有扩展都需要此操作)
```
```bash tab="apply" title="编辑现有集群配置并重新加载"
pg edit-config --force -p shared_preload_libraries='timescaledb, pg_stat_statements, auto_explain'
```
步骤 4
[**创建**](#create-extension):在[数据库](/zh/docs/pgsql/db)中创建扩展
```yaml tab="config"
pg_databases:
- { name: meta ,extensions: [ postgis, timescaledb, vector ] }
```
```sql tab="apply" title="在现有数据库中创建扩展"
CREATE EXTENSION postgis CASCADE;
```
快速开始
您可以在配置清单中描述扩展,Pigsty 将为您下载、安装、配置和启用扩展。
此示例使 postgis、pgvector、timescaledb 开箱即用:
all:
children:
pg-meta:
hosts: {10.10.10.10: { pg_seq: 1, pg_role: primary }}
vars:
pg_cluster: pg-meta
pg_databases: {name: meta, extensions: [ postgis, vector ]} # 创建(在数据库中)
pg_extensions: [ postgis, pgvector ] # 安装(在集群中)
vars:
repo_extra_packages: [ postgis, timescaledb, vector ] # 下载(全局)
当您初始化此 PG 集群时,这些扩展将在 pg-meta 集群中为您提供。
这里是一个更复杂的示例:启动 Postgres 并带有自托管 supabase 所需的扩展:
all:
children:
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_databases:
- name: postgres
baseline: supabase.sql
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions: # 在 postgres 数据库中启用的扩展
- { name: pgcrypto ,schema: extensions } # 加密函数
- { name: pg_net ,schema: extensions } # 异步 HTTP
- { name: pgjwt ,schema: extensions } # PostgreSQL 的 JSON Web Token API
- { name: uuid-ossp ,schema: extensions } # 生成通用唯一标识符 (UUIDs)
- { name: pgsodium } # PostgreSQL 的现代密码学
- { name: supabase_vault } # Supabase Vault 扩展
- { name: pg_graphql } # GraphQL 支持
- { name: pg_jsonschema } # JSON 模式验证
- { name: wrappers } # 外部数据包装器集合
- { name: http } # 数据库内网页检索
- { name: pg_cron } # PostgreSQL 的作业调度器
- { name: timescaledb } # 时间序列数据支持
- { name: pg_tle } # PostgreSQL 的可信语言扩展
- { name: vector } # 向量相似性搜索
- { name: pgmq } # 轻量级消息队列
# supabase 加载所需扩展
pg_libs: 'timescaledb, plpgsql, plpgsql_check, pg_cron, pg_net, pg_stat_statements, auto_explain, pg_tle, plan_filter'
pg_parameters:
cron.database_name: postgres
pgsodium.enable_event_trigger: off
vars:
pg_version: 17
repo_extra_packages: [pg17-core ,pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-olap ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ]
pg_extensions: [pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ] #,pg17-olap]
下载并安装了 PG 17 的所有可用扩展,并加载和启用了所需的扩展。
2 - 软件包
扩展包和别名
管理扩展和包并不简单,这里有两个常见的扩展示例:
要以最小的努力安装正确的 RPM / DEB,我们需要使用抽象层:包别名。
因此您可以通过指定"标准化"名称(如 pgvector 或 postgis)来安装这些扩展。
无需了解 PG 和操作系统版本、架构、扩展版本以及任何其他详细信息。
包别名 pkg 用于扩展下载和安装,但在数据库中 CREATE EXTENSION 时您必须使用扩展名称 ext(如 meta 数据库中的 vector)。
请注意,某些扩展需要显式预加载,如上述示例中的 timescaledb。
此外,所有扩展都被分类为 16 个主要类别,我们也为整个扩展类别提供别名
这样您就可以批量下载和安装它们,例如:
repo_extra_packages: [ pg17-main ,pg17-core ,pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-olap ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl]
pg_extensions: [pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ] #,pg17-olap]
除了 olap 类别外,所有扩展都可以同时安装,在 olap 类别中,citus 与 hydra 冲突,pg_duckdb 与 pg_mooncake 冲突。
所以您可以下载所有扩展,但要一次安装一个。
3 - 下载
下载 PostgreSQL 扩展
在 Pigsty 中,下载和安装扩展是两个独立的步骤。在 INFRA 模块安装期间,Pigsty 将所有必需的软件下载到本地机器上,并为整个部署创建本地 YUM/APT 仓库。
这种方法加速了安装过程,消除了冗余下载,移除了数据库节点访问互联网的需求,减少了网络流量,提高了交付可靠性,并确保了环境中版本的一致性——这些都是生产部署的最佳实践。
对于开发环境,直接从互联网仓库安装扩展也是可以接受的
快速开始
在 repo_packages 和 repo_extra_packages 中定义的包会在 Pigsty 安装期间自动下载到您的本地仓库。
对于 PostgreSQL 相关的包(内核和扩展),通常将它们放在 repo_extra_packages 中,而让 repo_packages 保持其特定于操作系统的全局默认值。
repo_extra_packages 的默认值是 [pgsql-main],这是一个别名,代表当前活跃主版本的核心 PostgreSQL 和关键扩展。
repo_extra_packages: [ pgsql-main ] # 当前 pg 主版本 18 的主要包(内核 + 3 个扩展)
要添加特定扩展,只需将 Pigsty 扩展包名称(pkg)添加到此参数中。Pigsty 会自动为您的活跃 PG 版本和当前操作系统发行版下载适当的包。
repo_extra_packages: [ pgsql-main, documentdb, citus, postgis, pgvector, pg_cron, rum ]
要下载当前 PG 版本的所有可用扩展,添加所有 16 个扩展类别别名(如 rich 配置模板中所示):
repo_extra_packages: [ pgsql-main ,pgsql-time ,pgsql-gis ,pgsql-rag ,pgsql-fts ,pgsql-olap ,pgsql-feat ,pgsql-lang ,pgsql-type ,pgsql-util ,pgsql-func ,pgsql-admin ,pgsql-stat ,pgsql-sec ,pgsql-fdw ,pgsql-sim ,pgsql-etl]
或者,使用特定版本的别名来下载多个 PostgreSQL 版本的扩展:
repo_extra_packages: [
pg18-core,pg18-time,pg18-gis,pg18-rag,pg18-fts,pg18-olap,pg18-feat,pg18-lang,pg18-type,pg18-util,pg18-func,pg18-admin,pg18-stat,pg18-sec,pg18-fdw,pg18-sim,pg18-etl,
pg17-core,pg17-time,pg17-gis,pg17-rag,pg17-fts,pg17-olap,pg17-feat,pg17-lang,pg17-type,pg17-util,pg17-func,pg17-admin,pg17-stat,pg17-sec,pg17-fdw,pg17-sim,pg17-etl,
pg16-core,pg16-time,pg16-gis,pg16-rag,pg16-fts,pg16-olap,pg16-feat,pg16-lang,pg16-type,pg16-util,pg16-func,pg16-admin,pg16-stat,pg16-sec,pg16-fdw,pg16-sim,pg16-etl,
pg15-core,pg15-time,pg15-gis,pg15-rag,pg15-fts,pg15-olap,pg15-feat,pg15-lang,pg15-type,pg15-util,pg15-func,pg15-admin,pg15-stat,pg15-sec,pg15-fdw,pg15-sim,pg15-etl,
pg14-core,pg14-time,pg14-gis,pg14-rag,pg14-fts,pg14-olap,pg14-feat,pg14-lang,pg14-type,pg14-util,pg14-func,pg14-admin,pg14-stat,pg14-sec,pg14-fdw,pg14-sim,pg14-etl,
pg13-core,pg13-time,pg13-gis,pg13-rag,pg13-fts,pg13-olap,pg13-feat,pg13-lang,pg13-type,pg13-util,pg13-func,pg13-admin,pg13-stat,pg13-sec,pg13-fdw,pg13-sim,pg13-etl,
]
要向本地仓库添加新扩展,修改上述参数并运行:
./infra.yml -t repo_build # 重新下载并重建本地仓库
要在您环境中的所有其他节点上刷新仓库元数据,运行:
./node.yml -t node_repo # [可选] apt update / yum makecache
别名映射
PostgreSQL 拥有丰富的开源生态系统,在不同系统和架构中有众多包。
Pigsty 提供了一个抽象层,将 PostgreSQL 包分类为"别名",隐藏了系统、架构和 PG 版本之间的差异。
在 快速开始部分,我们使用了 pgsql-main 和 pgsql-core 等别名。这些别名根据您的系统和架构转换为特定的包名称。对于 EL 系统,pgsql-main 扩展为 postgresql$v* 内核包以及 pgvector_$v*、pg_repack_$v* 和 wal2json_$v* 扩展包。
pgsql-main: "postgresql$v* pg_repack_$v* wal2json_$v* pgvector_$v*"
$v 占位符被 pg_version 值(默认:18)替换以指向正确的版本。* 通配符扩展以包括所有包变体(例如 server、libs、contrib、devel)。Pigsty 自动处理这些细节。
可用包和别名的完整列表在 roles/node_id/vars/<os_package>.yml 中。以下是在所有支持的系统中可用的常用别名:
postgresql: "postgresql$v*"
pgsql-main: "postgresql$v* pg_repack_$v* wal2json_$v* pgvector_$v*"
pgsql-core: "postgresql$v postgresql$v-server postgresql$v-libs postgresql$v-contrib postgresql$v-plperl postgresql$v-plpython3 postgresql$v-pltcl postgresql$v-test postgresql$v-devel postgresql$v-llvmjit"
pgsql-simple: "postgresql$v postgresql$v-server postgresql$v-libs postgresql$v-contrib postgresql$v-plperl postgresql$v-plpython3 postgresql$v-pltcl"
pgsql-client: "postgresql$v"
pgsql-server: "postgresql$v-server postgresql$v-libs postgresql$v-contrib"
pgsql-devel: "postgresql$v-devel"
pgsql-basic: "pg_repack_$v* wal2json_$v* pgvector_$v*"
pgsql-time: "timescaledb-tsl_$v* timescaledb-toolkit_$v pg_timeseries_$v periods_$v* temporal_tables_$v* e-maj_$v table_version_$v pg_cron_$v* pg_task_$v* pg_later_$v pg_background_$v*"
pgsql-gis: "postgis35_$v* pgrouting_$v* pointcloud_$v* h3-pg_$v* q3c_$v* ogr_fdw_$v* geoip_$v pg_polyline_$v pg_geohash_$v*"
pgsql-rag: "pgvector_$v* vchord_$v pgvectorscale_$v pg_vectorize_$v pg_similarity_$v* smlar_$v* pg_summarize_$v pg_tiktoken_$v pg4ml_$v"
pgsql-fts: "pg_search_$v pgroonga_$v* pg_bigm_$v* zhparser_$v* pg_bestmatch_$v vchord_bm25_$v hunspell_cs_cz_$v hunspell_de_de_$v hunspell_en_us_$v hunspell_fr_$v hunspell_ne_np_$v hunspell_nl_nl_$v hunspell_nn_no_$v hunspell_ru_ru_$v hunspell_ru_ru_aot_$v"
pgsql-olap: "citus_$v* pg_analytics_$v pg_duckdb_$v* pg_mooncake_$v* duckdb_fdw_$v* pg_parquet_$v pg_fkpart_$v pg_partman_$v* plproxy_$v*" #hydra_$v* #pg_strom_$v*
pgsql-feat: "hll_$v* rum_$v pg_graphql_$v pg_jsonschema_$v jsquery_$v* pg_hint_plan_$v* hypopg_$v* index_advisor_$v pg_plan_filter_$v* imgsmlr_$v* pg_ivm_$v* pg_incremental_$v* pgmq_$v pgq_$v* pg_cardano_$v omnigres_$v" #apache-age_$v*
pgsql-lang: "pg_tle_$v* plv8_$v* pllua_$v* pldebugger_$v* plpgsql_check_$v* plprofiler_$v* plsh_$v* pljava_$v*" #plprql_$v #plr_$v* #pgtap_$v* #postgresql_faker_$v* #dbt2-pgsql-extensions*
pgsql-type: "prefix_$v* semver_$v* postgresql-unit_$v* pgpdf_$v* pglite_fusion_$v md5hash_$v* asn1oid_$v* pg_roaringbitmap_$v* pgfaceting_$v pgsphere_$v* pg_country_$v* pg_xenophile_$v pg_currency_$v* pgcollection_$v* pgmp_$v* numeral_$v* pg_rational_$v* pguint_$v* pg_uint128_$v* hashtypes_$v* ip4r_$v* pg_duration_$v* pg_uri_$v* pg_emailaddr_$v* acl_$v* timestamp9_$v* chkpass_$v*"
pgsql-util: "pgsql_gzip_$v* pg_bzip_$v* pg_zstd_$v* pgsql_http_$v* pg_net_$v* pg_curl_$v* pgjq_$v* pgjwt_$v pg_smtp_client_$v pg_html5_email_address_$v url_encode_$v* pgsql_tweaks_$v pg_extra_time_$v pgpcre_$v icu_ext_$v* pgqr_$v* pg_protobuf_$v pg_envvar_$v* floatfile_$v* pg_readme_$v ddl_historization_$v data_historization_$v pg_schedoc_$v pg_hashlib_$v pg_xxhash_$v* postgres_shacrypt_$v* cryptint_$v* pg_ecdsa_$v* pgsparql_$v"
pgsql-func: "pg_idkit_$v pg_uuidv7_$v* permuteseq_$v* pg_hashids_$v* sequential_uuids_$v topn_$v* quantile_$v* lower_quantile_$v* count_distinct_$v* omnisketch_$v* ddsketch_$v* vasco_$v* pgxicor_$v* tdigest_$v* first_last_agg_$v extra_window_functions_$v* floatvec_$v* aggs_for_vecs_$v* aggs_for_arrays_$v* pg_arraymath_$v* pg_math_$v* pg_random_$v* pg_base36_$v* pg_base62_$v* pg_base58_$v pg_financial_$v*"
pgsql-admin: "pg_repack_$v* pg_squeeze_$v* pg_dirtyread_$v* pgfincore_$v* pg_cooldown_$v* ddlx_$v pg_prioritize_$v* pg_readonly_$v* pg_upless_$v pg_permissions_$v pg_catcheck_$v* preprepare_$v* pgcozy_$v pg_orphaned_$v* pg_crash_$v* pg_cheat_funcs_$v* pg_fio_$v pg_savior_$v* safeupdate_$v* pg_drop_events_$v table_log_$v" #pg_checksums_$v* #pg_auto_failover_$v* #pgagent_$v* #pgpool-II-pgsql-extensions
pgsql-stat: "pg_profile_$v* pg_tracing_$v* pg_show_plans_$v* pg_stat_kcache_$v* pg_stat_monitor_$v* pg_qualstats_$v* pg_store_plans_$v* pg_track_settings_$v pg_wait_sampling_$v* system_stats_$v* pg_meta_$v pgnodemx_$v pg_sqlog_$v bgw_replstatus_$v* pgmeminfo_$v* toastinfo_$v* pg_explain_ui_$v pg_relusage_$v pagevis_$v powa_$v*"
pgsql-sec: "passwordcheck_cracklib_$v* supautils_$v* pgsodium_$v* vault_$v* pg_session_jwt_$v pg_anon_$v pgsmcrypto_$v pgaudit_$v* pgauditlogtofile_$v* pg_auth_mon_$v* credcheck_$v* pgcryptokey_$v pg_jobmon_$v logerrors_$v* login_hook_$v* set_user_$v* pg_snakeoil_$v* pgextwlist_$v* pg_auditor_$v sslutils_$v* noset_$v*" #pg_tde_$v*
pgsql-fdw: "wrappers_$v multicorn2_$v* odbc_fdw_$v* mysql_fdw_$v* tds_fdw_$v* sqlite_fdw_$v* pgbouncer_fdw_$v redis_fdw_$v* pg_redis_pubsub_$v* hdfs_fdw_$v* firebird_fdw_$v aws_s3_$v log_fdw_$v*" #jdbc_fdw_$v* #oracle_fdw_$v* #db2_fdw_$v* #mongo_fdw_$v* #kafka_fdw_$v
pgsql-sim: "documentdb_$v* orafce_$v pgtt_$v* session_variable_$v* pg_statement_rollback_$v* pg_dbms_metadata_$v pg_dbms_lock_$v pgmemcache_$v*" #pg_dbms_job_$v #wiltondb
pgsql-etl: "pglogical_$v* pglogical_ticker_$v* pgl_ddl_deploy_$v* pg_failover_slots_$v* db_migrator_$v wal2json_$v* postgres-decoderbufs_$v* decoder_raw_$v* mimeo_$v pg_fact_loader_$v* pg_bulkload_$v*" #wal2mongo_$v* #repmgr_$v*
使用这些别名时,$v 占位符会被来自 pg_version(默认:18)的 PostgreSQL 主版本号替换。
要为不同的 PostgreSQL 版本下载包,可以:
- 更改
pg_version 参数,或
- 通过将
pgsql- 前缀替换为 pg18-、pg17-、pg16- 等来使用特定版本的别名。
并非所有扩展在所有系统上都可用。某些扩展在别名中被注释掉,因为它们:
- 在特定系统上不可用
- 具有大量依赖项(如
pl/R)
- 依赖于商业软件(如
oracle_fdw)
- 在最新的 PG 18 中不可用但在早期版本中可用
如果需要,您仍然可以手动添加这些扩展。
4 - 安装
安装 PostgreSQL 扩展
Pigsty 依托标准的操作系统包管理器(yum/apt)来安装 PostgreSQL 扩展。
快速开始
在安装扩展时,Pigsty 使用与下载部分相同的别名映射。
为集群 pg-meta 安装在 pg_extensions 参数中明确指定的所有扩展:
all:
children:
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_extensions: # 要在此集群上安装的扩展
- timescaledb timescaledb_toolkit pg_timeseries periods temporal_tables emaj table_version pg_cron pg_task pg_later pg_background
- postgis pgrouting pointcloud pg_h3 q3c ogr_fdw geoip pg_polyline pg_geohash #mobilitydb
- pgvector vchord pgvectorscale pg_vectorize pg_similarity smlar pg_summarize pg_tiktoken pg4ml #pgml
- pg_search pgroonga pg_bigm zhparser pg_bestmatch vchord_bm25 hunspell
- citus hydra pg_analytics pg_duckdb pg_mooncake duckdb_fdw pg_parquet pg_fkpart pg_partman plproxy #pg_strom
- age hll rum pg_graphql pg_jsonschema jsquery pg_hint_plan hypopg index_advisor pg_plan_filter imgsmlr pg_ivm pg_incremental pgmq pgq pg_cardano omnigres #rdkit
- pg_tle plv8 pllua plprql pldebugger plpgsql_check plprofiler plsh pljava #plr #pgtap #faker #dbt2
- pg_prefix pg_semver pgunit pgpdf pglite_fusion md5hash asn1oid roaringbitmap pgfaceting pgsphere pg_country pg_xenophile pg_currency pg_collection pgmp numeral pg_rational pguint pg_uint128 hashtypes ip4r pg_uri pgemailaddr pg_acl timestamp9 chkpass #pg_duration #debversion #pg_rrule
- pg_gzip pg_bzip pg_zstd pg_http pg_net pg_curl pgjq pgjwt pg_smtp_client pg_html5_email_address url_encode pgsql_tweaks pg_extra_time pgpcre icu_ext pgqr pg_protobuf envvar floatfile pg_readme ddl_historization data_historization pg_schedoc pg_hashlib pg_xxhash shacrypt cryptint pg_ecdsa pgsparql
- pg_idkit pg_uuidv7 permuteseq pg_hashids sequential_uuids topn quantile lower_quantile count_distinct omnisketch ddsketch vasco pgxicor tdigest first_last_agg extra_window_functions floatvec aggs_for_vecs aggs_for_arrays pg_arraymath pg_math pg_random pg_base36 pg_base62 pg_base58 pg_financial
- pg_repack pg_squeeze pg_dirtyread pgfincore pg_cooldown pg_ddlx pg_prioritize pg_checksums pg_readonly pg_upless pg_permissions pgautofailover pg_catcheck preprepare pgcozy pg_orphaned pg_crash pg_cheat_funcs pg_fio pg_savior safeupdate pg_drop_events table_log #pgagent #pgpool
- pg_profile pg_tracing pg_show_plans pg_stat_kcache pg_stat_monitor pg_qualstats pg_store_plans pg_track_settings pg_wait_sampling system_stats pg_meta pgnodemx pg_sqlog bgw_replstatus pgmeminfo toastinfo pg_explain_ui pg_relusage pagevis powa
- passwordcheck supautils pgsodium pg_vault pg_session_jwt pg_anon pg_tde pgsmcrypto pgaudit pgauditlogtofile pg_auth_mon credcheck pgcryptokey pg_jobmon logerrors login_hook set_user pg_snakeoil pgextwlist pg_auditor sslutils pg_noset
- wrappers multicorn odbc_fdw jdbc_fdw mysql_fdw tds_fdw sqlite_fdw pgbouncer_fdw mongo_fdw redis_fdw pg_redis_pubsub kafka_fdw hdfs_fdw firebird_fdw aws_s3 log_fdw #oracle_fdw #db2_fdw
- documentdb orafce pgtt session_variable pg_statement_rollback pg_dbms_metadata pg_dbms_lock pgmemcache #pg_dbms_job #wiltondb
- pglogical pglogical_ticker pgl_ddl_deploy pg_failover_slots db_migrator wal2json wal2mongo decoderbufs decoder_raw mimeo pg_fact_loader pg_bulkload #repmgr
或者通过类别别名全局安装所有扩展:
all:
vars:
pg_version: 18 # v3.7 的默认版本,因此 pgsql-main 等同于 pg18-main
pg_extensions: [ pgsql-main ,pgsql-time ,pgsql-gis ,pgsql-rag ,pgsql-fts ,pgsql-olap ,pgsql-feat ,pgsql-lang ,pgsql-type ,pgsql-util ,pgsql-func ,pgsql-admin ,pgsql-stat ,pgsql-sec ,pgsql-fdw ,pgsql-sim ,pgsql-etl]
您也可以在这些别名中明确指定 PG 主版本:
all:
vars:
pg_extensions: [pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ] #,pg17-olap]
同时安装所有扩展是可行的(除了在 olap 类别中的两个冲突)但不推荐。只需在 pg_extensions 参数中明确指定您需要的扩展。
在 PGSQL 集群初始化期间,Pigsty 将自动安装在 pg_packages 和 pg_extensions 中指定的包(和别名)。
这两个参数都可以用来安装 PostgreSQL 相关的包。通常,pg_packages 用于全局指定应在环境中所有 PostgreSQL 集群上安装的包:如 PostgreSQL 内核、高可用代理(如 Patroni)、连接池(pgBouncer)、监控(pgExporter)等。
默认情况下,Pigsty 还在这里指定了 3 个重要扩展:pgvector、pg_repack 和 wal2json,分别用于向量搜索、膨胀管理和 CDC 变更提取。
同时,pg_extensions 通常用于为特定集群指定扩展。默认值是一个空列表,表示默认不会安装其他扩展。
pg_packages: # 要安装的 pg 包,可以使用别名,状态=present
- postgresql
- wal2json pg_repack pgvector
- patroni pgbouncer pgbackrest pg_exporter pgbadger vip-manager
pg_extensions: [] # 要安装的 pg 扩展,可以使用别名,状态=latest
一个重要的区别:通过 pg_packages 安装的包只确保存在,而通过 pg_extensions 安装的包会自动升级到最新可用版本。
当使用本地软件仓库时,这个区别并不重要。但是,当使用上游互联网仓库时,请仔细考虑这一点,并将您不希望自动升级的扩展移至 pg_packages。
安装
在 pg_extensions(和 pg_packages)中预定义的扩展将在集群置备期间安装。
要在已置备的 PostgreSQL 集群上安装新扩展:
首先,将扩展添加到 pg_extensions,然后执行 playbook 子任务:
./pgsql.yml -t pg_extension # 安装在 pg_extensions 中指定的扩展
注意,在 pg_extension 任务中指定的扩展插件默认将升级到您当前环境中的最新可用版本。
仓库
要安装扩展,您需要确保满足以下条件之一:
- 本地仓库:您已配置使用 Pigsty 的本地仓库,并且扩展已经下载到本地仓库。
- 在线仓库:您已在目标节点上直接配置了上游互联网仓库,并且这些节点上有互联网访问。
对于生产环境,我们建议使用 Pigsty 的本地软件仓库来统一管理和安装扩展:首先将扩展下载到本地仓库,然后从那里安装它们。
这确保了您环境中扩展版本的一致性,并防止数据库节点直接访问互联网。从本地仓库安装时您无需做任何事情,只需确保它们已下载到本地仓库。
对于开发环境,您可以选择直接使用上游互联网仓库以便于操作。使用以下命令在目标集群上添加互联网仓库并直接安装扩展:
./node.yml -l <cls> -t node_repo -e node_repo_modules=local,node,pgsql # 在目标节点上启用互联网仓库
./pgsql.yml -l <cls> -t pg_extension # 使用本地+互联网上游仓库安装扩展
包别名
在安装扩展时,用户可以使用扩展别名来指定扩展。
别名将被转换为当前活跃的 PG 主版本和操作系统环境。
并通过别名转换机制转换为相应的 RPM/DEB 包名称。
注意事项
- 有两个已知冲突:
pgaudit 在 el 系统的 pg 15- 版本中有不同的命名模式:pg16+ = pgaudit,pg15=pgaudit17,pg14=pgaudit16,pg13=pgaudit15,pg12=pgaudit14
postgis 在 el 包名中有自己的版本:默认为 postgis35,遗留 el7 为 postgis33
5 - 配置
预加载扩展并配置扩展参数
虽然大多数用 SQL 编写的 PostgreSQL 扩展可以使用 CREATE EXTENSION 直接启用,但一些使用特殊 postgres 钩子的扩展在使用前需要额外的步骤来预加载它们。
预加载
大多数扩展都有一个或多个对应的动态库(.so、.dylib、.dll),其中一些在使用前需要预加载。
尝试在没有正确预加载的情况下 CREATE 这些扩展将导致错误。
错误配置的预加载库可能导致数据库重启/启动失败。
一些扩展可以在没有预加载的情况下部分工作,这意味着扩展功能的一部分可以直接使用,其余功能在预加载后可用。
要预加载扩展,将其添加到 shared_preload_libraries 并重启数据库服务器。
扩展目录 提供了需要动态预加载的扩展的完整列表。
要在新 postgres 集群上配置预加载,可以使用 pg_libs 参数。
它将在 postgres 集群引导期间填充到 shared_preload_libraries 参数中。
示例:设置 Supabase 扩展预加载
此示例展示如何使用 pg_libs 参数指定预加载的扩展。
all:
children:
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_libs: 'timescaledb, plpgsql, plpgsql_check, pg_cron, pg_net, pg_stat_statements, auto_explain, pg_tle, plan_filter'
shared_preload_libraries 是一个以逗号分隔的扩展列表。
请注意,这仅在集群创建之前有效。之后,
您必须配置集群来更改现有集群上的 shared_preload_libraries 参数。(使用 patronictl、ALTER SYSTEM 等…)
pg edit-config pg-meta --force -p shared_preload_libraries='timescaledb, pg_stat_statements, auto_explain'
pg restart pg-meta # 重启以应用更改
如果您想手动配置预加载,您可以自己更改 postgresql.conf
默认值
pg_libs 的默认值是 pg_stat_statements, auto_explain,
它默认预加载这两个 Contrib 扩展,这两个扩展提供基本的可观测性:
注意事项
预加载库是逐个加载的,因此 shared_preload_libraries 中扩展的顺序很重要,
以下是一些需要遵循的已知规则:
参数
一些扩展有可配置的参数,您可以在不同的地方管理它们。
有关详细信息,请查阅每个扩展的官方文档。
6 - 创建
创建和启用 PostgreSQL 扩展
快速开始
您可以使用 CREATE EXTENSION 语句启用(创建)扩展:
CREATE EXTENSION vector; -- 无需显式加载
CREATE EXTENSION timescaledb; -- 需要显式加载
扩展需要首先安装,一些扩展还需要在使用前进行预加载。
一些扩展依赖于其他扩展。
在这种情况下,您可以先安装依赖项
或使用 CASCADE 子句一次安装所有依赖项。
CREATE EXTENSION documentdb CASCADE; -- 创建 documentdb 扩展及其所有依赖项
您也可以使用 Pigsty 配置扩展,它会自动为您创建扩展。
扩展(数据库逻辑对象)在逻辑上是 PostgreSQL 数据库 的一部分。
在 Pigsty 中,您可以使用 pg_databases 参数指定在数据库中创建哪些扩展。
pg_databases:
- { name: meta ,extensions: [ vector, postgis, timescaledb ] }
但您可以使用 object 格式显式指定扩展详细信息,比如在特定模式中创建它们。
或安装特定版本。这里是一个完整的示例(自托管 supabase):
pg_databases:
- name: postgres
baseline: supabase.sql
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions: # 在 postgres 数据库中启用的扩展
- { name: pgcrypto ,schema: extensions } # 加密函数
- { name: pg_net ,schema: extensions } # 异步 HTTP
- { name: pgjwt ,schema: extensions } # postgres 的 json web token API
- { name: uuid-ossp ,schema: extensions } # 生成通用唯一标识符 (UUID)
- { name: pgsodium } # pgsodium 是 Postgres 的现代密码学库
- { name: supabase_vault } # Supabase Vault 扩展
- { name: pg_graphql } # pg_graphql:GraphQL 支持
- { name: pg_jsonschema } # pg_jsonschema:验证 json schema
- { name: wrappers } # wrappers:FDW 集合
- { name: http } # http:允许在数据库内检索网页
- { name: pg_cron } # pg_cron:PostgreSQL 的作业调度器
- { name: timescaledb } # timescaledb:为时间序列数据启用可扩展插入和复杂查询
- { name: pg_tle } # pg_tle:PostgreSQL 的受信任语言扩展
- { name: vector } # pgvector:向量相似性搜索
- { name: pgmq } # pgmq:类似 AWS SQS 和 RSMQ 的轻量级消息队列
定义扩展
extensions 字段是要在数据库中创建的扩展(名称或对象)列表。
它将在 dbsu 的 search_path 中的第一个模式下创建(通常是 public 模式)。
这里,数据库对象中的 extensions 是一个列表,其中每个元素可以是:
- 表示扩展名称的简单字符串,如
vector
- 或者,可以使用包含以下字段的字典:
name:扩展名称,必需,注意它可能与扩展包名称不同。
schema:安装扩展的模式,可选,默认为当前 dbsu search_path 中的第一个模式,通常是默认的 public。
version:指定扩展版本,可选,默认为最新版本,很少使用。
如果数据库尚不存在,这里定义的扩展将在通过 Pigsty 创建集群或创建数据库时自动创建。
重新创建具有非平凡基线模式的数据库可能很危险(如果您在那里放置一些 DROP)
因此,对于现有集群/数据库,建议使用您自己的模式迁移工具来管理扩展。(pgadmin、psql、bytebase、flyway、sqlitch…)
但将它们列在配置清单中用于记录保存目的是有帮助的。(这样如果您想分叉这个集群,它包含这些扩展)
默认扩展
Pigsty 默认创建一些内置扩展和一个特殊的 pg_repack。
这些扩展由 pg_default_extensions 定义,默认在 template1 数据库和 postgres 数据库中创建。
新创建的数据库将从 template1 继承这些扩展,因此您无需再次创建它们。
pg_default_extensions:
- { name: pg_stat_statements ,schema: monitor }
- { name: pgstattuple ,schema: monitor }
- { name: pg_buffercache ,schema: monitor }
- { name: pageinspect ,schema: monitor }
- { name: pg_prewarm ,schema: monitor }
- { name: pg_visibility ,schema: monitor }
- { name: pg_freespacemap ,schema: monitor }
- { name: postgres_fdw ,schema: public }
- { name: file_fdw ,schema: public }
- { name: btree_gist ,schema: public }
- { name: btree_gin ,schema: public }
- { name: pg_trgm ,schema: public }
- { name: intagg ,schema: public }
- { name: intarray ,schema: public }
- { name: pg_repack } # <-- 默认创建的唯一第三方扩展
由 pg_default_schemas 定义的一个额外默认模式 monitor 也默认创建。
它用于包含监控相关的扩展、表、函数和视图。
在 Pigsty 中默认可用的有三个第三方扩展:
pg_repack 扩展是在线维护膨胀表的重要工具。
vector 是用于 RAG 的非常流行的扩展,
它默认安装(在 pgsql-main 别名中)并在大多数配置模板的占位符 meta 数据库中创建。
wal2json 是用于变更数据捕获(CDC)的另一个重要扩展。它默认安装,但它是一个无 DDL 的扩展,
因此您无需显式 CREATE 它。
无 DDL 扩展
无 DDL 扩展不需要 CREATE EXTENSION 命令即可工作
PostgreSQL 扩展通常由三部分组成:必需的控制文件、可选的 SQL 文件和可选的库。
如果扩展没有 SQL 文件,则不需要 CREATE EXTENSION 命令。
由于 SQL / LIB 文件是可选的,有四种可能的扩展类型组合:
7 - 更新
如何将 PostgreSQL 扩展更新到新版本
要更新现有扩展,您需要首先使用操作系统的包管理器更新 RPM/DEB 包,
然后在 PostgreSQL 中使用 ALTER EXTENSION ... UPDATE 将扩展更改为新版本。
您可以使用以下命令升级扩展包
pig ext update extname...
./pgsql.yml -t pg_ext # -l cls
在 pg_extensions 中列出的所有扩展将在 pgsql.yml playbook 执行期间升级。
升级扩展
在 pg_extensions 中列出的扩展(包别名)将通过 pgsql.yml 的 pg_ext 子任务升级:
此 playbook 将自动安装您当前环境中可用的最新版本的扩展 RPM/DEB 包。
(从构建的本地仓库或直接通过互联网)。
您也可以直接使用 Linux 系统的 yum/apt upgrade 命令升级扩展,但您需要指定完整的包名称:
yum upgrade extname...
apt upgrade extname...
Pigsty 的 pig CLI 也可以帮助您完成此操作,无需指定完整包名称的负担:
更改扩展
执行 ALTER EXTENSION ... UPDATE SQL 命令将扩展更新到新版本:
ALTER EXTENSION name UPDATE [ TO new_version ]
如果省略 TO new_version 子句,扩展将更新到可用的最新版本。
8 - 移除
如何移除 PostgreSQL 扩展
移除扩展
要卸载扩展,您通常需要运行 DROP EXTENSION SQL 语句:
DROP EXTENSION "<extname>";
如果其他扩展或数据库对象依赖于此扩展,您需要先移除这些依赖项才能卸载扩展。
或者使用 CASCADE 选项一次性移除所有依赖:
DROP EXTENSION "<extname>" CASCADE;
Warning
CASCADE 选项将删除所有依赖于此扩展的对象,
包括数据库对象、函数、视图等。请谨慎使用!
某些扩展没有 DDL,这些扩展不需要 DROP EXTENSION 语句来卸载。
相反,您可以简单地从 shared_preload_libraries(如果已配置)中移除扩展并卸载包。
请参考无 DDL 扩展部分了解更多详细信息。
移除加载
如果您使用的扩展需要动态加载(修改 shared_preload_libraries 参数),您需要首先重新配置 shared_preload_libraries 参数。
从 shared_preload_libraries 中移除扩展名称,并重启数据库集群以使更改生效。
对于需要动态加载的扩展,请参考需要加载的扩展列表。
卸载包
在从集群中的所有数据库中移除扩展(逻辑对象)后,您可以安全地卸载扩展的软件包。Ansible 命令可以帮助您方便地执行此操作:
ansible <cls> -m package -a "name=<extname> state=absent"
您也可以使用 pig,或直接使用 apt/yum 命令来卸载。
如果您不知道扩展包名称,可以参考扩展列表或查看在 roles/node_id/vars 中定义的扩展包名称映射。