For the complete documentation index, see llms.txt. This page is also available as Markdown.

33.2 PostgreSQL

PostgreSQL 是一款自由的对象关系型数据库管理系统(Object-Relational Database Management System,ORDBMS)。其学术源流可追溯至加州大学伯克利分校的 Ingres 项目,Michael Stonebraker 教授在 1986 年启动后继项目 POSTGRES(意为“post-Ingres”,即后 Ingres 时代),Version 1 于 1989 年 6 月发布给外部用户。

PostgreSQL 采用 PostgreSQL 许可证,该许可证与 BSD 许可证类似,同为宽松开源许可证。

作为严格遵循 ACID(原子性、一致性、隔离性、持久性)特性的数据库系统,PostgreSQL 支持事务处理、复杂查询优化和数据完整性约束。

安装 PostgreSQL

PostgreSQL 提供多个稳定版供选择,本节以 PostgreSQL 18 为例,其他版本的安装与配置方法类似。

使用 pkg 安装:

# pkg install postgresql18-server

或者使用 Ports 安装:

# cd /usr/ports/databases/postgresql18-server/
# make install clean

查看 PostgreSQL 安装后的配置信息:

# pkg info -D postgresql18-server

文件结构

PostgreSQL 的文件结构如下。

/
├── etc/
   ├── login.conf  # 登录配置文件
   ├── rc.conf     # 系统启动配置
   └── passwd      # 用户密码文件
├── usr/
   ├── local/
      ├── etc/
         ├── rc.d/
            └── postgresql  # PostgreSQL 启动脚本
         └── periodic/
             └── daily/
                 └── 502.pgsql  # PostgreSQL 定时备份脚本
      ├── share/
         └── postgresql/
             └── odbc.sql  # ODBC 兼容 SQL 脚本
      └── bin/
          └── pg_ctl  # PostgreSQL 控制工具
   └── ports/
       └── databases/
           └── postgresql18-server/  # PostgreSQL 18 Port
└── var/
    └── db/
        └── postgres/
            ├── data18/  # PostgreSQL 18 数据目录
               └── postgresql.conf  # PostgreSQL 配置文件
            ├── main/    # main 实例数据目录
            └── dev/     # dev 实例数据目录

服务管理

设置 PostgreSQL 服务开机自启:

初始化数据库

数据库集簇(database cluster)是 PostgreSQL 存储数据的目录集合,其中包含所有数据库文件和配置,初始化方法如下。

初始化 PostgreSQL 数据库集簇:

示例输出(已设置国际化,如果输出为英文也属正常):

登录使用

PostgreSQL 默认没有 root 用户,需要使用安装时创建的 postgres 用户登录。

示例输出:

正确用法:

PostgreSQL 服务管理

初始化建议

初始化数据库推荐使用 service postgresql initdb 命令,最为便捷。

以下说明如何使用 postgresql_initdb_flags rc 脚本参数。

postgresql_initdb_flags 参数默认是 "--encoding=utf-8 --lc-collate=C",其含义是:指定编码为 UTF-8,排序规则为 C。

建议用 sysrc 设置如下:

设置 PostgreSQL 初始化数据库的参数:UTF-8 编码、C 排序规则、SCRAM-SHA-256 认证(一种基于 Salted Challenge Response Authentication Mechanism 的安全认证协议),并要求输入密码。

解释:

  • -A scram-sha-256 指定默认的认证方法,否则 pg_hba.conf 中默认认证方法为 trust,即无密码登录;

  • -W 在初始化时要求设置 postgres 用户密码,无需登录后再设置。

这样可以简化部分初始化操作,也可通过 postgresql_initdb_flags 参数自定义编码、认证方式等初始化选项。

管理多个数据库实例(集簇)

PostgreSQL 能在一台机器上运行多个实例,适用于测试不同配置、环境隔离等场景。

PostgreSQL 的 rc 脚本封装了这些管理功能,同样便捷。

下面将创建两个命名实例,分别为 main 和 dev。

配置实例

说明:

  • ① 将实例名放入 rc 参数名中,即为对应实例的参数名。

  • postgresql_datapostgresql_enable 等参数仍然可以使用。这些参数作为实例对应参数的默认值使用,在找不到对应实例参数时使用。但显式配置实例参数后,便不再使用默认参数。

  • ③ 在管理多个实例时,建议只使用带实例名的参数。如此配置的优势在于清晰明确,控制也更灵活,不同实例可以有不同设置。

初始化实例目录

配置完成后,即可初始化数据库实例。

初始化 PostgreSQL 数据库集簇:

该命令会初始化两个数据库实例。

也可以在命令末尾指定实例名分别初始化,这种方法适用于新增实例。

注意

两个不同的实例必须运行在不同的端口上,因此需要修改对应实例的端口号。

其中 main 实例使用默认端口 5432,无需修改;dev 实例使用端口 5433,需修改其对应的配置文件。

修改 /var/db/postgres/dev/postgresql.conf 文件。找到 port 一行,修改如下:

设置 PostgreSQL 监听端口为 5433。

启动、停止和重启

实例配置完成后,即可启动或停止。

以上操作针对所有实例。示例如下:

也可以指定实例名称,操作单个实例:

输出示例如下:

参考文献

  • The PostgreSQL Global Development Group. A Brief History of PostgreSQL[EB/OL]. [2026-04-17]. https://www.postgresql.org/docs/current/history.html. 记载了 POSTGRES 项目从 Ingres 后续发展到 PostgreSQL 的完整历程,包括 1989 年 6 月发布 Version 1 等关键时间节点。

最后更新于