🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 15.4\. 安装过程 1. **配置** 安装过程的第一步就是配置源代码树并选择你喜欢的选项。这个工作是通过运行`configure`脚本实现的, 对于缺省安装,你只需要简单地敲入: ``` <kbd class="literal">./configure</kbd> ``` 该脚本将运行一些测试来决定一些系统相关的变量,并检测操作系统的设置, 最后将在编译树中创建一些文件以记录它找到了什么。 如果你想保持编译目录的独立, 那么你也可以在源代码树之外的其它目录里运行`configure`。 这个过程也被称为_VPATH_ 编译。这里是方法: ``` <kbd class="literal">mkdir build_dir</kbd> <kbd class="literal">cd build_dir</kbd> <kbd class="literal">/path/to/source/tree/configure [options go here]</kbd> <kbd class="literal">gmake</kbd> ``` 缺省设置将编译服务器和应用程序,还有所有只需要C编译器的客户端程序和接口。 缺省时所有文件都将安装到`/usr/local/pgsql`目录。 你可以通过给出下面的一个或多个`configure`命令 行选项来自定义编译和安装过程: `--prefix=``_PREFIX_` 把所有文件装在`_PREFIX_`目录下而不是`/usr/local/pgsql`里。 实际的文件会安装到不同的子目录里; 甚至没有一个文件会直接安装到`_PREFIX_`目录里。 如果你有特殊需要,你还可以用下面的选项自定义不同子目录的位置。 不过,即使你保持缺省设置,安装时浮动的, 意味着可以在安装之后移动目录(`man`和`doc`位置不受影响)。 为了浮动安装,你可能需要使用`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一起的手册页将安装到这个目录的`man``_x_`子目录里。 缺省是`_DATAROOTDIR_`/man。 `--docdir=``_DIRECTORY_` 设置除"man"以外的文档文件的根目录。这只设置下面选项的缺省, 这个选项的缺省值是`_DATAROOTDIR_`/doc/postgresql。 `--htmldir=``_DIRECTORY_` PostgreSQL的HTML-格式文档将安装在这个目录。 缺省是`_DATAROOTDIR_`。 > **Note:** 为了让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`下创建一个私有的子目录,用于动态装载模块。 `--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-krb5` 编译支持 Kerberos 5 认证的东西。在许多系统上, Kerberos 系统没有安装在缺省的搜索目录下(比如 `/usr/include`,`/usr/lib`), 所以你必须使用附加的`--with-includes`和`--with-libraries`选项。 `configure`在继续配置之前将检查所需要的头文件和库,以确保 Kerberos 是充分可用的。 `--with-krb-srvnam=``_NAME_` 缺省的Kerberos服务主的名称(通过GSSAPI使用)。缺省是`postgres`。 通常没有理由改变这个值。除非你在Windows环境下,在这种情况下必须设置大写`POSTGRES`。 `--with-openssl` 编译支持SSL(加密的)连接。这个选项需要安装OpenSSL包。 `configure`将在安装之前检查所需要的头文件和库文件以确信OpenSSL安装是充分可用的。 `--with-pam` 编译PAM(可插拔认证模块)支持。 `--with-ldap` 编译LDAP支持。 用于认证和查找连接参数(参见[Section 31.17](#calibre_link-1311)和[Section 19.3.8](#calibre_link-1052)以获取更多信息)。 在 Unix 上,这需要OpenLDAP包的支持。 在Windows上,缺省使用WinLDAP库。 `configure`将会检查所需的头文件和库以确保OpenLDAP的安装是充分可用的。 `--without-readline` 避免使用Readline与libedit库。 这样就关闭了psql里的命令行编辑和历史,因此我们不建议这么做。 `--with-libedit-preferred` 优先使用BSD-认证的libedit库而不是GPL认证的Readline库。 该选项仅在同时安装了这两个库的情况下才有意义。 缺省使用Readline库。 `--with-bonjour` 编译Bonjour支持。这要求操作系统支持Bonjour。在Mac OS X上建议使用。 `--with-ossp-uuid` 使用[OSSP UUID library](http://www.ossp.org/pkg/lib/uuid/)编译组件。 特别是,编译 [uuid-ossp](#calibre_link-406)模块, 它提供了函数产生UUIDs.。 `--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](#calibre_link-407)模块时,使用libxslt。 xml2依赖于这个库执行XSL转变成XML。 `--disable-integer-datetimes` 禁用64 位的时间戳整数存储和时间间隔支持。并且作为浮点数存储时间值。 在PostgreSQL发布之前的8.4版本中缺省浮点日期时间存储。 但它现在已经过时,因为它没有支持`timestamp`值的全范围的微秒精度。 然而,基于整数的日期时间存储需要一个64位的整数类型。 因此,当没有这样的类型可用时,可以使用此选项时, 或与PostgreSQL先前版本编写的应用程序兼容。 参阅 [Section 8.5](#calibre_link-783)获取更多的信息。 `--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为单位。 大表被分成多个操作系统文件,每个文件的大小等同于段大小。 这避免了存在许多平台上的文件大小限制。 默认段大小,1千兆字节,在所有支持的平台上是安全的。 如果你的操作系统支持"largefile"(现在大多数支持), 你可以使用较大的段大小。 这可以帮助减少当大表工作时消耗掉的文件描述符数量。 但要小心,不要选择一个大于通过您的平台和您打算使用的文件系统支持的值, 你可能希望使用其他工具,比如tar, 也可以设置可用文件大小的限制。 因此建议,虽然不是绝对必要的,但该值是2的幂。 请注意,改变这个值需要初始化数据库。 `--with-blocksize=``_BLOCKSIZE_` 设置_块大小_,以KB为单位。这是表中存储和I/O单元。 默认情况下,8千字节,适用于大多数情况; 但是其它的值可能在特殊情况下是有用的。 该值必须是1和32之间(千字节)2的幂。 请注意,改变这个值需要初始化数据库。 `--with-wal-segsize=``_SEGSIZE_` 设置_WAL段大小_,以MB为单位。 这是WAL日志中每个单独的文件的大小。它可能有助于调整这个大小来控制WAL日志传送的粒度。 缺省大小为16兆字节。 该值必须是1和64之间(兆字节)2的幂。 请注意,改变这个值需要初始化数据库。 `--with-wal-blocksize=``_BLOCKSIZE_` 设置_WAL块大小_,以KB为单位。 这是WAL日志中存储和I/O单元。 默认情况下,8千字节,适用于大多数情况; 但是其它的值可能在特殊情况下是有用的。 该值必须是1和64之间(千字节)2的幂。 请注意,改变这个值需要初始化数据库。 `--disable-spinlocks` 允许在PostgreSQL没有该平台的CPU自旋锁支持的情况下编译成功。 缺乏自旋锁的支持将导致性能恶化; 因此,只有在编译过程退出,并且告诉你说该平台缺乏自旋锁支持的时候才使用这个选项。 如果在你的平台上需要这个选项才能编译PostgreSQL, 请向PostgreSQL开发者报告这个问题。 `--disable-thread-safety` 禁用客户端库是线程安全的。 这样就允许在libpq和 ECPG程序里的并发线程安全地控制他们私有的连接句柄。 `--with-system-tzdata=``_DIRECTORY_` PostgreSQL包括它自己的时区数据库, 它要求对日期和时间操作。此时区数据库实际上是与许多操作系统比如FreeBSD,Linux, and Solaris提供的"zoneinfo"时区数据库兼容。 所以重新安装将是多余的。当这个选项被使用时,`_DIRECTORY_`中系统提供的时区数据库是用来代替包含在PostgreSQL源代码发布中的其中之一。 `_DIRECTORY_`必须作为绝对路径被指定。 `/usr/share/zoneinfo`是某些操作系统上的可能目录。 请注意,这个安装程序将不检测不匹配的或者错误的时间区域数据。 如果您使用此选项,建议您运行回归测试,以验证该时区的数据, 你已经指出正确使用PostgreSQL。 该选项主要是针对二进制软件包分发者,他知道目标操作系统运行良好。 使用此选项的主要优势是,当许多当地白昼节约时间规则变化的任何时候,PostgreSQL包不需要升级。 另一个优点是,如果时区数据库文件在安装期间不需要被编译,PostgreSQL可以进行交叉编译更直截了当。 `--without-zlib` 避免使用Zlib库。这样就关闭了pg_dump 和pg_restore里面的压缩支持。 这个选项只适用于那些没有这个库的罕见的系统。 `--enable-debug` 把所有程序和库以带有调试符号的方式编译。这意味着你可以通过一个调试器运行程序来分析问题。 这样做显著增大了最后安装的可执行文件的大小,并且在非GCC的编译器上, 这么做通常还要关闭编译器优化,导致速度的下降。但是,如果有这些符号表的话, 就可以非常有效地帮助定位可能发生问题的位置。目前, 我们只是在你使用GCC的情况下才建议在生产安装中使用这个选项。 但是如果你正在进行开发工作,或者正在使用beta版本, 那么你就总应该打开它。 `--enable-coverage` 如果使用GCC,所有的程序和库连同代码覆盖测试仪器一起被编译。 在运行时,它们与代码覆盖率度量在编译目录下生成文件。 参阅[Section 30.4](#calibre_link-114) 获取更多信息当做开发工作时,该选项仅用于GCC。 `--enable-profiling` 如果使用GCC,则编译所有程序和库,使他们可以描绘轮廓。在后端出口,创建子目录, 包含分析使用的`gmon.out`文件。 当做开发工作时,该选项仅用于GCC。 `--enable-cassert` 打开服务器中的_assertion_检查,它会检查许多"不可能发生"的条件。 它对于代码开发的用途而言是无价之宝,不过这些测试可以显著减缓服务器。 并且,打开这个测试不会提高系统的稳定性!这些断言检查并不是按照错误的严重性分类的, 因此一些相对无害的小虫子也可能导致服务器重启 (只要它触发了一次断言失败)。目前, 我们不推荐在生产环境中使用这个选项,但是如果你在做开发或者在使用beta版本的时候应该打开它。 `--enable-depend` 打开自动倚赖性跟踪。如果打开这个选项, 那么 makefile 文件将设置为在任何头文件被修改的时候都将重新编译所有受影响的目标文件。 如果你在做开发的工作,那么这个选项很有用,但是如果你只是想编译一次并且安装, 那么这就是浪费时间。目前,这个选项只有在你使用GCC的时候才管用。 `--enable-dtrace` 编译PostgreSQL支持动态跟踪工具DTrace。 参阅[Section 27.4](#calibre_link-1290)获取更多信息。 指向`dtrace`程序,设置环境变量`DTRACE`。 这往往是必须的,因为`dtrace` 通常安装在`/usr/sbin`中且该目录一般不在搜索路经中。 在环境变量`DTRACEFLAGS`中为`dtrace`程序指定 额外命令行选项。在Solaris上, 要包含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`命令行上声明环境变量,比如: ``` <kbd class="literal">./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'</kbd> ``` 下面是可用的环境变量列表: `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 的哪种语言是可用的。 参阅[Section 43.1](#calibre_link-883) 获取更多详情。 `TCLSH` Tcl解释器的完整路径。用于确定编译PL/Tcl的依赖关系。并且它将替代Tcl脚本。 `XML2_CONFIG` `xml2-config`程序用于定位libxml安装。 > **Note:** 当开发服务器内部代码时,建议使用配置选项`--enable-cassert`(其中 打开许多运行时错误检查)和`--enable-debug` (可以改进调试工具的有效性)。 > > 如果使用GCC,最好是进行至少`-O1`的优化级别的编译。 因为不使用优化(`-O0`)禁止一些重要的编译器警告(例如,使用未初始化变量)。 然而,非零优化级别可以进行复杂调试, 因为通过编译代码步进调试往往不会匹配一对之一源代码行。 如果你感到困惑,而试图调试优化的代码,重新编译`-O0`的指定文件。 一个简单方法来做到这一点是通过传递选项到make: `gmake PROFILE=-O0 file.o`。 2. **编译** 开始编译,键入: ``` <kbd class="literal">gmake</kbd> ``` (记住使用GNU make)。 依硬件不同,编译过程可能需要一些时间。显示的最后一行应该是: ``` All of PostgreSQL is successfully made. Ready to install. ``` 如果你想要编译一切可以编译的东西,包含文档(HTML和帮助手册),以及额外模块(`contrib`) 键入: ``` <kbd class="literal">gmake world</kbd> ``` 显示的最后一行应该是: ``` PostgreSQL, contrib and HTML documentation successfully made. Ready to install. ``` 3. **回归测试** 如果你想在安装文件前测试新编译的服务器, 那么你可以在这个时候运行回归测试。 回归测试是一个用于验证PostgreSQL在系统上是否按照开发人员设想的那样运行的测试套件。 敲入: ``` <kbd class="literal">gmake check</kbd> ``` 这条命令在root里无法使用;请在非特权用户下运行该命令。 [Chapter 30](#calibre_link-116) 包含 关于如何解释测试结果的详细信息。 你可以在以后的任何时间通过执行这条命令来运行这个测试。 4. **安装文件** > **Note:** 如果你正在升级一套现有的系统必定读 [Section 17.6](#calibre_link-633)。 它有关于升级集群的说明。 安装PostgreSQL,键入: ``` <kbd class="literal">gmake install</kbd> ``` 这条命令将把文件安装到在[step 1](#calibre_link-1088)声明的目录里面去。 确保你对那个目录有足够的权限。通常你需要用 root 权限做这一步。 或者你也可以事先创建目标目录并且分派合适的权限。 安装文档(HTML和手册页),键入: ``` <kbd class="literal">gmake install-docs</kbd> ``` 如果上面编译了world,而不是键入: ``` <kbd class="literal">gmake install-world</kbd> ``` 这也安装文档。 你可以使用`gmake install-strip`代替`gmake install`在安装可执行文件和库文件时把它们的调试信息抽取掉。 这样将节约一些空间。如果你编译时带着调试支持,那么抽取将有效地删除调试支持, 因此我们应该只是在不再需要调试的时候做这些事情。 `install-strip`力图做一些合理的事情来节约空间, 但是它并不知道如何从可执行文件中抽取每个不需要的字节, 因此,如果你希望节约所有可能节约的磁盘空间,那么你可能需要手工做些处理。 标准的安装只提供所有开发客户端应用的头文件和服务器端的程序开发, 比如用 C 写客户函数或者数据类型的头文件。 (先于PostgreSQL 8.0,后者需要单独的`gmake install-all-headers`命令,但是标准安装中已经包含这一步)。 **只装客户端:** 如果你只想装客户应用和接口,那么你可以用下面的命令: ``` <kbd class="literal">gmake -C src/bin install</kbd> <kbd class="literal">gmake -C src/include install</kbd> <kbd class="literal">gmake -C src/interfaces install</kbd> <kbd class="literal">gmake -C doc install</kbd> ``` `src/bin`中有一些仅供服务器使用的二进制文件,但是它们都很小。 **卸载:** 可以使用`gmake uninstall`命令卸载。 不过这样不会删除任何创建出来的目录。 **清理:** 在安装完成以后,你可以通过在源码树里面用命令`gmake clean`删除编译过程文件释放磁盘空间。 这样会保留`configure`程序生成的文件,这样以后你就可以用`gmake`命令重新编译所有东西。 要把源码树恢复为发布时的状态,用`gmake distclean`命令。 如果你想从同一棵源码树上为多个不同平台编译, 你就一定要运行这条命令并且为每个平台重新配置。 另外,在每种系统上使用一套独立的编译树,这样源代码树就可以保留不被更改。 如果你执行了一次编译,然后发现你的`配置`选项是错误的, 或者你修改了任何`配置`所探测的东西(比如升级了软件), 那么在重新配置和编译之前运行一下`gmake distclean`是个好习惯。如果不做这个事情, 你修改的配置选项可能无法传播到所有需要变化的地方。