购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 从源码安装

本节详细讲解从源码编译安装的方法、技巧和遇到的一些问题的解决方法。

2.2.1 编译安装过程简介

从源码安装的编译安装过程如下。

第一步,下载源代码。

第二步,编译安装,过程与Linux下其他软件的编译安装过程相同,都是“三板斧”:

·./configure。

·make。

·make install。

第三步,编译安装完成后执行如下步骤:

·使用initdb命令初始化数据库簇。

·启动数据库实例。

·创建一个应用使用的数据库。

数据库簇是数据库实例管理的系统文件及各个数据库文件的集合。

2.2.2 下载源代码

打开PostgreSQL官方网站的源代码下载页面“ https://www.postgresql.org/download/ ”,如图2-12所示。在下载页面中单击左侧的“Source”,进入源代码下载页面,如图2-13所示。

在源代码版本选择页面中选择合适的版本,比如“v12.2”,如图2-14所示。

在图2-14所示的页面中选择合适的压缩包进行下载,一般选择bz2压缩包,因为这种格式的压缩包体积较小。

图2-12 PostgreSQL官方网站中的源代码下载界面

图2-13 PostgreSQL官方源码下载中的版本选择页面

图2-14 选择v12.2版本

2.2.3 编译及安装

在默认情况下一般要使用数据库中的压缩功能,而这一功能的实现需要第三方的zlib压缩开发包支持,注意是开发包。在不同的Linux发行版本下,此包的名字可能会不太一样,但包的名字中一般都含有“zlib”字样,在Red Hat/CentOS中,该开发包名字后面带“-devel”,而在Ubuntu中是带“-dev”。如在CentOS7.X下,我们可以使用如下方法查找zlib开发包:


[root@pg01 ~]# yum search zlib |grep devel
zlib-devel.x86_64 : Header files and libraries for Zlib development
zlib-devel.i686 : Header files and libraries for Zlib development
zlib-static.i686 : Static libraries for Zlib development
zlib-static.x86_64 : Static libraries for Zlib development

从上面列出的包来看,“zlib-devel.x86_64”是我们需要的zlib开发包。如果是在Ubuntu18.04下,需要的包的名称是“zlib1g-dev”。通常在不同的Linux发行版本下,还需要依靠一些经验来确定需要安装哪个包。

如果想要方便地在psql中使用上下方向键把历史命令找出来,按照PostgreSQL官方手册的说明,还需要安装readline开发包,用相似的方法可查找包含“readline”和“devel”的包:


[root@pg01 ~]# yum search readline |grep devel
readline-devel.x86_64 : Files needed to develop programs which use the readline
readline-devel.i686 : Files needed to develop programs which use the readline

从上面列出的包来看,“readline-devel.x86_64”就是我们需要的readline开发包。

将前面下载的压缩包解压,如果该压缩包名称为“postgresql-12.2.tar.bz2”,则解压命令如下:


tar xvf postgresql-12.2.tar.bz2

编译安装的“第一板斧”是运行“configure”,对于PostgreSQL9.X及之后的版本,一般编译安装的命令如下:


./configure --prefix=/usr/local/pgsql12.2 --with-perl --with-python

但是对于PostgreSQL8.X的老版本,需要在configure的命令上加“--enable-thread-safety”,如下:


./configure --prefix=/usr/local/pgsql8.4.17 --enable-thread-safety
--with-perl --with-python

加这个选项的原因在于,在日常使用中,一般要求客户端是线程安全的,PostgreSQL9.X版本之后考虑到这个问题,默认改成线程安全的了。而PostgreSQL8.X没有做成这样,所以要加上这个选项。

另外,再来看如下两个选项。

·--with-perl:加上该选项才能使用Perl语法的PL/Perl过程语言来编写自定义函数。使用该项要先安装perl开发包,该包在Ubuntu或Debian下名为“libperl-dev”,可使用“apt-get install libperl-dev”命令来安装。

·--with-python:加上该选项才能使用Python语法的PL/Python过程语言来编写自定义函数。使用该选项要先安装python-dev开发包,该包在Ubuntu或Debian下名为“python-dev”,可使用“apt-get install python-dev”来安装。

编译安装的“第二板斧”是make命令,该命令比较简单,直接运行即可:


make

按官方文档要求,使用make命令时,其版本要在gmake v3.8以上,目前绝大多数Linux发行版本都满足要求,所以一般在Linux环境下不需要检测make版本,但如果是在其他非Linux的UNIX平台上,建议先检测make的版本,检测命令如下:


osdba@osdba-laptop:~$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.

在其他UNIX平台上,可能存在非GNU的make,此时GNU的make的名称会是“gmake”。

编译安装的“第三板斧”是运行make install命令,如果是在一般用户下进行编译,可能对“/usr/local”目录没有写的权限,所以运行make install命令时需要使用root权限,在Debian或Ubuntu下可以使用sudo命令:


sudo make install

前面我们看到--prefix设置的路径为“/usr/local/pgsql12.2”,如果不进行设置,默认的路径将是“/usr/local”,为什么要在此路径上加上PostgreSQL的版本号呢?这是为了方便升级。make install命令运行完成后,还要进入“/usr/local”目录,为“/usr/local/pgsql12.2”建立一个/usr/local/pgsql链接:


cd /usr/local
sudo ln -sf /usr/local/pgsql12.2 /usr/local/pgsql

如果我们要升级到PostgreSQL12.3,在编译PostgreSQL12.3后,只需停掉现有的数据库,然后将链接“/usr/local/pgsql”指向新版本的目录“/usr/local/pgsql12.3”即可完成升级。这样是不是很方便呢?

2.2.4 PostgreSQL的配置

PostgreSQL安装完成后,需要设置可执行文件的路径:


export PATH=/usr/local/pgsql/bin:$PATH

然后设置共享库的路径:


export LD_LIBRARY_PATH=/usr/local/pgsql/lib

如果想让以上配置对所有的用户生效,可以把以上内容添加到/etc/profile文件中,/etc/profile中的内容类似如下内容:


...
...
...
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi


export PATH=/usr/local/pgsql/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH

如果想让以上配置对当前用户生效,在Linux下可以把以上内容添加到.bashrc文件中,在其他UNIX下可以加到.profile文件中。

在Linux下为何不添加到.profile文件或.bash_profile文件中?这是因为,在图形界面下打开一个终端,有时.profile或.bash_profile不会生效,而.bashrc会生效。

2.2.5 创建数据库实例

首先设定数据库的数据目录的环境变量:


export PGDATA=/home/osdba/pgdata

然后执行下面的命令创建数据库簇:


initdb

至此,数据库实例的创建就完成了。

2.2.6 安装contrib目录下的工具

contrib下有一些工具比较实用,一般用户都会安装这些工具,其安装的方法也与Linux下的编译过程相同,安装命令如下:


cd postgresql-12.2/contrib
make
sudo make install

2.2.7 启动和停止数据库

启动数据库的命令如下:


pg_ctl start -D $PGDATA

其中,环境变量“PGDATA”指向具体的PostgreSQL数据库的数据目录,示例如下:


osdba@osdba-laptop:~$ pg_ctl start -D /home/osdba/pgdata 
server starting

停止数据库的命令如下:


pg_ctl stop -D $PGDATA [-m SHUTDOWN-MODE]

其中-m用于指定数据库的停止方法,有以下3种模式:

·smart:等所有连接中止后,关闭数据库。如果客户端连接不终止,则无法关闭数据库。

·fast:快速关闭数据库,断开客户端的连接,让已有的事务回滚,然后正常关闭数据库。相当于Oracle数据库关闭时的immediate模式。

·immediate:立即关闭数据库,相当于数据库进程立即停止,直接退出,下次启动数据库需要进行恢复。相当于Oracle数据库关闭时的abort模式。

PostgreSQL数据库中的immediate关机模式相当于Oracle数据库中的abort关机模式,而Oracle中的immediate关机模式实际上对应的是PostgreSQL中的fast模式,对于从Oracle数据库中转过来的DBA尤其需要注意这一点。

较常用的关闭数据库的方法是fast模式,因为如果采用smart模式,有用户连接到数据库时,系统会一直等待,而无法关闭数据库。PostgreSQL9.5之前的版本默认是smart模式,通常要使用命令“pg_ctl stop -m fast”来关闭数据库,在PostgreSQL9.5以上的版本中可以直接用“pg_ctl stop”命令来关闭数据库。

2.2.8 编译安装过程中的常见问题及解决方法

问题一: 运行“./configure”时报“error:zlib library not found”错误是怎么回事?示例如下:


osdba@ubuntu01:~/src/postgresql-12.2$ ./configure --prefix=/usr/local/pgsql12.2 --with-perl --with-python
checking build system type... x86_64-unknown-linux-gnu
....
....
checking for inflate in -lz... no
configure: error: zlib library not found
If you have zlib already installed, see config.log for details on the
failure.  It is possible the compiler isn't looking in the proper directory.
Use --without-zlib to disable zlib support.

答:这是没有安装zlib开发包的缘故,请安装zlib开发包。

问题二: 我已安装了libreadline6安装包,但运行“./configure”时仍报“error:readline library not found”错误是怎么回事?示例如下:


osdba@ubuntu01:~/src/postgresql-12.2$ ./configure --prefix=/usr/local/pgsql12.2 --with-perl --with-python
checking build system type... x86_64-unknown-linux-gnu
...
...
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.

答:包安装错误,需要安装开发包,即安装libreadline6-dev开发包,而不是libreadline6安装包。

问题三: 在运行“./configure”时报以下警告,是否会导致编译出来的PostgreSQL功能缺失?示例如下:


checking for bison... no
configure: WARNING:
*** Without Bison you will not be able to build PostgreSQL from Git nor
*** change any of the parser definition files.  You can obtain Bison from
*** a GNU mirror site.  (If you are using the official distribution of
*** PostgreSQL then you do not need to worry about this, because the Bison
*** output is pre-generated.)
checking for flex... no
configure: WARNING:
*** Without Flex you will not be able to build PostgreSQL from Git nor
*** change any of the scanner definition files.  You can obtain Flex from
*** a GNU mirror site.  (If you are using the official distribution of
*** PostgreSQL then you do not need to worry about this because the Flex
*** output is pre-generated.)

答:不会影响编译出来的PostgreSQL的功能。该警告的意思是说没有Bison和Flex工具,因此无法使用Git方式编译。这里未使用Git,所以没有影响。Bison是自动生成语法分析器的程序,Flex则是自动生成词法分析器的程序,在PostgreSQL中主要用于SQL的词法解析和语法解析。因为源码包中已经生成了词法解析和语法解析的C源代码,所以没有Bison和Flex也可以正常编译。当然也可以安装Bison和Flex这两个工具,命令如下:


sudo aptitude install bison flex

问题四:在运行make时报“cannot find -lperl”错误,示例如下:


gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fpic -shared -o plperl.so plperl.o SPI.o Util.o -L../../../src/port -Wl,--as-needed -Wl,-rpath,'/usr/lib/perl/5.14/CORE',--enable-new-dtags  -fstack-protector -L/usr/local/lib  -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lc -lcrypt 
/usr/bin/ld: cannot find -lperl
collect2: error: ld returned 1 exit status
make[3]: *** [plperl.so] Error 1
make[3]: Leaving directory `/home/osdba/src/postgresql-9.2.3/src/pl/plperl'
make[2]: *** [all-plperl-recurse] Error 2
make[2]: Leaving directory `/home/osdba/src/postgresql-9.2.3/src/pl'
make[1]: *** [all-pl-recurse] Error 2
make[1]: Leaving directory `/home/osdba/src/postgresql-9.2.3/src'
make: *** [all-src-recurse] Error 2

答:这是因为在运行“./configure”时加了--with-perl但未安装perl开发包。注意,未安装perl开发包在运行“./configure”时并不报错,而make的时候会报错。在Debian或Ubuntu下,只需安装libperl-dev包即可: Iw0YfrA6SPkSqFEDZJvHSLLnEfj4Q1bW/UWAUsaCQWOCfNaH9+b0jrI0K/oRcHEl


sudo aptitude install libperl-dev

点击中间区域
呼出菜单
上一章
目录
下一章
×