Linux,  PostgreSQL

如何在CentOS上源码安装PostgreSQL数据库

零 说明

本文记录在CentOS/RHEL Linux平台上通过源码安装PostgreSQL数据库、配置数据库的过程和步骤,及注意事项。

这里OS版本是CentOS 8.1,数据库选择PostgreSQL最新版本13。对于其它版本的CentOS 6/7,或者不同版本的PostgreSQL 9/10/11/12同样适用,具体操作步骤大同小异,同样可以适用。

[root@iZbp1anc2b2vggfj0i0oovZ ~]# uptime 
 17:30:50 up 131 days, 18:24,  1 user,  load average: 0.00, 0.00, 0.00
[root@iZbp1anc2b2vggfj0i0oovZ ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  860M     0  860M   0% /dev
tmpfs          tmpfs     875M     0  875M   0% /dev/shm
tmpfs          tmpfs     875M  472K  874M   1% /run
tmpfs          tmpfs     875M     0  875M   0% /sys/fs/cgroup
/dev/vda1      xfs        40G  4.2G   36G  11% /
tmpfs          tmpfs     175M     0  175M   0% /run/user/0
[root@iZbp1anc2b2vggfj0i0oovZ ~]# cat /etc/redhat-release 
CentOS Linux release 8.1.1911 (Core) 
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 

一 前提条件

要求OS上已经安装下述软件。如果没有,可以直接通过yum来安装。

1 gmake或者make要求至少3.80版本以上
[root@iZbp1anc2b2vggfj0i0oovZ ~]# make -v
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@iZbp1anc2b2vggfj0i0oovZ ~]# gmake -v
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@iZbp1anc2b2vggfj0i0oovZ ~]# which make
/usr/bin/make
[root@iZbp1anc2b2vggfj0i0oovZ ~]# which gmake
/usr/bin/gmake
[root@iZbp1anc2b2vggfj0i0oovZ ~]# ll /usr/bin/gmake 
lrwxrwxrwx 1 root root 4 May 11  2019 /usr/bin/gmake -> make
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 

这里,看到gmake版本为3.82。gmake是一个链接文件,其指向了make。其实,在CentOS/RHEL平台上,默认情况下,gmake等同于make。

2 C编译器
[root@iZbp1anc2b2vggfj0i0oovZ ~]# which gcc
/usr/bin/gcc
[root@iZbp1anc2b2vggfj0i0oovZ ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC) 
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 

如果没有的话,可以直接安装一个最新的gcc即可。

[root@iZbp1anc2b2vggfj0i0oovZ ~]# yum install gcc* 
3 tar软件包
[root@iZbp1anc2b2vggfj0i0oovZ ~]# which tar
/usr/bin/tar
[root@iZbp1anc2b2vggfj0i0oovZ ~]# tar --version
tar (GNU tar) 1.30
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
​
Written by John Gilmore and Jay Fenlason.
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 

tar软件工具用于解压缩源码格式的安装压缩包文件。

[root@iZbp1anc2b2vggfj0i0oovZ ~]# tar -zxvf postgresql-13.2.tar.gz 
​
如果下载的源文件格式类似于postgresql-13.2.tar.gz ,则用 tar -zxvf postgresql-13.2.tar.gz 解压;
​
如果下载的源文件格式类似于postgresql-13.2.tar.bz2,则系统上得安装有bzip2解压工具,再用tar -jxvf postgresql-13.2.tar.bz2 解压;
​
4 GNU readline library

该库文件默认启用。用于在psql命令行工具下,可以通过键盘的上下箭头调出历史命令以及编辑之前的命令。如果不需要此功能的话,可以在configure的时候,带上--without-readline选项。

补充:Oracle数据库如果想在SQL*PLUS命令行工具下,通过键盘上下键调出历史命令的话,则可以通过安装rlwrap软件包来实现。在oracle用户的.bash_profile文件中,通过OS的别名alias来搭配rlwrap来使用:

alias sql=’rlwrap sqlplus / as sysdba’

5 zlib compression library

该库文件默认启用。如果不需要此功能的话,可以在configure的时候,带上–without-zlib选项。当然如果带上该选项则意味着,使用pg_dump/pg_restore对数据库进行备份/恢复的时候,不支持对归档的压缩。

官方文档:

The zlib compression library is used by default. If you don’t want to use it then you must specify the --without-zlib option to configure. Using this option disables support for compressed archives in pg_dump and pg_restore.

经过我初步验证测试,暂时还没搞清楚该库文件的具体功能和作用。暂时记下这个问题,留待我后续进一步验证一下???

已更新验证测试。见第六节:关于zlib的补充

二 源码安装

1 创建postgres用户
[root@iZbp1anc2b2vggfj0i0oovZ ~]# groupadd postgres
[root@iZbp1anc2b2vggfj0i0oovZ ~]# useradd -g postgres postgres
[root@iZbp1anc2b2vggfj0i0oovZ ~]# passwd postgres
Changing password for user postgres.
New password: 
BAD PASSWORD: The password contains the user name in some form
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 
2 创建数据库软件的安装路径

假定将来要把数据库软件安装在/data/postgres/13.2/路径下,数据库的数据存放在/data/postgres/13.2/data路径下。后面的第5步骤会用到这里的路径。

这里,先把/data/postgres/13.2/路径创建出来即可,/data/postgres/13.2/data路径不需提前创建,届时初始化数据库的时候,会自动创建。

[root@iZbp1anc2b2vggfj0i0oovZ ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  860M     0  860M   0% /dev
tmpfs          tmpfs     875M     0  875M   0% /dev/shm
tmpfs          tmpfs     875M  472K  874M   1% /run
tmpfs          tmpfs     875M     0  875M   0% /sys/fs/cgroup
/dev/vda1      xfs        40G  4.2G   36G  11% /
tmpfs          tmpfs     175M     0  175M   0% /run/user/0
[root@iZbp1anc2b2vggfj0i0oovZ ~]# mkdir -p /data/postgres/13.2/
[root@iZbp1anc2b2vggfj0i0oovZ ~]# chown -R postgres:postgres /data/
[root@iZbp1anc2b2vggfj0i0oovZ ~]# ll /data/
total 0
drwxr-xr-x 3 postgres postgres 18 Mar 25 10:28 postgres
[root@iZbp1anc2b2vggfj0i0oovZ ~]# 
3 获取源码

到PostgreSQL官方网站,获取源码格式的数据库安装文件。

[root@iZbp1anc2b2vggfj0i0oovZ ~]# su - postgres
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ ll
total 0
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ wget https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz
--2021-03-25 10:30:50--  https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz
Resolving ftp.postgresql.org (ftp.postgresql.org)... 147.75.85.69, 217.196.149.55, 87.238.57.227, ...
Connecting to ftp.postgresql.org (ftp.postgresql.org)|147.75.85.69|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 27548921 (26M) [application/octet-stream]
Saving to: 'postgresql-13.2.tar.gz'
​
postgresql-13.2.tar.gz                      100%[========================================================================================>]  26.27M  85.5KB/s    in 5m 7s   
​
2021-03-25 10:36:00 (87.5 KB/s) - 'postgresql-13.2.tar.gz' saved [27548921/27548921]
​
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ ll
total 26904
-rw-rw-r-- 1 postgres postgres 27548921 Feb  9 06:07 postgresql-13.2.tar.gz
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ 
4 解压源码

如果下载的源码文件格式为类似于postgresql-13.2.tar.gz,则用tar jxvf postgresql-13.2.tar.bz2解压。

解压后,会生成一个新的postgresql-13.2路径,该路径下存放的就是源码格式的安装文件。

[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ tar -zxvf postgresql-13.2.tar.gz 
...
...
postgresql-13.2/.gitattributes
postgresql-13.2/aclocal.m4
postgresql-13.2/configure.in
postgresql-13.2/INSTALL
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ ll
total 26904
drwxrwxr-x 6 postgres postgres      294 Feb  9 06:07 postgresql-13.2
-rw-rw-r-- 1 postgres postgres 27548921 Feb  9 06:07 postgresql-13.2.tar.gz
[postgres@iZbp1anc2b2vggfj0i0oovZ ~]$ cd postgresql-13.2/
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ ll
total 740
-rw-r--r--  1 postgres postgres    490 Feb  9 05:54 aclocal.m4
drwxrwxr-x  2 postgres postgres   4096 Feb  9 06:06 config
-rwxr-xr-x  1 postgres postgres 568656 Feb  9 05:54 configure
-rw-r--r--  1 postgres postgres  82388 Feb  9 05:54 configure.in
drwxrwxr-x 57 postgres postgres   4096 Feb  9 06:06 contrib
-rw-r--r--  1 postgres postgres   1192 Feb  9 05:54 COPYRIGHT
drwxrwxr-x  3 postgres postgres     87 Feb  9 06:06 doc
-rw-r--r--  1 postgres postgres   4278 Feb  9 05:54 GNUmakefile.in
-rw-r--r--  1 postgres postgres    277 Feb  9 05:54 HISTORY
-rw-r--r--  1 postgres postgres  63684 Feb  9 06:07 INSTALL
-rw-r--r--  1 postgres postgres   1665 Feb  9 05:54 Makefile
-rw-r--r--  1 postgres postgres   1213 Feb  9 05:54 README
drwxrwxr-x 16 postgres postgres    328 Feb  9 06:07 src
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 
5 执行configure

执行configure的命令行选项,–prefix参数,表示把PostgreSQL安装在哪个路径下?这里,我们就把它安装在前面第2步骤中配置的/data/postgres/13.2/路径下。默认情况下,不带该参数时,则会安装在/usr/local/pgsql路径下。

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ ./configure --prefix=/data/postgres/13.2
...
...
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 

注意:

1 执行./configure命令,要先进入到源码解压出来的路径下,cd postgresql-13.2/;

2 前面提到的前提条件中必须的软件包GNU readline library和zlib compression library,如果没有正常安装配置的话,你可能会遭遇到类似下述错误:

checking for library containing readline… no configure: error: readline library not found If you have readline already installed, see config.log for details on the failure. It is possible the compiler isn’t looking in the proper directory. Use –without-readline to disable readline support. [postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$

3 关于./configure命令的更多帮助和选项,可以通过./configure –help来查看更多;

6 执行make world

这里,也可以简单执行make就可以build安装文件的,但是,make world的意思是指把PostgreSQL相关的文档,HTML,以及其它的一些模块都会一起编译进去。比如,在有的环境下遇到无法使用uuid或者使用不了gin index的原因,就是在编译的时候,没有包含这些对应的模块。处理这种的问题的方法也不复杂,只需要进到当时安装时的那个源文件路径下,重新执行make world,然后make install-world。

建议,在初始安装的时候,就直接用make world或等价的gmake world命令。

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ gmake world
...
...
gmake[1]: Leaving directory '/home/postgres/postgresql-13.2/contrib'
PostgreSQL, contrib, and documentation successfully made. Ready to install.
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 
7 执行make install-world
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ gmake install-world
...
...
gmake[2]: Leaving directory '/home/postgres/postgresql-13.2/contrib/vacuumlo'
gmake[1]: Leaving directory '/home/postgres/postgresql-13.2/contrib'
PostgreSQL, contrib, and documentation installation complete.
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$
8 初始化数据库
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ /data/postgres/13.2/bin/initdb -D /data/postgres/13.2/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
​
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
​
Data page checksums are disabled.
​
creating directory /data/postgres/13.2/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
​
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
​
Success. You can now start the database server using:
​
    /data/postgres/13.2/bin/pg_ctl -D /data/postgres/13.2/data -l logfile start
​
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 
9 启动数据库
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ /data/postgres/13.2/bin/pg_ctl start -D /data/postgres/13.2/data/ -l /home/postgres/startup.log
waiting for server to start.... done
server started
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ ps -ef|grep postgres
root     12240 15860  0 11:45 pts/0    00:00:00 su - postgres
postgres 12241 12240  0 11:45 pts/0    00:00:00 -bash
postgres 23470     1  0 14:37 ?        00:00:00 /data/postgres/13.2/bin/postgres -D /data/postgres/13.2/data
postgres 23472 23470  0 14:37 ?        00:00:00 postgres: checkpointer 
postgres 23473 23470  0 14:37 ?        00:00:00 postgres: background writer 
postgres 23474 23470  0 14:37 ?        00:00:00 postgres: walwriter 
postgres 23475 23470  0 14:37 ?        00:00:00 postgres: autovacuum launcher 
postgres 23476 23470  0 14:37 ?        00:00:00 postgres: stats collector 
postgres 23477 23470  0 14:37 ?        00:00:00 postgres: logical replication launcher 
postgres 23478 12241  0 14:37 pts/0    00:00:00 ps -ef
postgres 23479 12241  0 14:37 pts/0    00:00:00 grep --color=auto postgres
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 
10 修改环境变量

注意:

修改环境变量的原因是,我们要将PostgreSQL数据库的可执行程序,psql,pg_ctl,pg_dump,pg_restore,createdb,oid2name等加入到当前用户的环境变量PATH,这样,将来我们就可以直接执行这些命令,而不再需要通过调用绝对路径,诸如上述我们步骤8初始化数据库的时候,执行/data/postgres/13.2/bin/initdb,或者步骤9中的,启动数据库调用/data/postgres/13.2/bin/pg_ctl命令。

另外,我们再配置一个PGDATA的环境变量,该变量用于指定数据库cluster的路径。该部分内容,我们在后续会详细讲述。

修改postgres用户的~/.bash_profile,PATH添加 /data/postgres/13.2/bin,同时,添加PGDATA= /data/postgres/13.2/data,环境变量。如果是CentOS 7/6的系统,参照下述配置:

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/data/postgres/13.2/bin
export PATH
PGDATA=/data/postgres/13.2/data
export PGDATA

由于,我这边手头上的这台Linux服务器是CentOS 8.1版本的操作系统,用户的默认环境变量配置信息已经变更到~/.bashrc文件里了,所以,我就直接配置到 ~/.bashrc 文件里了。

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ cat ~/.bash_profile 
# .bash_profile
​
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
​
# User specific environment and startup programs
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ cat ~/.bashrc 
# .bashrc
​
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
​
# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH:/data/postgres/13.2/bin"
PGDATA=/data/postgres/13.2/data
export PATH PGDATA
​
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
​
# User specific aliases and functions
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$   

使其环境变量生效:

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ source ~/.bash_profile 
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ source ~/.bashrc 

至此,我们已经完成了在CentOS 8.1操作系统的Linux服务器上,通过编译源代码的方式安装PostgreSQL 13.2的数据库。

三 补充

1 修改数据库参数
a 修改pg_hba.conf文件

在/data/postgres/13.2/data/pg_hba.conf文件中,添加下面的一行:

#IPv4 local connections:
host  all  all  0.0.0.0/0  md5

其,表示当前数据库服务器,对使用IPV4地址的客户端机器,允许其通过任意IP地址,通过任意数据库用户发起对该数据库服务器上的任意数据库的访问,但是必须得提供数据库用户密码。其认证方式,是通过MD5加密认证的。

一句话简介:对于使用IPV4地址的客户端,数据库服务器不做限制,可以通过任意用户访问所有数据库。

为什么要修改这个配置文件?为什么要这么修改?该配置文件的作用是什么?它的存放路径在哪儿?如何修改和配置它?修改之后,如何使之生效?我在另外一篇文章里有详细阐述。

b 修改postgresql.conf 文件

在/data/postgres/13.2/data/data/postgresql.conf 文件中,修改#listen_addresses = ‘localhost’为listen_addresses = ‘*’。

然后,reload使其生效。

为什么要修改这个文件?为什么要这么修改?

原因是,如果不修改的话,则客户端只能通过数据库服务器的环路地址127.0.0.1来访问数据库,不能使用服务器的对外IP地址来访问。也就是说,这个数据库只对本机提供服务,其它任何机器都访问不了这个数据库。

如下,修改之前:

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ psql 
psql (13.2)
Type "help" for help.
​
postgres=# show listen_addresses ;
 listen_addresses 
------------------
 localhost
(1 row)
​
postgres=# \q
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ psql -h localhost
psql (13.2)
Type "help" for help.
​
postgres=# \q
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ psql -h localhost -p 5432 -d postgres
psql (13.2)
Type "help" for help.
​
postgres=# show listen_addresses ;
 listen_addresses 
------------------
 localhost
(1 row)
​
postgres=# \q

此时,我们只能从当前服务器上访问这个数据库,且只能通过环路访问,在当前机器上通过当前机器的IP地址也不可以访问数据库。当然,从另外一台机器也不能访问该数据库。

修改listen_addresses = ‘*’,且重启数据库使其生效之后:

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ vi /data/postgres/13.2/data/postgresql.conf 
...
...
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
​
# - Connection Settings -
​
listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
...
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ pg_ctl restart -m fast -l /home/postgres/startup.log 
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 

修改并重启数据库使之生效之后,不论是本机还是另外一台机器都可以通过数据库服务器的实际IP地址,访问数据库。

2 如何删除PostgreSQL数据库软件

如果数据库不再需要使用,或者需要重新安装配置数据库的话,就需要把之前安装的数据库软件干净的删除掉。那么该怎么操作呢?

postgres用户进入到前面解压的源码所在的路径/home/postgres/postgresql-13.2,通过执行make uninstall来卸载已经安装的数据库软件。如下:

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ gmake uninstall 
...
...
gmake -C config uninstall
gmake[1]: Entering directory '/home/postgres/postgresql-13.2/config'
rm -f '/data/postgres/13.2/lib/pgxs/config/install-sh'
rm -f '/data/postgres/13.2/lib/pgxs/config/missing'
gmake[1]: Leaving directory '/home/postgres/postgresql-13.2/config'
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 

注意,该命令只是把前面我们手工执行编译安装configure,install命令过程中写入操作系统的一些可执行命令删除,以及一些环境变量删了。我们在步骤2中手工创建的数据库安装路径依然存在,并不会被删除。

3 如何重新编译安装PostgreSQL数据库软件

在一些情况下,我们可能需要重新编译安装数据库软件,比如初次安装的时候,如果不是使用make world编译源码的话,那么默认情况下少了很多数据库的扩展,而我们又发现需要用到这些扩展,该怎么办?或者,干脆,我们需要推倒重来的话,就可以选择重新编译安装。

a方式1 重新解压源码、编译、安装

可以从前面第4步开始重新走一遍流程,即重新解压源码,用新解压出来的源码文件,再依次进行configure,make world,make install-world。

b方式2 清除之前的编译状态

就是把之前第5步骤执行configure之后的文件状态,恢复到configure之前的状态,然后再通过执行configure,make world,make install-world。这个命令是make distclean。说白了,这个命令就是将源代码路径下的文件恢复到刚解压出来的状态,清除了之前执行configure命令对该路径下的所有文件的修改。

如下是第二种方式的记录:

[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ ll
total 1220
-rw-r--r--  1 postgres postgres    490 Feb  9 05:54 aclocal.m4
drwxrwxr-x  2 postgres postgres   4096 Feb  9 06:06 config
-rw-rw-r--  1 postgres postgres 436882 Mar 25 11:46 config.log
-rwxrwxr-x  1 postgres postgres  39941 Mar 25 11:46 config.status
-rwxr-xr-x  1 postgres postgres 568656 Feb  9 05:54 configure
-rw-r--r--  1 postgres postgres  82388 Feb  9 05:54 configure.in
drwxrwxr-x 57 postgres postgres   4096 Feb  9 06:06 contrib
-rw-r--r--  1 postgres postgres   1192 Feb  9 05:54 COPYRIGHT
drwxrwxr-x  3 postgres postgres     87 Feb  9 06:06 doc
-rw-rw-r--  1 postgres postgres   4278 Mar 25 11:46 GNUmakefile
-rw-r--r--  1 postgres postgres   4278 Feb  9 05:54 GNUmakefile.in
-rw-r--r--  1 postgres postgres    277 Feb  9 05:54 HISTORY
-rw-r--r--  1 postgres postgres  63684 Feb  9 06:07 INSTALL
-rw-r--r--  1 postgres postgres   1665 Feb  9 05:54 Makefile
-rw-r--r--  1 postgres postgres   1213 Feb  9 05:54 README
drwxrwxr-x 16 postgres postgres   4096 Mar 25 11:46 src
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ gmake distclean
...
gmake[1]: Leaving directory '/home/postgres/postgresql-13.2/src'
rm -rf tmp_install/
rm -f config.cache config.log config.status GNUmakefile
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ ll
total 740
-rw-r--r--  1 postgres postgres    490 Feb  9 05:54 aclocal.m4
drwxrwxr-x  2 postgres postgres   4096 Feb  9 06:06 config
-rwxr-xr-x  1 postgres postgres 568656 Feb  9 05:54 configure
-rw-r--r--  1 postgres postgres  82388 Feb  9 05:54 configure.in
drwxrwxr-x 57 postgres postgres   4096 Feb  9 06:06 contrib
-rw-r--r--  1 postgres postgres   1192 Feb  9 05:54 COPYRIGHT
drwxrwxr-x  3 postgres postgres     87 Feb  9 06:06 doc
-rw-r--r--  1 postgres postgres   4278 Feb  9 05:54 GNUmakefile.in
-rw-r--r--  1 postgres postgres    277 Feb  9 05:54 HISTORY
-rw-r--r--  1 postgres postgres  63684 Feb  9 06:07 INSTALL
-rw-r--r--  1 postgres postgres   1665 Feb  9 05:54 Makefile
-rw-r--r--  1 postgres postgres   1213 Feb  9 05:54 README
drwxrwxr-x 16 postgres postgres    328 Mar 25 16:31 src
[postgres@iZbp1anc2b2vggfj0i0oovZ postgresql-13.2]$ 

从上可以看到,gmake distclean之后,ll命令列出源代码路径的输出结果和最开始的解压源码之后的文件和路径大小输出保持一样,即恢复到刚解压的状态。

四 小结

本文用于记录如何在Linux平台上,通过编译源码的方式,来安装配置PostgreSQL数据库,作一个简单记录。

我这里,把官方文档的详细安装说明给浓缩抽取了核心必要的步骤。同时,也补充了如何删除、重新安装数据库软件的部分。以及一些注意事项,为什么要修改pg_hba.conf和postgresql.conf文件。

五 参考

更为详细的信息可以参考官方文档

六 关于zlib的补充

腾出手来,验证一 前提条件中 5 zlib compression library小结的疑问了。

原来,当我们的OS没有安装zlib软件包的情况下,我们在安装数据库软件的时候,只能以–without-zlib的选项来执行安装,否则过不去。安装完之后,当我们以pg_dump备份数据库的时候,就不能选择对备份文件执行压缩了。

安装命令:

[postgres@localhost ~]$ ./configure --prefix=/home/postgres/pg13 --without-readline --without-zlib

备份命令:以-Fc(表示定制格式custom Format,生成的备份文件不再是普通文本格式),-Z6,表示采用6这个级别的压缩,一共9级。

[postgres@localhost ~]$ time pg_dump -d es -U es -Fc -Z6 -f es.dmp.z6_withoutzlib
pg_dump: warning: requested compression not available in this installation -- archive will be uncompressed
​
real    0m27.702s
user    0m4.388s
sys     0m4.685s
[postgres@localhost ~]$ ll -h
总用量 773M
-rw-rw-r--. 1 postgres postgres 753M 4月   1 17:53 es.dmp.z6_withoutzlib
drwxrwxr-x. 7 postgres postgres   68 4月   1 17:35 pg13
drwxrwxr-x. 6 postgres postgres 4.0K 4月   1 17:24 postgresql-13.2
-rw-rw-r--. 1 postgres postgres  21M 2月   9 06:07 postgresql-13.2.tar.bz2
[postgres@localhost ~]$

看到有警告⚠️了:

pg_dump: warning: requested compression not available in this installation — archive will be uncompressed

我们采用定制备份备份文件的格式(非文本),或者直接备份为文本格式(默认)时,都不会有警告了。

[postgres@localhost ~]$ time pg_dump -d es -U es -f es.dmp -Fc
​
real    0m26.160s
user    0m4.770s
sys     0m4.323s
[postgres@localhost ~]$ ll -h
总用量 1.5G
-rw-rw-r--. 1 postgres postgres 753M 4月   1 17:54 es.dmp
-rw-rw-r--. 1 postgres postgres 753M 4月   1 17:53 es.dmp.z6_withoutzlib
drwxrwxr-x. 7 postgres postgres   68 4月   1 17:35 pg13
drwxrwxr-x. 6 postgres postgres 4.0K 4月   1 17:24 postgresql-13.2
-rw-rw-r--. 1 postgres postgres  21M 2月   9 06:07 postgresql-13.2.tar.bz2
[postgres@localhost ~]$ time pg_dump -d es -U es -f es.dmp.plain.file
​
real    0m10.633s
user    0m3.440s
sys     0m4.132s
[postgres@localhost ~]$ ll -h
总用量 2.2G
-rw-rw-r--. 1 postgres postgres 753M 4月   1 17:54 es.dmp
-rw-rw-r--. 1 postgres postgres 673M 4月   1 18:01 es.dmp.plain.file
-rw-rw-r--. 1 postgres postgres 753M 4月   1 17:53 es.dmp.z6_withoutzlib
drwxrwxr-x. 7 postgres postgres   68 4月   1 17:35 pg13
drwxrwxr-x. 6 postgres postgres 4.0K 4月   1 17:24 postgresql-13.2
-rw-rw-r--. 1 postgres postgres  21M 2月   9 06:07 postgresql-13.2.tar.bz2
[postgres@localhost ~]$ 

备份文件格式:

[postgres@localhost ~]$ file es.dmp.z6_withoutzlib 
es.dmp.z6_withoutzlib: PostgreSQL custom database dump - v1.14-0
[postgres@localhost ~]$ file es.dmp
es.dmp: PostgreSQL custom database dump - v1.14-0
[postgres@localhost ~]$ file es.dmp.plain.file 
es.dmp.plain.file: ASCII text
[postgres@localhost ~]$

使用-Fc定制备份格式的文件都不再是普通文本文件,恢复的时候就需要使用pg_restore来恢复了。而普通格式的备份文件,可以直接在psql命令行上执行恢复了。

两句话小结:如果操作系统上缺乏zlib软件包的话,安装数据库软件时,不得不使用–without-zlib选项。结果就是,当我们使用pg_dump对数据库进行备份的话,无论采用什么格式,都不能对备份文件进行压缩。

如果操作系统上有zlib软件包的话,安装数据库软件时,主动选择不使用–without-zlib选项的话,当我们使用pg_dump对数据库进行备份的话,无论采用什么格式,依然不能对备份文件进行压缩。

2021.4.1补充。

延伸阅读:Linux软件包管理方式和手工编译源代码安装软件时究竟做了哪些操作?