This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

安装使用

如何在 Pigsty 中安装,启用,更新,卸载 PostgreSQL 扩展插件,使用 Pigsty 插件仓库。

1 - 快速上手

如何在 Pigsty 中,通过开箱即用的方式安装并启用 PostgreSQL 扩展插件?

Pigsty 让您可以直接在 PGSQL 集群中,通过声明式的方式启用 PostgreSQL 插件。


概览

通常想要在一套 PostgreSQL 集群中使用插件,涉及到 下载安装加载启用 四个核心问题:

  • 怎样下载扩展repo_upstream & repo_packages

    在 Pigsty 默认在线安装时,已经默认下载了当前首要PG大版本(16)可用的所有扩展,如果不需要添加额外或者冷门扩展,通常都不需要您操心 repo_upstreamrepo_packages 以及扩展下载相关的问题。

  • 安装哪些扩展pg_extensions & pg_packages

    在 Pigsty 配置模板中的样例集群中,已经提供了完整可用的扩展清单,您只需要将想要 安装 的扩展,添加到 pg_packagespg_extensions 中即可。

  • 加载哪些扩展pg_libs

    一小部分使用了 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_extensionspg_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:DBUser.Supa@10.10.10.10: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_netpg_cron;此外,pgsodiumpg_cron 扩展所必须的配置参数,也通过 pg_parameters 预先指定; 接下来,这些扩展在 pg_databases.extensions 中被依次创建到指定的/或默认的 Schema 中,正式启用。

最后,这样一个开箱即用,可以直接供无状态 Supabase 容器使用的高可用 PostgreSQL 集群,就能在一行 ./pgsql.yml 命令中被完整拉起,开箱即用。

2 - 下载扩展

如何下载新的扩展插件,并将其添加至 Pigsty 中?

在 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 - 扩展仓库

如何在 EL/Debian/Ubuntu 及其兼容操作系统上,使用 Pigsty 提供的补充插件仓库?

YUM仓库

Pigsty 目前针对 EL 系统提供了补充插件仓库,在官方 PGDG YUM 仓库的基础上提供了 65 个额外的 RPM 插件。

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 仓库只收录那些 不存在于 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 仓库只收录那些 不存在于 PGDG Yum 仓库的扩展,一旦某个扩展进入 PGDG YUM 仓库,Pigsty Yum 仓库将移除此扩展或与 PGDG 仓库保持一致。

4 - 安装扩展

如何从 Pigsty 本地软件源,或直接从上游互联网软件源安装 PostgreSQL 扩展插件?

Pigsty 使用操作系统标准的包管理器(yum/apt)来安装 PostgreSQL 扩展插件。


扩展安装相关参数

您可以在以下变量中指定要安装哪些扩展,两者的效果基本相同:

通常 pg_packages 用于在全局指定整个环境中所有 PostgreSQL 集群都需要统一安装的软件包: 例如 PostgreSQL 内核,高可用组建 Patroni,连接池 pgBouncer,监控 pgExporter 等。 Pigsty 默认也会在这里指定安装两个必选扩展: pg_repackwal2json 用于膨胀治理和 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_packagespg_extensions 中指定的扩展插件。


在已有集群上安装扩展

对于一个已经完成置备初始化的 PostgreSQL 集群,您可以首先将所需的扩展添加至 pg_packagespg_extensions 中,然后通过以下命令安装扩展:

./pgsql.yml -t pg_extension  # 安装 pg_extensions 中指定的扩展插件

扩展名翻译机制

在 Pigsty 中,您可以在 pg_packagespg_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 - 加载扩展

使用了 HOOK 的扩展插件需要显式加载,并重启数据库服务器生效。

安装 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_statementsauto_explain,这两个扩展对于优化数据库性能非常实用,强烈建议安装。

6 - 启用扩展

如何通过 CREATE EXTENSION 在 PostgreSQL 数据库中真正启用扩展?

列出可用扩展

安装 PostgreSQL 扩展后,您可以在 PostgreSQL 的 pg_available_extensions 视图中看到它们。但想要实际启用扩展,通常还需要额外的步骤:

  1. 一部分扩展要求被添加到 shared_preload_libraries 中动态加载,例如 timescaledbcitus 等。
  2. 大部分扩展都需要通过 SQL 语句:CREATE EXTENSION <name>; 启用,极少量扩展不需要,例如 wal2json
  • 修改 shared_preload_libraries
    • 在数据库集群初始化前,可以通过 pg_libs 参数手工预先指定;
    • 当数据库已经初始化完毕后,您可以修改集群配置,直接修改 shared_preload_libraries 参数并应用(无需重启)。
    • 需要动态加载的典型插件:citus, timescaledb, pg_cron, pg_net, pg_tle
  • 执行 CREATE EXTENSION
    • 在数据库集群初始化前,可以在 pg_databases.extensions 列表中指定。
    • 当数据库已经初始化完毕后,您可以直接连接数据库执行此 SQL 命令,或使用其他模式变更工具管理扩展。

从原理上讲:PostgreSQL 的扩展通常由 Control文件(元数据,一定存在),SQL文件(SQL语句,可选),So文件(二进制动态连接库,可选)三部分组成。 提供 .so 文件的扩展有可能需要添加到 shared_preload_libraries 才能生效,例如 citustimescaledb,但也有许多扩展不用,例如 postgispgvector。 不通过 SQL 接口对外服务的扩展不需要执行 CREATE EXTENSION,例如提供 CDC 抽取能力的 wal2json 扩展。

在您希望启用扩展的数据库中执行 CREATE EXTENSION SQL 语句,即可完成扩展的创建:

CREATE EXTENSION vector;  -- 安装向量数据库扩展
CREATE EXTENSION hydra;   -- 安装列存数据库扩展

7 - 更新扩展

如何从安全地集群中移除扩展插件?

8 - 卸载扩展

如何从安全地集群中移除扩展插件?

要卸载某个扩展,通常需要执行以下步骤:

DROP EXTENSION "<extname>";

请注意,如果有其他扩展,或者使用此扩展的数据库对象依赖,您需要首先卸载/删除这些依赖,然后再卸载此扩展;

或者,也可以使用以下语句一次性强制卸载扩展及其依赖:

DROP EXTENSION "<extname>" CASCADE;

注意:CASCADE 选项会删除依赖于此扩展的所有对象,包括数据库对象、函数、视图等,慎用!

如果您希望移除扩展的软件包,可以操作系统的包管理器进行卸载:

9 - 预定义扩展栈

如何使用预定义的扩展堆栈,一次性安装特定场景下推荐的所有扩展插件?