从源码编译安装PostgreSQL 16.x
📅 2023-11-13 | 🖱️
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
连接到数据库。