PostgreSQL是一个开源的对象-关系数据库系统(ORDBMS),在灵活的BSD许可证下发行。 PostgreSQL事实上不被任何一家公司所掌控,PostgreSQL全球开发小组,是一个松散的组织,BSD许可协议是自由软件中使用最广泛的许可协议之一。 PostgreSQL在可靠性、稳定性上已经十分强大,并且被应用的十分广泛。

本文将介绍从源码编译安装PostgreSQL 16.1的具体过程。

1.安装环境和准备工作

一台Ubuntu 22.04服务器如下:

1192.168.100.151    node1

下载PostgreSQL的源码压缩包:

1curl -O -k https://ftp.postgresql.org/pub/source/v16.1/postgresql-16.1.tar.gz

解压缩源码:

1tar -zxvf postgresql-16.1.tar.gz

安装编译工具及相关依赖:

1apt install make gcc bison g++ libreadline-dev \
2  zlib1g zlib1g-dev perl libperl-dev libsystemd-dev libicu-dev acl

注: 对应在Rocky 8和openEuler 22上的依赖是yum install -y make gcc bison gcc-c++ readline readline-devel zlib zlib-devel systemd-devel libicu-devel

在这台服务器上创建postgres用户:

1useradd -m postgres

创建postgresql相关目录:

1mkdir /home/postgres/data
2mkdir /home/postgres/init
3chown -R postgres:postgres /home/postgres

将使用/home/postgres/data作为数据库的数据目录。

2.编译安装PostgreSQL

进入到源码解压缩目录:

1cd postgresql-16.1

configure执行配置准备构建环境:

1export LD_LIBRARY_PATH=/usr/lib
2
3./configure --with-pgport=5432 \
4  --prefix=/usr/local/pgsql \
5  --with-systemd \
6  --with-segsize=16 \
7  --with-blocksize=8 \
8  --with-wal-blocksize=8 \
9  --datadir=/home/postgres/init
  • LD_LIBRARY_PATH是一个用于指定动态链接库(shared library)的搜索路径的环境变量。
  • --with-segsize=SEGSIZE设置段大小(以GB为单位)。大型表分为多个操作系统文件,每个文件的大小等于段大小。建议(尽管不是绝对必需)此值为2的幂。这样可以避免许多平台上存在的文件大小限制问题。默认段大小1GB,在所有受支持的平台上都是安全的。如果您的操作系统具有“大文件”支持(现在大多数都支持),则可以使用更大的段大小。这有助于减少处理非常大的表时消耗的文件描述符数。请注意,更改此值会破坏磁盘上的数据库兼容性,这意味着您无法用于 pg_upgrade 升级到具有不同段大小的内部版本。
  • --with-blocksize=BLOCKSIZE设置块大小(以KB为单位)。这是表中的存储和I/O单元。默认值8KB适用于大多数情况;但其他值在特殊情况下可能有用。该值必须是介于1和32(千字节)之间的2次幂。请注意,更改此值会破坏磁盘上的数据库兼容性,这意味着您无法用于pg_upgrade升级到具有不同块大小的生内部版本。
  • --with-wal-blocksize=WALBLOCKSIZE设置WAL块大小(以KB为单位)。这是WAL日志中的存储和 I/O 单元。默认值8KB适用于大多数情况;但其他值在特殊情况下可能有用。该值必须是介于1和64(千字节)之间的2次方。请注意,更改此值会破坏磁盘数据库兼容性,这意味着您无法用于 pg_upgrade 升级到具有不同WAL块大小的版本。

编译安装:

1make
2make install

3.初始化数据库

执行下面的命令对数据库进行初始化,数据库的初始化需要切换到postgres用户:

1su - postgres
2/usr/local/pgsql/bin/initdb -D /home/postgres/data

创建systemd配置文件/etc/systemd/system/postgresql.service:

 1[Unit]
 2Description=PostgreSQL database server
 3Documentation=man:postgres(1)
 4After=network-online.target
 5Wants=network-online.target
 6
 7[Service]
 8Type=notify
 9User=postgres
10ExecStart=/usr/local/pgsql/bin/postgres -D /home/postgres/data
11ExecReload=/bin/kill -HUP $MAINPID
12KillMode=mixed
13KillSignal=SIGINT
14
15[Install]
16WantedBy=multi-user.target

配置开机启动并启动PostgreSQL:

1systemctl enable postgresql --now

默认使用postgres用户可以本机登录到数据库:

1cd /usr/local/pgsql/bin
2./psql -p5432 -h127.0.0.1 -Upostgres
3psql (16.1)
4Type "help" for help.
5
6postgres=#

初始化数据库后,会有名为postgres的数据库,来存储数据库的基础信息,例如用户信息等等,postgres数据库中会初始化一名超级用户postgres可以修改该用户的密码:

1postgres=#  \password

4.连接相关配置

4.1 修改配置文件中的监听地址

修改/home/postgres/data/postgresql.conf配置文件,设置监听地址:

1listen_addresses = '*'

修改配置后重启数据库服务即可:

1systemctl restart postgresql

4.2 修改pg_hba.conf定义客户端与服务器之间连接规则

pg_hba.conf文件是PostgreSQL数据库系统中的一个配置文件,用于定义客户端与服务器之间的连接规则。pg_hba代表 “host-based authentication”,即基于主机的身份验证。 在这个文件中,可以规定哪些主机地址、哪些用户、以及使用什么方法进行连接,以及是否需要密码等认证信息。这是PostgreSQL数据库管理安全连接的一个重要配置文件。

修改/home/postgres/data/pg_hba.conf配置连接规则:

 1# TYPE  DATABASE        USER            ADDRESS                 METHOD
 2# "local" is for Unix domain socket connections only
 3local   all             all                                     trust
 4# IPv4 local connections:
 5host    all             all             127.0.0.1/32            trust
 6# IPv6 local connections:
 7host    all             all             ::1/128                 trust
 8# Allow replication connections from localhost, by a user with the
 9# replication privilege.
10local   replication     all                                     trust
11host    replication     all             127.0.0.1/32            trust
12host    replication     all             ::1/128                 trust
13
14
15host    all             all             192.168.100.0/24           md5

上面的示例表示允许本地Unix domain socket连接不需要密码 (trust),允许来自127.0.0.1的IPv4连接不需要密码 (trust),以及允许来自:: 的IPv6连接不需要密码 (trust),允许来自192.168.100.0/24网段的客户端连接需要密码(md5)。

修改配置后重启数据库服务即可:

1systemctl restart postgresql

4.3 配置postgres系统用户的环境变量

vi /home/postgres/.bash_profile,加入以下环境变量

1export  PGHOME=/usr/local/pgsql
2export  PGDATA=/home/postgres/data
3export  PGHOST=127.0.0.1
4export  PGPORT=5432
5export  PATH=$PATH:$PGHOME/bin
6export  LD_LIBRARY_PATH=/usr/local/pgsql/lib

这样每次su - postgres切换到系统用户postgres后,可以直接输入psql连接到数据库。

5.PostgreSQL的基本使用

参考