跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

扩展

利用 PostgreSQL 扩展的协同超能力

Pigsty 允许您通过三样东西来利用 Postgres 扩展生态系统的协同超能力:目录、仓库和 pig。

扩展目录
    完整的 <span class="text-lg font-black text-emerald-500">437</span> 可用 PostgreSQL 扩展列表
软件仓库
    提供 PostgreSQL 扩展的 APT/YUM 仓库
包管理器
    PostgreSQL 和扩展缺失的包管理器
快速开始
    如何获取、安装、配置、管理这些扩展?

v3.7.0 扩展目录共收录 437 个 PostgreSQL 扩展,且 PostgreSQL 18 是默认版本。

下表是归档中保留的 PG13–17 兼容性快照,并未记录最终 PG18 分项统计;PG18 请以 v3.7.0 软件包别名和发布说明为准。

发行版 全部 PGDG PIGSTY CONTRIB 其他 缺失 PG17 PG16 PG15 PG14 PG13
EL 417 119 227 71 0 6 399 407 410 394 368
Debian 410 103 236 71 0 13 397 400 403 391 363

ecosystem

时间 地理 向量 搜索 分析 特性 语言 类型 工具 函数 管理 统计 安全 外部 兼容 数据

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


使用方法

    使用包别名下载和安装扩展
下载
    从 PGDG / Pigsty 仓库下载扩展
安装
    安装 Postgres 扩展包
配置
    配置扩展并设置预加载
下载
    从 PGDG / Pigsty 仓库下载扩展
安装
    安装 Postgres 扩展包
配置
    配置扩展并设置预加载
创建
    在数据库中创建 Postgres 扩展
更新
    升级 Postgres 扩展
移除
    卸载 Postgres 扩展

索引

类别 扩展
时间 emaj periods pg_background pg_cron pg_later pg_task table_version temporal_tables timescaledb timescaledb_toolkit timeseries
地理 address_standardizer address_standardizer_data_us earthdistance geoip h3 h3_postgis mobilitydb ogr_fdw pg_geohash pg_polyline pgrouting pointcloud pointcloud_postgis postgis postgis_raster postgis_sfcgal postgis_tiger_geocoder postgis_topology q3c tzf
向量 pg4ml pg_similarity pg_summarize pg_tiktoken pgml smlar vchord vector vectorize vectorscale
搜索 fuzzystrmatch hunspell_cs_cz hunspell_de_de hunspell_en_us hunspell_fr hunspell_ne_np hunspell_nl_nl hunspell_nn_no hunspell_pt_pt hunspell_ru_ru hunspell_ru_ru_aot pg_bestmatch pg_bigm pg_search pg_tokenizer pg_trgm pgroonga pgroonga_database vchord_bm25 zhparser
分析 citus citus_columnar columnar duckdb_fdw pg_analytics pg_duckdb pg_fkpart pg_mooncake pg_parquet pg_partman pg_strom plproxy tablefunc
特性 age bloom hll hypopg imgsmlr index_advisor jsquery omni omni_auth omni_aws omni_cloudevents omni_containers omni_credentials omni_email omni_http omni_httpc omni_httpd omni_id omni_json omni_kube omni_ledger omni_manifest omni_mimetypes omni_os omni_polyfill omni_python omni_regex omni_rest omni_schema omni_seq omni_service omni_session omni_sql omni_sqlite omni_test omni_txn omni_types omni_var omni_vfs omni_vfs_types_v1 omni_web omni_worker omni_xml omni_yaml orioledb pg_cardano pg_graphql pg_hint_plan pg_incremental pg_ivm pg_jsonschema pgmq pgq plan_filter rdkit rum
语言 bool_plperl bool_plperlu dbt2 faker hstore_pllua hstore_plluau hstore_plperl hstore_plperlu hstore_plpython3u jsonb_plperl jsonb_plperlu jsonb_plpython3u ltree_plpython3u pg_tle pgtap pldbgapi pljava pllua plluau plperl plperlu plpgsql plpgsql_check plprofiler plprql plpython3u plr plsh pltcl pltclu plv8
类型 acl asn1oid chkpass citext collection country cube currency debversion emailaddr hashtypes hstore ip4r isn l10n_table_dependent_extension ltree md5hash numeral pg_duration pg_rational pg_rrule pg_sphere pg_xenophile pgfaceting pglite_fusion pgmp pgpdf prefix roaringbitmap seg semver timestamp9 uint uint128 unit uri xml2
工具 bzip cryptint data_historization ddl_historization envvar floatfile gzip hashlib http icu_ext pg_curl pg_extra_time pg_html5_email_address pg_net pg_protobuf pg_readme pg_readme_test_extension pg_render pg_smtp_client pgjq pgjwt pgpcre pgqr pgsql_tweaks pguecc schedoc shacrypt sparql url_encode xxhash zstd
函数 aggs_for_arrays aggs_for_vecs arraymath autoinc base36 base62 btree_gin btree_gist convert count_distinct ddsketch dict_int dict_xsyn extra_window_functions financial first_last_agg floatvec insert_username intagg intarray lower_quantile moddatetime omnisketch permuteseq pg_base58 pg_hashids pg_idkit pg_math pg_uuidv7 pgx_ulid quantile random refint sequential_uuids tcn tdigest topn tsm_system_rows tsm_system_time unaccent uuid-ossp vasco xicor
管理 adminpack amcheck basebackup_to_shell basic_archive ddlx fio lo old_snapshot pg_catcheck pg_cheat_funcs pg_checksums pg_cooldown pg_crash pg_dirtyread pg_drop_events pg_orphaned pg_permissions pg_prewarm pg_readonly pg_repack pg_savior pg_squeeze pg_surgery pg_upless pgagent pgautofailover pgcozy pgdd pgfincore pgpool_adm pgpool_recovery pgpool_regclass pre_prepare prioritize safeupdate table_log
统计 auto_explain bgw_replstatus explain_ui meta pageinspect pagevis pg_buffercache pg_freespacemap pg_logicalinspect pg_overexplain pg_proctab pg_profile pg_qualstats pg_relusage pg_show_plans pg_sqlog pg_stat_kcache pg_stat_monitor pg_stat_statements pg_store_plans pg_tracing pg_track_settings pg_visibility pg_wait_sampling pg_walinspect pgmeminfo pgnodemx pgrowlocks pgsentinel pgstattuple powa sslinfo system_stats toastinfo
安全 anon auth_delay credcheck logerrors login_hook noset passwordcheck passwordcheck_cracklib pg_auditor pg_auth_mon pg_jobmon pg_session_jwt pg_snakeoil pg_tde pgaudit pgauditlogtofile pgcrypto pgcryptokey pgextwlist pgsmcrypto pgsodium sepgsql set_user sslutils supabase_vault supautils
外部 aws_s3 db2_fdw dblink file_fdw firebird_fdw hdfs_fdw jdbc_fdw kafka_fdw log_fdw mongo_fdw multicorn mysql_fdw odbc_fdw oracle_fdw pgbouncer_fdw pgspider_ext postgres_fdw redis redis_fdw sqlite_fdw tds_fdw wrappers
兼容 babelfishpg_common babelfishpg_money babelfishpg_tds babelfishpg_tsql documentdb documentdb_core documentdb_distributed orafce pg_dbms_job pg_dbms_lock pg_dbms_metadata pg_statement_rollback pgmemcache pgtt session_variable spat
数据 db_migrator decoder_raw decoderbufs mimeo pg_bulkload pg_fact_loader pg_failover_slots pgactive pgl_ddl_deploy pglogical pglogical_origin pglogical_ticker pgoutput repmgr test_decoding wal2json wal2mongo

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 将为您下载、安装、配置和启用扩展。 此示例使 postgispgvectortimescaledb 开箱即用:

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 - 软件包

扩展包和别名

管理扩展和包并不简单,这里有两个常见的扩展示例:

实体 示例 pgvector 示例 postgis
扩展 vector postgis, postgis_topology, postgis_raster,…
pgvector postgis
操作系统包 pgvector_17 postgresql-16-postgis-3
RPM/DEB pgvector_17_0.8.0-1PGDG.rhel8.x86_64.rpm postgresql-17-postgis-3_3.5.2+dfsg-1.pgdg22.04+1_amd64.deb

要以最小的努力安装正确的 RPM / DEB,我们需要使用抽象层:包别名。 因此您可以通过指定"标准化"名称(如 pgvectorpostgis)来安装这些扩展。 无需了解 PG 和操作系统版本、架构、扩展版本以及任何其他详细信息。

包别名 pkg 用于扩展下载和安装,但在数据库中 CREATE EXTENSION 时您必须使用扩展名称 ext(如 meta 数据库中的 vector)。 请注意,某些扩展需要显式预加载,如上述示例中的 timescaledb

此外,所有扩展都被分类为 16 个主要类别,我们也为整个扩展类别提供别名 这样您就可以批量下载和安装它们,例如:

将 17 替换为 16,15,14,13,...
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 类别中,citushydra 冲突,pg_duckdbpg_mooncake 冲突。 所以您可以下载所有扩展,但要一次安装一个。

3 - 下载

下载 PostgreSQL 扩展

在 Pigsty 中,下载和安装扩展是两个独立的步骤。在 INFRA 模块安装期间,Pigsty 将所有必需的软件下载到本地机器上,并为整个部署创建本地 YUM/APT 仓库。

这种方法加速了安装过程,消除了冗余下载,移除了数据库节点访问互联网的需求,减少了网络流量,提高了交付可靠性,并确保了环境中版本的一致性——这些都是生产部署的最佳实践。

对于开发环境,直接从互联网仓库安装扩展也是可以接受的


快速开始

repo_packagesrepo_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-mainpgsql-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_packagespg_extensions 中指定的包(和别名)。

这两个参数都可以用来安装 PostgreSQL 相关的包。通常,pg_packages 用于全局指定应在环境中所有 PostgreSQL 集群上安装的包:如 PostgreSQL 内核、高可用代理(如 Patroni)、连接池(pgBouncer)、监控(pgExporter)等。

默认情况下,Pigsty 还在这里指定了 3 个重要扩展:pgvectorpg_repackwal2json,分别用于向量搜索、膨胀管理和 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 参数。(使用 patronictlALTER SYSTEM 等…)

将 timescaledb 添加到 shared_preload_libraries
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 中扩展的顺序很重要, 以下是一些需要遵循的已知规则:

  • 对于 STAT 扩展,在 pg_stat_statements 之后添加它们以确保使用相同的 query_id。
  • timescaledbcitus 应该放在 shared_preload_libraries开头
  • 如果您同时使用 citustimescaledb,请将 citus 放在 timescaledb 之前。
  • 对于 documentdb,使用 pg_documentdbpg_documentdb_core 作为库名称。
  • pg_search 在 PostgreSQL 17 及更高版本中不需要预加载,但早期版本需要。

参数

一些扩展有可配置的参数,您可以在不同的地方管理它们。

有关详细信息,请查阅每个扩展的官方文档。

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 在线膨胀控制工具 pg_default_extensions
wal2json JSON 格式的变更数据捕获 无 DDL 扩展,安装意味着可用
vector 向量数据类型和索引 pg_databases 中作为示例

pg_repack 扩展是在线维护膨胀表的重要工具。

vector 是用于 RAG 的非常流行的扩展, 它默认安装(在 pgsql-main 别名中)并在大多数配置模板的占位符 meta 数据库中创建。

wal2json 是用于变更数据捕获(CDC)的另一个重要扩展。它默认安装,但它是一个无 DDL 的扩展, 因此您无需显式 CREATE 它。


无 DDL 扩展

无 DDL 扩展不需要 CREATE EXTENSION 命令即可工作

PostgreSQL 扩展通常由三部分组成:必需的控制文件、可选的 SQL 文件和可选的库。 如果扩展没有 SQL 文件,则不需要 CREATE EXTENSION 命令。

组件 描述 必需
控制文件 关键元数据,名称、依赖项、模式、版本… 必需
SQL 文件 SQL DDL 语句、类型、函数等… 可选
库文件 二进制共享库(.so.dylib.dll 可选

由于 SQL / LIB 文件是可选的,有四种可能的扩展类型组合:

LOAD / DDL 需要 CREATE EXTENSION 不需要 CREATE EXTENSION
需要 LOAD 使用钩子的扩展 无头扩展
不需要 LOAD 不使用钩子的扩展 逻辑解码输出插件

7 - 更新

如何将 PostgreSQL 扩展更新到新版本

要更新现有扩展,您需要首先使用操作系统的包管理器更新 RPM/DEB 包, 然后在 PostgreSQL 中使用 ALTER EXTENSION ... UPDATE 将扩展更改为新版本。

您可以使用以下命令升级扩展包

pig ext update extname...
yum upgrade extname...
apt upgrade extname...
./pgsql.yml -t pg_ext   # -l cls

pg_extensions 中列出的所有扩展将在 pgsql.yml playbook 执行期间升级。


升级扩展

pg_extensions 中列出的扩展(包别名)将通过 pgsql.ymlpg_ext 子任务升级:

~/pigsty
./pgsql.yml -t pg_ext

此 playbook 将自动安装您当前环境中可用的最新版本的扩展 RPM/DEB 包。 (从构建的本地仓库或直接通过互联网)。 您也可以直接使用 Linux 系统的 yum/apt upgrade 命令升级扩展,但您需要指定完整的包名称:

yum upgrade extname...
apt upgrade extname...

Pigsty 的 pig CLI 也可以帮助您完成此操作,无需指定完整包名称的负担:

pig ext update ext|pkg

更改扩展

执行 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 中定义的扩展包名称映射。