配置
安装过程的第一步就是配置源代码树并选择你喜欢的选项。这个工作是通过运行 configure 脚本实现的,对于缺省安装,你只需要简单地敲入
./configure
该脚本将运行一些测试来猜测一些系统相关的变量,并检测操作系统的设置,最后将在编译树中创建一些文件以记录它找到了什么。如果你想保持编译目录的独立,那么你也可以在源代码树之外的其它目录里运行 configure 脚本。
缺省设置将编译服务器和应用程序,还有所有只需要 C 编译器的客户端程序和接口。缺省时所有文件都将安装到 /usr/local/pgsql 目录。
你可以通过给出下面的一个或多个 configure 命令行选项来自定义编译和安装过程:
把所有文件装在 PREFIX 目录下而不是 /usr/local/pgsql 里。实际的文件会安装到不同的子目录里;甚至没有一个文件会直接安装到 PREFIX 目录里。
如果你有特殊需要,你还可以用下面的选项自定义不同子目录的位置。不过,即使你保持缺省设置,也可以在安装之后移动目录(man 和 doc 位置不受影响),此时你可能需要使用 configure 的 --disable-rpath 选项。还有,你需要告诉操作系统如何找到共享库。
把体系相关的文件安装到 EXEC-PREFIX ,而不是 PREFIX 设置的地方。这样做可以比较方便地在不同主机之间共享体系相关的文件。如果你省略它,那么 EXEC-PREFIX 就会被设置为等于 PREFIX 并且体系相关和体系无关的文件都会安装到同一目录树下,这也可能是你想要的。
可执行程序的目录,缺省是 EXEC-PREFIX/bin,通常也就是 /usr/local/pgsql/bin
程序需要的只读文件目录。缺省是 PREFIX/share 。请注意这个目录和存放数据库文件的地方没有任何关系。
配置文件的目录,缺省为 PREFIX/etc
库文件和动态装载模块的目录。缺省是 EXEC-PREFIX/lib
C 和 C++ 头文件的目录。缺省是 PREFIX/include
随着 PostgreSQL 一起带的手册页将安装到这个目录的 manx 子目录里。缺省是 PREFIX/man
除"man"以外的文档文件将被安装到这个目录。缺省是 PREFIX/doc 。如果声明了 --without-docdir ,那么文档将不会被 make install 安装。这是给那些使用特殊方法安装文档的打包脚本使用的。
【注意】为了让 PostgreSQL 能够安装在一些共享的安装位置(比如 /usr/local/include),同时又不至于和系统其它部分产生名字空间干扰,我们采取了一些步骤。首先,安装脚本会自动给 datadir, sysconfdir, docdir 后面附加上"/postgresql"字符串,除非展开的完整路径名已经包含字符串"postgres"或"pgsql"。比如,如果你选择 /usr/local 作为前缀,那么文档将安装在 /usr/local/doc/postgresql ,但如果前缀是 /opt/postgres ,那么它将被放到 /opt/postgres/doc 。客户接口的公共C头文件安装到了 includedir ,并且是名字空间无关的。内部的头文件和服务器头文件都安装到 includedir 下的私有目录中去了。参考每种接口的文档获取关于如何得到头文件的信息。最后,如果合适,那么也会在 libdir 下创建一个私有的子目录,用于动态装载模块。
DIRECTORIES 是一系列冒号分隔的目录,这些目录将被加入编译器的头文件搜索列表中。如果你有一些可选的包(比如 GNU Readline)安装在非标准位置,你就必须使用这个选项,以及可能还有相应的 --with-libraries 选项。
例子:--with-includes=/opt/gnu/include:/usr/sup/include
DIRECTORIES 是一系列冒号分隔的目录,这些目录是用于查找库文件的。如果你有一些包安装在非标准位置,你可能就需要使用这个选项(以及对应的 --with-includes 选项)。
例子:--with-libraries=/opt/gnu/lib:/usr/sup/lib
打开本地语言支持(NLS),也就是以非英文显示程序信息的能力。LANGUAGES 是一个空格分隔的语言代码列表,标识你想支持的语言。比如 --enable-nls='de fr' 。你提供的列表和实际支持的列表之间的交集会自动计算出来。如果你没有声明一个列表,那么就安装所有可用的翻译。
要使用这个选项,你需要一个 Gettext API 的实现。见上文。
NUMBER 为服务器和客户端的缺省端口(缺省是 5432)。这个端口可以在以后设置,不过如果你在这里声明,那么服务器和客户端将有相同的编译好了的缺省值。这样会方便些。通常选取一个非缺省值的好理由是你企图在同一台机器上运行多个 PostgreSQL 服务器。
编译 PL/Perl 服务器端编程语言。
编译 PL/Python 服务器端编程语言。
编译 PL/Tcl 服务器端编程语言。
Tcl 安装的 tclConfig.sh 文件所在目录,它里面包含编译 Tcl 模块的配置信息。configure 通常会自动在约定俗成的位置找到这些文件,但是如果你需要一个不同版本的 Tcl ,你也可以声明不同的目录。
编译支持 Kerberos 5 认证的东西。在许多系统上,Kerberos 系统没有安装在缺省的搜索目录下(比如 /usr/include, /usr/lib),所以你必须使用附加的 --with-includes 和 --with-libraries 选项。configure 在继续配置之前将检查所需要的头文件和库,以确保 Kerberos 是充分可用的。
缺省的 Kerberos 服务主的名称。缺省是 postgres 。通常没有理由改变这个值。
编译支持SSL(加密的)连接。这个选项需要安装 OpenSSL 包。configure 将在安装之前检查所需要的头文件和库文件以确信 OpenSSL 安装是充分可用的。
编译 LDAP(轻量级目录访问协议)支持。用于认证和查找连接参数(参见 节29.15和节20.2.5以获取更多信息)。在 Unix 上,这需要 OpenLDAP 包的支持。configure 将会检查所需的头文件和库以确保 OpenLDAP 的安装是充分可用的。在 Windows 上,将使用缺省的 WinLDAP 库。
避免使用 Readline 与 libedit 库。这样就关闭了 psql 里的命令行编辑和历史,因此我们不建议这么做。
优先使用 libedit 库而不是 Readline 库。该选项仅在同时安装了这两个库的情况下才有意义。缺省使用 Readline 库。
编译 Bonjour 支持。这要求操作系统支持 Bonjour 。在 Mac OS X 上建议使用。
使用 64 位的整数存储时间和间隔,而不是用缺省的浮点数存储。这样做限制了数值可以表达的范围,但是保证了整个范围里的毫秒数的精度(参阅节8.5获取更多信息)。请注意整数时间的代码比浮点数时间的代码要新,我们也会偶尔发现里面有毛病。
允许在 PostgreSQL 没有该平台的 CPU 自旋锁支持的情况下编译成功。缺乏自旋锁的支持将导致性能恶化;因此,只有在编译过程退出,并且告诉你说该平台缺乏自旋锁支持的时候才使用这个选项。如果在你的平台上需要这个选项才能编译 PostgreSQL ,请向 PostgreSQL 开发者报告这个问题。
令客户端库是线程安全的。这样就允许在 libpq 和 ECPG 程序里的并发线程安全地控制他们私有的连接句柄。这个选项要求操作系统上有足够的线程支持。
避免使用 Zlib 库。这样就关闭了 pg_dump 和 pg_restore 里面的压缩支持。这个选项只适用于那些没有这个库的罕见的系统。
把所有程序和库以带有调试符号的方式编译。这意味着你可以通过一个调试器运行程序来分析问题。这样做显著增大了最后安装的可执行文件的大小,并且在非 GCC 的编译器上,这么做通常还要关闭编译器优化,导致速度的下降。但是,如果有这些符号表的话,就可以非常有效地帮助定位可能发生问题的位置。目前,我们只是在你使用 GCC 的情况下才建议在生产安装中使用这个选项。但是如果你正在进行开发工作,或者正在使用 beta 版本,那么你就总应该打开它。
打开在服务器中的 assertion 检查,它会检查许多"不可能发生"的条件。它对于代码开发的用途而言是无价之宝,不过这些测试稍微地减慢了一些速度。并且,打开这个测试不会提高系统的稳定性!这些断言检查并不是按照错误的严重性分类的,因此一些相对无害的小虫子也可能导致服务器重启 (只要它触发了一次断言失败)。目前,我们不推荐在生产环境中使用这个选项,但是如果你在做开发或者在使用 beta 版本的时候应该打开它。
打开自动倚赖性跟踪。如果打开这个选项,那么 makefile 文件将设置为在任何头文件被修改的时候都将重新编译所有受影响的目标文件。如果你在做开发的工作,那么这个选项很有用,但是如果你只是想编译一次并且安装,那么这就是浪费时间。目前,这个选项只有在你使用 GCC 的时候才管用。
打开 DTrace 支持,仅在 Solaris 平台上可用。因为 dtrace 通常安装在 /usr/sbin 中且该目录一般不在搜索路经中,所以常常需要使用 DTRACE 和 DTRACEFLAGS 环境变量指定 dtrace 程序的位置。
要包含 64 位 DTrace 支持,需要指定 DTRACEFLAGS="-64" ,比如,在使用 GCC 编译的时候:
./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...
在使用 Sun 编译器的时候:
./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ...
如果你喜欢使用不同于 configure 找出来的 C 编译器,可以将环境变量 CC 设置为你选择的程序。缺省时,configure 将选择 gcc(只要可用),或者是该平台的缺省(通常是 cc)类似地,你可以用 CFLAGS 覆盖缺省编译器标志。
你可以在 configure 命令行上声明环境变量,比如:
./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'
下面是可用的环境变量列表:
C 编译器命令
C 编译器选项
C 预处理器
C 预处理器选项
dtrace 程序的位置
传递给 dtrace 程序的选项
连接器选项
共享库上的连接器选项
msgfmt 程序的位置
Perl 解释器的完整路径。用于确定编译 PL/Perl 的依赖关系。
Python 解释器的完整路径。用于确定编译 PL/Python 的依赖关系。
Tcl 解释器的完整路径。用于确定编译 PL/Tcl 的依赖关系。
Yacc 程序(如果使用Bison则是 bison -y )
编译
要开始编译,敲入(一定要记得用 GNU make):
gmake
依硬件不同,编译过程可能需要 5-30 分钟。显示的最后一行应该是
All of PostgreSQL is successfully made. Ready to install.
回归测试
如果你想在安装文件前测试新编译的服务器,那么你可以在这个时候运行回归测试。回归测试是一个用于验证 PostgreSQL 在系统上是否按照开发人员设想的那样运行的测试套件。敲入
gmake check
这条命令在 root 里无法使用;请在非特权用户下运行该命令。章28包含关于如何解释测试结果的详细信息。你可以在以后的任何时间通过执行这条命令来运行这个测试。
安装
【注意】如果你正在升级一套现有的系统并且准备把新文件覆盖在旧文件上面,那么要记得在覆盖之前备份数据并关闭旧服务器,像上面节14.4里面解释的那样。
要安装 PostgreSQL ,键入
gmake install
这条命令将把文件安装到在 step 1 声明的目录里面去。确保你对那个目录有足够的权限。通常你需要用 root 权限做这一步。或者你也可以事先创建目标目录并且分派合适的权限。
你可以使用 gmake install-strip 代替 gmake install 在安装可执行文件和库文件时把它们的调试信息抽取掉。这样将节约一些空间。如果你编译时带着调试支持,那么抽取将有效地删除调试支持,因此我们应该只是在不再需要调试的时候做这些事情。install-strip 力图做一些合理的事情来节约空间,但是它并不知道如何从可执行文件中抽取每个不需要的字节,因此,如果你希望节约所有可能节约的磁盘空间,那么你可能需要手工做些处理。
标准的安装只提供所有开发客户端应用的头文件和服务器端的程序开发,比如用 C 写客户函数或者数据类型的头文件。
【只装客户端】如果你只想装客户应用和接口,那么你可以用下面的命令:
gmake -C src/bin install gmake -C src/include install gmake -C src/interfaces install gmake -C doc install
src/bin 中有一些仅供服务器使用的二进制文件,但是它们都很小。
【在 Windows 上注册 eventlog 】要在该操作系统上注册一个 Windows eventlog 库,在安装完毕之后执行下面的命令:
regsvr32 pgsql_library_directory/pgevent.dll
这样就创建了一个用于事件查看器的注册表项目。
【卸载】可以使用 gmake uninstall 命令卸载。不过这样不会删除任何创建出来的目录。
【清理】在安装完成以后,你可以通过在源码树里面用命令 gmake clean 删除编译过程文件。这样会保留 configure 程序生成的文件,这样以后你就可以用 gmake 命令重新编译所有东西。要把源码树恢复为发布时的状态,用 gmake distclean 命令。如果你想从同一棵源码树上为多个不同平台编译,你就一定要运行这条命令并且为每个平台重新配置。另外,在每种系统上使用一套独立的编译树,这样源代码树就可以保留不被更改。
如果你执行了一次编译,然后发现你的配置选项是错误的,或者你修改了任何 configure 所探测的东西(比如升级了软件),那么在重新配置和编译之前运行一下 gmake distclean 是个好习惯。如果不做这个事情,你修改的配置选项可能无法传播到所有需要变化的地方。