15.4. 安装过程

  1. 配置

    安装过程的第一步就是配置源代码树并选择你喜欢的选项。这个工作是通过运行configure脚本实现的, 对于缺省安装,你只需要简单地敲入:

    ./configure

    该脚本将运行一些测试来决定一些系统相关的变量,并检测操作系统的设置, 最后将在编译树中创建一些文件以记录它找到了什么。 如果你想保持编译目录的独立, 那么你也可以在源代码树之外的其它目录里运行configure。 这个过程也被称为VPATH 编译。这里是方法:

    mkdir build_dir
    cd build_dir
    /path/to/source/tree/configure [options go here]
    make

    缺省设置将编译服务器和应用程序,还有所有只需要C编译器的客户端程序和接口。 缺省时所有文件都将安装到/usr/local/pgsql目录。

    你可以通过给出下面的一个或多个configure命令 行选项来自定义编译和安装过程:

    --prefix=PREFIX

    把所有文件安装到PREFIX目录下而不是/usr/local/pgsql里。 实际的文件会安装到不同的子目录里; 甚至没有一个文件会直接安装到PREFIX目录里。

    如果你有特殊需要,你还可以用下面的选项自定义不同子目录的位置。 不过,即使你保持缺省设置,安装也是可以再定位的,意味着在安装之后可以移动目录(mandoc的位置不受影响)。

    为了可以再定位安装,你可能需要使用configure--disable-rpath选项。 还有,你需要告诉操作系统如何找到共享库。

    --exec-prefix=EXEC-PREFIX

    把系统结构相关的文件安装到EXEC-PREFIX, 而不是PREFIX设置的地方。 这样做可以比较方便地在不同主机之间共享系统结构相关的文件。如果你省略它, 那么EXEC-PREFIX就会被设置为等于PREFIX并且不论与系统结构相关与否的文件 都会被安装到同一目录树下,这也可能是你想要的。

    --bindir=DIRECTORY

    声明可执行程序的目录,缺省是EXEC-PREFIX/bin, 通常也就是/usr/local/pgsql/bin

    --sysconfdir=DIRECTORY

    设置各种配置文件的目录。缺省是PREFIX/etc

    --libdir=DIRECTORY

    设置库文件和可动态装载模块的目录。缺省是EXEC-PREFIX/lib

    --includedir=DIRECTORY

    设置C和C++头文件的目录。缺省是PREFIX/include

    --datarootdir=DIRECTORY

    设置各种类型只读数据文件的根目录。这只设置了一些下面的缺省选项。缺省是 PREFIX/share

    --datadir=DIRECTORY

    设置使用安装程序的只读数据文件的目录,缺省是DATAROOTDIR。 请注意这与你的数据库文件放在哪里无关。

    --localedir=DIRECTORY

    设置安装区域数据的目录,特别是消息转变目录文件。缺省是 DATAROOTDIR/locale

    --mandir=DIRECTORY

    随着PostgreSQL一起的手册页将安装到这个目录的manx子目录里。 缺省是DATAROOTDIR/man

    --docdir=DIRECTORY

    设置除"man"以外的文档文件的根目录。这只设置下面选项的缺省, 这个选项的缺省值是DATAROOTDIR/doc/postgresql

    --htmldir=DIRECTORY

    PostgreSQL的HTML-格式文档将安装在这个目录。 缺省是DATAROOTDIR

    注意: 为了让PostgreSQL能够安装在一些共享的安装位置(比如/usr/local/include), 同时又不至于和系统其它部分产生名字空间干扰,我们采取了一些措施。 首先,安装脚本会自动给datadir, sysconfdirdocdir后面附加上"/postgresql"字符串, 除非展开的完整路径名已经包含字符串"postgres"或者 "pgsql"。 比如,如果你选择/usr/local作为prefix, 那么文档将安装在/usr/local/doc/postgresql, 但如果prefix是/opt/postgres,那么它将被放到/opt/postgres/doc。 客户端接口的公共C头文件安装到了includedir,并且是名字空间无关的。 内部的头文件和服务器端的头文件都安装到includedir下的私有目录中去了。 参考每种接口的文档获取关于如何访问头文件的信息。最后,如果合适, 那么也会在libdir下创建一个私有的子目录,用于安装动态装载模块。

    --with-extra-version=STRING

    附加STRING到PostgreSQL版本号。你可以使用这个,例如, 让来自未发布的Git快照或包含自定义补丁的二进制建立带有一个额外的版本字符串, 比如一个git describe标识符或一个发布包版本号。

    --with-includes=DIRECTORIES

    DIRECTORIES是一系列冒号分隔的目录, 这些目录将被加入编译器的头文件搜索列表中。 如果你有一些可选的包(比如GNU Readline)安装在非标准位置, 你就必须使用这个选项, 以及可能还有相应的--with-libraries选项。

    例子: --with-includes=/opt/gnu/include:/usr/sup/include

    --with-libraries=DIRECTORIES

    DIRECTORIES是一系列冒号分隔的目录,这些目录是用于查找库文件的。 如果你有一些包安装在非标准位置, 你可能就需要使用这个选项(以及对应的--with-includes选项)。

    例子:--with-libraries=/opt/gnu/lib:/usr/sup/lib

    --enable-nls[=LANGUAGES]

    打开本地语言支持(NLS),也就是以非英文显示程序的消息的能力。 LANGUAGES是一个可选的空格分隔的语言代码列表,标识你想支持的语言。 比如--enable-nls='de fr'。(你提供的列表和实际支持的列表之间的交集会自动计算出来。) 如果你没有声明一个列表,那么就安装所有可用的翻译。

    要使用这个选项,你需要一个Gettext的实现。见上文。

    --with-pgport=NUMBER

    NUMBER为服务器和客户端的缺省端口(缺省是 5432)。这个端口可以在以后设置, 不过如果你在这里声明,那么服务器和客户端将有相同的编译好了的缺省值。这样会方便些。 通常选取一个非缺省值的好理由是你企图在同一台机器上运行多个PostgreSQL服务。

    --with-perl

    编译PL/Perl服务器端编程语言。

    --with-python

    编译PL/Python服务器端编程语言。

    --with-tcl

    编译PL/Tcl服务器端编程语言。

    --with-tclconfig=DIRECTORY

    Tcl安装的tclConfig.sh文件所在目录,它里面包含编译 Tcl 模块的配置信息。 这个文件通常会自动在约定俗成的位置找到这些文件,但是如果你需要一个不同版本的Tcl, 你也可以指定能找到它的目录。

    --with-gssapi

    编译支持GSSAPI认证的东西。在许多系统上,GSSAPI(通常Kerberos安装部分)系统没有安装在缺省的搜索目录下 (比如 /usr/include,/usr/lib), 所以你必须使用附加的--with-includes--with-libraries选项。 configure在继续配置之前将检查所需要的头文件和库, 以确保GSSAPI是充分可用的。

    --with-krb-srvnam=NAME

    GSSAPI使用的缺省的Kerberos服务主的名称。缺省是postgres。 通常没有理由改变这个值。除非你在Windows环境下,在这种情况下必须设置大写POSTGRES

    --with-openssl

    编译支持SSL(加密的)连接。这个选项需要安装OpenSSL包。 configure将在安装之前检查所需要的头文件和库文件以确信OpenSSL安装是充分可用的。

    --with-pam

    编译PAM(可插拔认证模块)支持。

    --with-ldap

    编译LDAP支持。 用于认证和查找连接参数(参见第 31.17 节第 19.3.7 节以获取更多信息)。 在 Unix 上,这需要OpenLDAP包的支持。 在Windows上,缺省使用WinLDAP库。 configure将会检查所需的头文件和库以确保OpenLDAP的安装是充分可用的。

    --without-readline

    避免使用Readlinelibedit库。 这样就关闭了psql里的命令行编辑和历史,因此我们不建议这么做。

    --with-libedit-preferred

    优先使用BSD-认证的libedit库而不是GPL认证的Readline库。 该选项仅在同时安装了这两个库的情况下才有意义。 缺省使用Readline库。

    --with-bonjour

    编译Bonjour支持。这要求操作系统支持Bonjour。在OS X上建议使用。

    --with-uuid=LIBRARY

    建立 uuid-ossp模块 (它提供生成UUID的函数),使用指定的UUID库。 LIBRARY必须是下列之一:

    • bsd使用在FreeBSD、NetBSD和一些其他BSD驱动的系统中找到的 UUID函数

    • e2fs使用e2fsprogs项目创建的UUID库; 这个库在大多数Linux系统和OS X上存在,并且其他平台也可以获取

    • ossp使用OSSP UUID库

    --with-ossp-uuid

    --with-uuid=ossp完全相同。

    --with-libxml

    编译libxml (开启SQL/XML支持)。需要Libxml 2.6.23或者更高版本支持这一特性。

    Libxml安装程序xml2-config可用于检测所需的编译器和链接器选项。 如果发现,PostgreSQL将自动使用它。 在一个不寻常的位置来指定libxml安装, 您可以要么设置环境变量XML2_CONFIG以指向 xml2-config附属于安装的程序 或者使用选项--with-includes--with-libraries

    --with-libxslt

    当编译 xml2模块时,使用libxslt。 xml2依赖于这个库执行XML的XSL转变。

    --disable-integer-datetimes

    禁用64 位的时间戳整数存储和时间间隔支持。并且作为浮点数存储日期时间值。 在PostgreSQL8.4版本发布之前缺省浮点日期时间存储。 但它现在已经过时,因为它没有支持timestamp值的全范围的微秒精度。 然而,基于整数的日期时间存储需要一个64位的整数类型。 因此,当没有这样的类型可用时,或适用于PostgreSQL先前版本的应用程序时, 可以使用此选项。 参阅 第 8.5 节获取更多的信息。

    --disable-float4-byval

    禁用"按值传递"float4值,使它们"通过引用"传递。 此选项消耗性能,但可能需要与用C语言编写的旧的用户定义的函数兼容,并且使用 "版本 0"调用约定。一个更好的长期的解决办法是使用"版本 1"调用约定更新任何此类函数。

    --disable-float8-byval

    禁用"按值传递"传递float8值,使它们"通过引用"传递。 此选项消耗性能,但可能需要与用C语言编写的旧的用户定义的函数兼容,并且使用 "版本 0"调用约定。一个更好的长期的解决办法是使用"版本 1"调用约定更新任何此类函数 请注意,此选项不仅影响float8,而且也影响int8以及一些相关类型(如时间戳)。 在32位平台上,缺省是--disable-float8-byval。 并且它不允许选择--enable-float8-byval

    --with-segsize=SEGSIZE

    设置段大小 ,以GB为单位。 大表被分成多个操作系统文件,每个文件的大小等同于段大小。 这避免了存在许多平台上的文件大小限制。 默认段大小,1GB,在所有支持的平台上是安全的。 如果你的操作系统支持"largefile"(现在大多数支持), 你可以使用更大的段大小。 这可以帮助减少当大表工作时消耗掉的文件描述符数量。 但要小心,不要选择一个大于您的平台和您打算使用的文件系统支持的值, 你可能希望使用其他工具,比如tar, 也可以设置可用文件大小的限制。 因此建议,虽然不是绝对必要的,但该值是2的幂。 请注意,改变这个值需要初始化数据库。

    --with-blocksize=BLOCKSIZE

    设置块大小,以KB为单位。这是表中存储和I/O单元。 默认情况下,8KB,适用于大多数情况; 但是其它的值可能在特殊情况下是有用的。 该值必须是1和32之间(KB)2的幂。 请注意,改变这个值需要初始化数据库。

    --with-wal-segsize=SEGSIZE

    设置WAL段大小,以MB为单位。 这是WAL日志中每个单独的文件的大小。它可能有助于调整这个大小来控制WAL日志传送的粒度。 缺省大小为16MB。 该值必须是1和64之间(MB)2的幂。 请注意,改变这个值需要初始化数据库。

    --with-wal-blocksize=BLOCKSIZE

    设置WAL块大小,以KB为单位。 这是WAL日志中存储和I/O单元。 默认情况下,8KB,适用于大多数情况; 但是其它的值可能在特殊情况下是有用的。 该值必须是1和64之间(KB)2的幂。 请注意,改变这个值需要初始化数据库。

    --disable-spinlocks

    允许在PostgreSQL没有该平台的CPU自旋锁支持的情况下编译成功。 缺乏自旋锁的支持将导致性能恶化; 因此,只有在编译过程退出,并且告诉你说该平台缺乏自旋锁支持的时候才使用这个选项。 如果在你的平台上需要这个选项才能编译PostgreSQL, 请向PostgreSQL开发者报告这个问题。

    --disable-thread-safety

    禁用客户端库是线程安全的。 这样就允许在libpqECPG程序里的并发线程安全地控制他们私有的连接句柄。

    --with-system-tzdata=DIRECTORY

    PostgreSQL包括它自己的时区数据库, 它要求对日期和时间操作。此时区数据库实际上是与许多操作系统比如FreeBSD,Linux, and Solaris提供的IANA时区数据库兼容。 所以重新安装将是多余的。当这个选项被使用时,将使用系统在DIRECTORY中提供的时区数据库来代替PostgreSQL源代码发布中的时区数据库。 DIRECTORY必须作为绝对路径被指定。 /usr/share/zoneinfo是某些操作系统上的可能目录。 请注意,这个安装程序将不检测不匹配的或者错误的时间区域数据。 如果您使用此选项,建议您运行回归测试,以验证你指定的时区数据, 在PostgreSQL中能够很好的工作。

    该选项主要是针对那些对他们要使用的操作系统了如指掌的二进制软件包的分发者。 使用此选项的主要优势是,当许多当地白昼节约时间规则变化的任何时候,PostgreSQL包不需要升级。 另一个优点是,如果时区数据库文件在安装期间不需要被编译,PostgreSQL可以进行交叉编译更直截了当。

    --without-zlib

    避免使用Zlib库。这样就关闭了pg_dumppg_restore里面的压缩支持。 这个选项只适用于那些没有这个库的罕见的系统。

    --enable-debug

    把所有程序和库以带有调试符号的方式编译。这意味着你可以通过一个调试器运行程序来分析问题。 这样做显著增大了最后安装的可执行文件的大小,并且在非GCC的编译器上, 这么做通常还要关闭编译器优化,导致速度的下降。但是,如果有这些符号的话, 就可以非常有效地帮助解决可能发生的问题。目前, 我们只是在你使用GCC的情况下才建议在产品的安装中使用这个选项。 但是如果你正在进行开发工作,或者正在使用beta版本, 那么你就总应该打开它。

    --enable-coverage

    如果使用GCC,所有的程序和库连同代码覆盖测试设置一起被编译。 在运行时,它们与代码覆盖率度量在编译目录下生成文件。 参阅第 30.5 节 获取更多信息该选项只在使用GCC进行开发工作时使用。。

    --enable-profiling

    如果使用GCC,则编译所有程序和库,使他们可以配置。在后台退出,创建子目录, 包含配置用的gmon.out文件。 该选项只在使用GCC进行开发工作时使用。

    --enable-cassert

    打开服务器中的assertion检查,它会检查许多"不可能发生"的条件。 它对于代码开发的用途而言是无价之宝,不过这些测试可以显著减缓服务器。 并且,打开这个测试不会提高系统的稳定性!这些断言检查并不是按照错误的严重性分类的, 因此一些相对无害的小问题也可能导致服务器重启 (只要它触发了一次断言失败)。目前, 我们不推荐在产品环境中使用这个选项,但是如果你在做开发或者在使用beta版本的时候应该打开它。

    --enable-depend

    打开自动依赖性跟踪。如果打开这个选项, 那么 makefile 文件将设置为在任何头文件被修改的时候都将重新编译所有受影响的目标文件。 如果你在做开发的工作,那么这个选项很有用,但是如果你只是想编译一次并且安装, 那么这就是浪费时间。目前,这个选项只有在你使用GCC的时候才管用。

    --enable-dtrace

    编译PostgreSQL支持动态跟踪工具DTrace。 参阅第 27.4 节获取更多信息。

    指向dtrace程序,设置环境变量DTRACE。 这往往是必须的,因为dtrace 通常安装在/usr/sbin中且该目录一般不在搜索路经中。

    在环境变量DTRACEFLAGS中为dtrace程序指定 额外命令行选项。在Solaris上, 要包含64位二进制的DTrace支持,需要为configure指定DTRACEFLAGS="-64",比如, 在使用GCC编译的时候:

    ./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...

    在使用Sun编译器的时候:

    ./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ...

    --enable-tap-tests

    启用使用Perl TAP工具的测试。这需要安装Perl和Perl模块IPC::Run。 参阅第 30.4 节获取更多信息。

    如果你喜欢使用不同于configure找出来的 C 编译器, 可以将环境变量CC设置为你选择的程序。缺省时, configure将选择gcc(只要可用), 或者是该平台的缺省(通常是cc)。类似地, 你可以用CFLAGS覆盖缺省编译器标志。

    你可以在configure命令行上声明环境变量,比如:

    ./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'

    下面是可用的环境变量列表:

    BISON

    Bison程序

    CC

    C编译器

    CFLAGS

    传递给C编译器的选项

    CPP

    C预处理器

    CPPFLAGS

    传递给C预处理器的选项

    DTRACE

    dtrace程序位置

    DTRACEFLAGS

    传递给dtrace程序的选项

    FLEX

    Flex程序

    LDFLAGS

    当连接可执行文件或共享库时使用的选项

    LDFLAGS_EX

    只连接可执行文件时的额外选项

    LDFLAGS_SL

    只连接共享库时的额外选项

    MSGFMT

    本地语言支持的msgfmt程序

    PERL

    Perl解释器的完整路径。用于确定编译PL/Perl的依赖关系。

    PYTHON

    Python解释器的完整路径。用于确定编译PL/Python的依赖关系。 另外,Python 2或3是否在这声明(或另有隐式选择)决定了PL/Python 的哪种语言是可用的。 参阅第 43.1 节 获取更多详情。

    TCLSH

    Tcl解释器的完整路径。用于确定编译PL/Tcl的依赖关系。并且它将替代Tcl脚本。

    XML2_CONFIG

    xml2-config程序用于定位libxml安装。

    注意: 当开发服务器端的内部代码时,建议使用配置选项--enable-cassert(其中 打开许多运行时错误检查)和--enable-debug (可以改进调试工具的有效性)。

    如果使用GCC,最好是进行至少-O1的优化级别的编译。 因为不使用优化(-O0)会禁止一些重要的编译器警告(例如,使用未初始化变量)。 然而,非零优化级别可以进行复杂调试, 因为通过编译代码步进调试往往与源代码的行无法一对一的匹配。 如果你在试图调试优化后的代码时感到困惑,可以重新编译特定文件指定-O0。 一个简单方法来做到这一点是通过传递选项到make: make PROFILE=-O0 file.o

  2. 编译

    开始编译,键入:

    make

    (记住使用GNU make)。 依硬件不同,编译过程可能需要一些时间。显示的最后一行应该是:

    All of PostgreSQL is successfully made. Ready to install.

    如果你想要编译一切可以编译的东西,包含文档(HTML和手册页),以及额外模块(contrib) 键入:

    make world

    显示的最后一行应该是:

    PostgreSQL, contrib and HTML documentation successfully made. Ready to install.

  3. 回归测试

    如果你想在安装前测试新编译出的服务器, 那么你可以在这个时候运行回归测试。 回归测试是一个用于验证PostgreSQL在你的系统上是否按照开发人员设想的那样运行的测试套件。 敲入:

    make check

    这条命令在root用户下无法执行;请在非特权用户下运行该命令。 第 30 章 包含 关于如何解释测试结果的详细信息。 你可以在以后的任何时间通过执行这条命令来运行这个测试。

  4. 安装

    注意: 如果你正在升级一套现有的系统一定要读 第 17.6 节 中关于升级集群的说明。

    安装PostgreSQL,键入:

    make install

    这条命令将把文件安装到在步骤 1声明的目录里面去。 确保你对那个目录有足够的权限。通常你需要用 root 权限做这一步。 或者你也可以事先创建目标目录并且分派合适的权限。

    安装文档(HTML和手册页),键入:

    make install-docs

    如果上面编译了world,键入:

    make install-world

    这也会安装文档。

    你可以使用make install-strip代替make install在安装可执行文件和库文件时把它们的调试信息抽取掉。 这样将节约一些空间。如果你编译时带着调试支持,那么抽取将有效地删除调试支持, 因此我们应该只是在不再需要调试的时候做这些事情。 install-strip力图做一些合理的事情来节约空间, 但是它并不知道如何从可执行文件中抽取每个不需要的字节, 因此,如果你希望节约所有可能节约的磁盘空间,那么你可能需要手工做些处理。

    标准的安装只提供所有开发客户端应用的头文件和服务器端的程序开发, 比如用 C 写客户函数或者数据类型的头文件。 (PostgreSQL 8.0之前,后者需要单独的执行make install-all-headers命令,但是这一步现在已经被包含在标准安装中了)。

    只装客户端: 如果你只想装客户应用和接口,那么你可以用下面的命令:

    make -C src/bin install
    make -C src/include install
    make -C src/interfaces install
    make -C doc install

    src/bin中有一些仅供服务器使用的二进制文件,但是它们都很小。

卸载: 可以使用make uninstall命令卸载。 不过这样不会删除任何创建出来的目录。

清理: 在安装完成以后,你可以通过在源码树里面用命令make clean删除编译过程文件释放磁盘空间。 这样会保留configure程序生成的文件,这样以后你就可以用make命令重新编译所有东西。 要把源码树恢复为发布时的状态,用make distclean命令。 如果你想从同一棵源码树上为多个不同平台编译, 你就一定要运行这条命令并且为每个平台重新配置。 另外,在每种系统上使用一套独立的编译树,这样源代码树就可以保留不被更改。

如果你执行了一次编译,然后发现你的配置选项是错误的, 或者你修改了任何配置所探测的东西(比如升级了软件), 那么在重新配置和编译之前运行一下make distclean是个好习惯。如果不做这个事情, 你修改的配置选项可能无法传播到所有需要变化的地方。