15.8. 特殊平台的要求

本章节是讲在一些特殊平台上的PostgreSQL的安装和设置。 一定要阅读安装说明,尤其是Section 15.2。 依据回归测试结果的说明,检测 Chapter 30

对于本章节没有提到的使用平台,它们不存在以下这些特殊的平台所要注意的问题。

15.8.1. AIX

虽然PostgreSQL可以在AIX上正常工作运行,但如何能正确安装却是一个难点。 AIX的版本中,已知的,能够支持的版本范围是从4.3.3到6.1。 你可以使用GCC或本地的IBM编译器xlc。 一般情况下,使用最新版本的AIX和PostgreSQL就可以。 根据那些已知的,可以支持PostgreSQL的AIX版本号来判断应该使用的AIX版本。

支持AIX版本的最低安装级别:

AIX 4.3.3

Maintenance Level 11 + post ML11 bundle

AIX 5.1

Maintenance Level 9 + post ML9 bundle

AIX 5.2

Technology Level 10 Service Pack 3

AIX 5.3

Technology Level 7

AIX 6.1

Base Level

查看AIX的版本、发行号、ML(Maintenance Level)级别: 4.3.3到5.2 ML 7之间的版本,使用oslevel -r;之后的版本使用oslevel -s

如果您已经在/usr/local安装了Readline或者libz,除了你自己,使用以下configure参数: --with-includes=/usr/local/include --with-libraries=/usr/local/lib

15.8.1.1. GCC问题

在AIX5.3中,使用GCC编译和运行PostgreSQL存在一些问题。

你将要使用GCC 3.3.2及其之后的版本,特别是当使用的是预打包版。4.0.1版已被验证通过。 早期版本存在的问题似乎与IBM包装GCC方式比GCC实际问题更有关,所以,如果你自己编译GCC,你很可能会用GCC早期版本。

15.8.1.2. Unix-domain sockets broken 打破UNIX域套接字

AIX5.3中有一个问题, 在sockaddr_storage不定义足够大。在5.3版本中,IBM增加了sockaddr_un的大小, 地址为Unix域套接字组织结构, ,但并没有相应增加sockaddr_storage的大小。 这一结果尝试使用Unix域套接字的PostgreSQL 导致libpq溢出数据结构。 TCP/IP连接运行良好,但没有Unix域套接字, 从而避免工作中回归测试。

问题报道给IBM,并记录错误报告PMR29657。如果升级到维护级别5300-03或更高版本, 这将包括此修复程序。 一个快速的解决方法是在/usr/include/sys/socket.h中 改变_SS_MAXSIZE到1025。在这两种情况下,一旦你有校正的头文件,重新编译PostgreSQL。

15.8.1.3. 因特网地址问题

PostgreSQL依赖于系统的getaddrinfo功能 解析listen_addressespg_hba.conf等中的IP地址。 旧版本的AIX此功能有各类缺陷。如果你有有关这些设置的问题, 更新上面显示的适当AIX修复级别,应该处理它。

一个用户报告:

在AIX5.3上运行PostgreSQL8.1版本时,we periodically ran into problems where the statistics collector would "mysteriously" not come up successfully. 这似乎是在IPv6实施的意外行为结果。它看起来像PostgreSQL和IPv6,不能很好地结合在AIX 5.3上。

任何以下执行"fix"问题。

  • 删除对localhost的IPv6地址:

    (as root)
    # ifconfig lo0 inet6 ::1/0 delete

  • 删除IPv6的网络服务。 AIX上的文件/etc/netsvc.conf大致 相当于在Solaris/Linux上的/etc/nsswitch.conf。 缺省情况下,在AIX上,因此:

    hosts=local,bind

    替换:

    hosts=local4,bind4

    停用IPv6地址。

这的确是一个 有关IPv6支持不成熟问题的解决方法,在AIX5.3版本有明显改善 它曾运行与AIX5.3版本,但并不代表一个良好的解决问题的方法。 据报道,此方法不仅不必要,但在AIX 6.1,支持IPv6变得更加成熟出现问题。

15.8.1.4. 内存管理

AIX有些独特的内存管理方式。你可以有多倍数RAM千兆字节的服务器,当正运行应用程序时,但仍需摆脱内存或地址 空间错误。createlang没有不寻常错误的一个例子。 例如,运行PostgreSQL安装的所有者:

-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": A memory address is not in the address space for the process.

在PostgreSQL安装过程时作为一个非所有者运行:

-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address

另一个例子是PostgreSQL服务器日志没有内存错误, 每个内存分配接近或大于256MB。

所有这些问题的原因是默认bittedness 和服务器进程使用的内存模型。缺省情况下,所有 在AIX上编译的二进制是32位。这并不取决于 硬件类型或内核使用。这些32位进程限于使用 几个模型的256MB段中展开的4GB内存。缺省情况下允许堆中共享堆栈中的单段小于256MB。

createlang例子,上面的情况, 检查你的umask和PostgreSQL安装中二进制文件的权限 。在这个例子中涉及的二进制文件是 32位和安装模式是750而不是755。由于 以这种方式设置权限,只有所有者或拥有组成员 可以加载库。因为它不是众人可读的, 加载者将对象放入过程堆,而不是共享库段,否则被放置。

"ideal"这个解决方案是使用64位 编译的PostgreSQL,但并不总是可行的,因为 32位处理器的系统可以编译,但不能运行64位 二进制文件。

如果需要一个32位二进制,设置LDR_CNTRL to MAXDATA=0xn0000000,即1 <= n <= 8, 开始PostgreSQL服务器之前,并且尝试不同的值和postgresql.conf设置找到令人满意的配置。 LDR_CNTRL的使用告诉AIX,希望 服务器为堆预留MAXDATA字节,分配256MB的段。当你找到一个可行 配置,ldedit可以用来修改二进制文件,所以 他们默认使用所需的堆大小。 PostgreSQL也可以重新编译 ,通过configure LDFLAGS="-Wl,-bmaxdata:0xn0000000"获得同样的效果。

对于64位编译,设置OBJECT_MODE到64,并且通过CC="gcc -maix64"LDFLAGS="-Wl,-bbigtoc"configure。(xlc选项可能不同。) 如果你省略了OBJECT_MODE出口,你的编译链接错误可能失败。 当OBJECT_MODE设置了,它告诉AIX编译实用程序,比如 ar, as, 和ld,默认处理的对象类型。

缺省情况下,过量的分页空间可能发生。虽然我们有 没有看到这种情况发生,当用完 内存和访问过量,AIX将杀死进程。 这最接近我们所看到的叉失败,因为系统的决定,另一个进程没有足够的内存。 像其他许多AIX,如果这成为一个问题,分页空间分配方法和out-of-memory kill 在系统或全过程基础上可配置的。

参考资料

"Large Program Support", AIX Documentation: General Programming Concepts: Writing and Debugging Programs AIX文档:通用编程概念:编写并调试程序.

"Program Address Space Overview", AIX Documentation: General Programming Concepts: Writing and Debugging Programs AIX文档:通用编程概念:编写并调试程序.

"Performance Overview of the Virtual Memory Manager (VMM)", AIX Documentation: Performance Management Guide AIX文档:性能管理指南.

"Page Space Allocation", AIX Documentation: Performance Management Guide AIX文档:性能管理指南.

"Paging-space thresholds tuning", AIX Documentation: Performance Management Guide AIX文档:性能管理指南.

15.8.2. Cygwin

PostgreSQL可使用Cygwin编译,像一个Linux环境的 Windows,但这种方法不如本地的Windows编译,(see Chapter 16) 不再推荐。

当继续按照正常的安装过程从源代码编译时,(即./configure; make等),注意到以下Cygwin的具体不同之处:

它可以安装cygserver和 PostgreSQL服务器作为Windows NT服务。关于如何要做到这一点的信息, 请参阅README文件,包括在Cygwin中的PostgreSQL的二进制包。它被安装在目录/usr/share/doc/Cygwin

15.8.3. HP-UX

PostgreSQL 7.3+在系列700/800的PA-RISC机器 运行HP-UX 10.x或11.X,给予相应的系统补丁级别 和编译工具。至少有一个开发人员经常在HP-UX 10.20测试,我们有在HP-UX 11.00和11.11上成功安装报告。

除了PostgreSQL源分布,你将需要GNU(惠普的牌子不会做),GCC或惠普的完整ANSI C编译器。 如果你打算从Git源编译,而不是发布包,你还需要(GNU lex)和Bison (GNU yacc)。我们还建议,确定你是最新的HP修补程序。至少,如果你正在HP-UX11.11上编译64 位二进制,您可能需要PHSS_30966 (11.11)或 后继补丁,否则initdb可能会挂起:

如果您正在PA-RISC 2.0机上编译,并希望有 使用GCC的64位二进制代码,您必须使用GCC 64位版本。HP-UX PA-RISC和Itanium的GCC二进制 文件都可以从 http://www.hp.com/go/gcc获得。不要忘了同时获取并安装binutils。

如果你正在PA-RISC 2.0机上编译,并希望编译的 二进制在PA-RISC 1.1机器上运行,你将需要在CFLAGS声明+DAportable

如果你正在HP-UX Itanium机器编译,您将需要依赖于补丁或后继 修补程序的最新HP ANSI C编译器。

PHSS_30848  s700_800 HP C Compiler (A.05.57)
PHSS_30849  s700_800 u2comp/be/plugin library Patch

如果你有惠普的C编译器和GCC的,那么, 当运行configure时,你可能想 明确选择使用的编译器:

./configure CC=cc

惠普的C编译器,或

./configure CC=gcc

为GCC。如果省略此设置,然后配置 选择gcc如果它有一个选择。

缺省安装目标位置是/usr/local/pgsql,你可能想 改变在/opt中的东西。如果是这样,使用 --prefix切换到configure

在回归测试中,可能会有一些几何测试的低阶位数差异 ,它依赖于你使用的编译器和数学库版本。任何其他的错误引起怀疑。

15.8.4. IRIX

PostgreSQL已成功地运行在MIPS R8000, r10000(ip25和ip27)和r12000(ip35)处理器,运行 IRIX的6.5.5m,6.5.12,6.5.13,和6.5.26与MIPSPro编译器 版本7.30,7.3.1.2m,7.3,和7.4.4m。

你将需要MIPSPro完整的ANSI C编译器。有 试图用GCC编译的问题。这是一个与返回 某些结构的使用函数相关的已知的GCC错误(非 固定为3.0版本)。此漏洞影响inet_ntoa, inet_lnaof, inet_netof, inet_makeaddr, 和semctl的功能。它应该被固定,通过强制代码到连接libgcc的这些功能。 但一直没有这样做过测试。

据了解,7.4.1m版本的MIPSPro编译器生成 不正确的代码。当试图启动数据库,症状是"无效的主要检查站点 记录")。版本7.4.4m 是确定的;中间版本的状态是不确定的。

可能有类似下面的编译问题:

cc-1020 cc: ERROR File = pqcomm.c, Line = 427
  The identifier "TCP_NODELAY" is undefined.

                if (setsockopt(port->sock, IPPROTO_TCP, TCP_NODELAY,

一些版本中包括在sys/xti.h的TCP定义 ,所以在src/backend/libpq/pqcomm.csrc/interfaces/libpq/fe-connect.c中 添加#include <sys/xti.h>是必须的, 如果您遇到这一点,请让我们知道,我们可以制定一个适当修复。

在回归测试中,可能会有一些几何测试的低阶位数差异,它依赖于你使用的FPU。任何其他的错误引起怀疑。

15.8.5. MinGW/Native Windows

用于Windows的PostgreSQL可以使用MinGW编译,一个类似Unix开发 微软操作系统的环境,或使用 微软Visual C++编译器套件。 MinGW的开发变种使用本章描述的标准编译系统; Visual C++开发运行完全不同和在Chapter 16中描述。 这是一个完全本地开发,并且不使用附加软件,如 MinGW。在主要的PostgreSQL网站上可利用已有安装。

本地Windows端口需要Windows 2000或更高的32位或64位版本。早期的操作系统 没有足够的基础设施(但Cygwin可以用 )。MinGW,类似Unix的构建工具,和MSYS,Unix工具集合 需要运行像configureshell脚本, 可从http://www.mingw.org/下载。 不需要运行所产生的二进制文件,他们需要创建二进制文件。

你安装所有东西后,建议您根据CMD.EXE 运行psql ,因为MSYS控制台存在缓冲问题。

15.8.6. SCO OpenServer and SCO UnixWare

PostgreSQL可以建立在SCO UnixWare7和SCO OpenServer5上。 在OpenServer上,你可以使用OpenServer开发工具包 或通用的开发工具包。然而,一些调整可能 需要,如下所述。

15.8.6.1. Skunkware

你应该找到SCO Skunkware CD副本。 Skunkware CD包括UnixWare 7和OpenServer 5当前版本 。Skunkware包括互联网上可用的许多受欢迎方案的现成安装版本。 例如,gzip, gunzip, GNU Make, Flex,和Bison都 包括在内。 UnixWare7.1,此CD目前标记为开放许可软件增补,如果你没有这个CD,来自http://www.sco.com/skunkware/的软件是可用的。

为UnixWare和OpenServer,Skunkware有不同的版本。 确保为您的操作系统安装正确的版本,除下文所述。

在UnixWare 7.1.3和之外,GCC编译器包含在 UDK CD中的是GNU Make。

15.8.6.2. GNU Make

你需要使用GNU make程序,这些在Skunkware CD上 。缺省情况下,它作为/usr/local/bin/make安装。为了避免 与SCOmake程序混淆,你可能要重新命名GNUmakegmake

UnixWare 7.1.3及以上,GNU Make程序是UDK CD的OSTK部分,是在/usr/gnu/bin/gmake文件中。

15.8.6.3. Readline

Readline库在Skunkware CD上。但它并不包含在UnixWare 7.1 Skunkware CD上。如果你有 UnixWare 7.0.0或7.0.1 Skunkware CDs,您可以从 那里安装它。否则,尝试http://www.sco.com/skunkware/

缺省情况下,Readline安装到/usr/local/lib/usr/local/include。然而, PostgreSQLconfigure程序没有帮助将无法找到它 。如果你安装ReadLine,然后使用 下列选项到configure:

./configure --with-libraries=/usr/local/lib --with-includes=/usr/local/include

15.8.6.4. 在OpenServer上使用UDK

如果您正在OpenServer上使用新的通用开发工具包(UDK)编译器 ,你需要声明UDK库的位置:

./configure --with-libraries=/udk/usr/lib --with-includes=/udk/usr/include

把上面的ReadLine选项放在一起:

./configure --with-libraries="/udk/usr/lib /usr/local/lib" --with-includes="/udk/usr/include /usr/local/include"

15.8.6.5. 阅读PostgreSQL手册页

缺省情况下,PostgreSQL手册页安装到 /usr/local/pgsql/man。缺省情况下,UnixWare 不查看手册页。为了能读,你需要在/etc/default/man文件中修改 MANPATH的变量,例如:

OpenServer上,一些额外研究需要投入使手册页可用,因为帮助系统不同于其他平台。目前,PostgreSQL不安装它们。

15.8.6.6. 7.1.1b的C99问题功能补充

比OpenUNIX 8.0.0发布的更早的编译器 (UnixWare 7.1.2),包括7.1.1b功能补充,可能需要在CFLAGS或者CC 环境变量中指定-Xb。在编译tuplesort.c引用联 功能中,这一指示是一个错误。在7.1.2(8.0.0)编译器和之上显然是一个改变。

15.8.6.7. 在UnixWare上的线程

为线程,你一定全部使用libpq的程序上使用-Kpthread。 libpq使用pthread_*调用,这是唯一与-Kpthread/-Kthread标志可用的。

15.8.7. Solaris

PostgreSQL是Solaris上的良好支持。更新您的 操作系统越多,您遇到的问题越少;细节如下。

请注意,PostgreSQL与Solaris 10(更新2)捆绑在一起。 在http://pgfoundry.org/projects/solarispackages/上的官方包可用。 旧的Solaris版本(8, 9)的软件包,你能从http://www.sunfreeware.com/或者 http://www.blastwave.org/获得。

15.8.7.1. 所需工具

您可以建立与GCC或Sun的编译器套件。为 更好的代码优化,强烈建议Sun的编译器放 在SPARC架构上。当建议使用GCC 2.95.1; gcc 2.95.3或更高版本时,我们可听到问题报告。如果 您正在使用Sun的编译器,要小心,不要选择/usr/ucb/cc文件;使用/opt/SUNWspro/bin/cc文件。

你可以从http://developers.sun.com/sunstudio/downloads/那下载Sun Studio。 许多GNU工具都集成到Solaris 10,或者他们 存在于Solaris配套光盘上。如果你想要Solaris旧版本的包,你可以在 http://www.sunfreeware.com 或者http://www.blastwave.org找到这些工具。如果你想要源代码,可查阅http://www.gnu.org/order/ftp.htm

15.8.7.2. OpenSSL问题

当您建立PostgreSQL与OpenSSL支持时,你可能会得到 下列文件中的编译错误:

  • src/backend/libpq/crypt.c

  • src/backend/libpq/password.c

  • src/interfaces/libpq/fe-auth.c

  • src/interfaces/libpq/fe-connect.c

这是由于在标准/usr/include/crypt.h文件头部和由OpenSSL提供的头文件之间的命名空间冲突。

升级你的OpenSSL安装到版本0.9.6a,以修复这个 问题。 Solaris 9和以上有OpenSSL的较新版本。

15.8.7.3. 关于失败测试的编译故障

如果configure对一个失败的测试程序报错, 这可能是一个运行时链接的情况, 无法找到一些库,libz, libreadline或某些 其他非标准库,如libssl。它指向 正确的位置,在configure命令行设置LDFLAGS的环境 变量,例如,

configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib"

参阅ld手册页获得更多的信息。

15.8.7.4. 一些64位编译故障

在Solaris7及以上,libc的64位版本有一个错误 vsnprintf程序,从而导致不稳定 核心转储在PostgreSQL中。已知的最简单的解决办法是 强迫PostgreSQL利用其vsnprintf的自身版本,而不是 库副本。要做到这一点,之后运行configure编辑一个通过configure产生的文件: 在src/Makefile.global文件中,更改线路

LIBOBJS =

用来读

LIBOBJS = snprintf.o

(有可能是已经列在这个变量中的其他文件。顺序并不重要。)然后像往常一样建立。

15.8.7.5. 编译最佳性能

在SPARC架构上,Sun Studio强烈推荐汇编。尝试使用-xO5优化 标志生成速度明显加快的二进制文件。不使用任何 浮点运算修改行为的标志和errno的处理(例如, -fast)。这些标志可以提高一些非标准PostgreSQL行为,例如日期/时间计算。

如果你没有使用SPARC上64位二进制和选择32位版本的原因, 。64位操作速度较慢,64位二进制慢于32位的。 另一方面,在AMD64 CPU上32位代码不是本地的, 这就是32位代码显著慢于这个CPU的原因。

一些调节PostgreSQL的技巧和Solaris性能可以在http://www.sun.com/servers/coolthreads/tnb/applications_postgresql.jsp 中找到。本文主要侧重于T2000平台,但有关Solaris的其他硬件的许多建议很有用。

15.8.7.6. 使用DTrace跟踪PostgreSQL<

是的,使用DTrace是可能的。参阅 Section 27.4获得更多的信息。你也能在文章http://blogs.sun.com/robertlor/entry/user_level_dtrace_probes_in 中查找更多的信息。

如果你看到postgres链接可执行中止 错误信息,如

Undefined                       first referenced
 symbol                             in file
AbortTransaction                    utils/probes.o
CommitTransaction                   utils/probes.o
ld: fatal: Symbol referencing errors. No output written to postgres
collect2: ld returned 1 exit status
gmake: *** [postgres] Error 1

您的DTrace安装太旧而不能处理静态函数的探查。你需要Solaris 10u4或更高版本。