丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
1.简单版
./configuremakesumakeinstalladduserpostgresmkdir/usr/local/pgsql/datachownpostgres/usr/local/pgsql/datasu-postgres/usr/local/pgsql/bin/initdb-D/usr/local/pgsql/data/usr/local/pgsql/bin/postgres-D/usr/local/pgsql/data>logfile2>&1&/usr/local/pgsql/bin/createdbtest/usr/local/pgsql/bin/psqltest本章剩余部分都是完全版。
2.要求
编译PostgreSQL需要下列软件包:
下列包是可选的。在默认配置的时候并不要求它们,但是如果打开了一些编译选项之后就需要它们了,如下文所解释的:
如果你正从Git树而不是使用发布的源代码包进行编译,或者你想做服务器端开发,那么你还需要下面的包:
还要检查一下你是否有足够的磁盘空间。你将大概需要近100MB用于存放编译过程中的源码树和大约20MB用于安装目录。一个空数据库集簇大概需要35MB。一个数据库所占的空间大约是存储同样数据的平面文件所占空间的五倍。如果你要运行回归测试,还临时需要额外的150MB。请用df命令检查剩余磁盘空间。
3.获取源码
gunzippostgresql-9.6.0.tar.gztarxfpostgresql-9.6.0.tar(如果你得到的是.bz2文件,请用bunzip2代替gunzip)。这样将在当前目录创建一个目录postgresql-9.6.0,里面是PostgreSQL源代码。进入这个目录完成安装过程的其他步骤。
你也可以直接从版本控制库中获得源代码.
4.安装过程
1.配置
安装过程的第一步就是为你的系统配置源代码树并选择你喜欢的选项。这个工作是通过运行configure脚本实现的,对于默认安装,你只需要简单地输入:
mkdirbuild_dircdbuild_dir/path/to/source/tree/configure[optionsgohere]make默认设置将编译服务器和辅助程序,还有只需要C编译器的所有客户端程序和接口。默认时所有文件都将安装到/usr/local/pgsql。
你可以通过给出下面的configure命令行选项中的一个或更多的选项来自定义编译和安装过程:
--prefix=PREFIX
把所有文件装在目录PREFIX中而不是/usr/local/pgsql中。实际的文件会安装到数个子目录中;没有一个文件会直接安装到PREFIX目录里。
如果你有特殊需要,你还可以用下面的选项自定义不同的子目录的位置。不过,如果你把这些设置保留默认,那么安装将是可重定位的,意思是你可以在安装过后移动目录(man和doc位置不受此影响)。
对于可重定位的安装,你可能需要使用configure的--disable-rpath选项。还有,你需要告诉操作系统如何找到共享库。
--exec-prefix=EXEC-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。
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-extra-version=STRING
把STRING追加到PostgreSQL版本号。例如,你可以使用它来标记从未发布的Git快照或者包含定制补丁(带有一个如gitdescribe标识符之类的额外版本号或者一个分发包发行号)创建的二进制文件。
--with-includes=DIRECTORIES
DIRECTORIES是一个冒号分隔的目录列表,这些目录将被加入编译器的头文件搜索列表中。如果你有一些可选的包(例如GNUReadline)安装在非标准位置,你就必须使用这个选项,以及可能还有相应的--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]
要使用这个选项,你需要一个GettextAPI的实现。见上文。
--with-pgport=NUMBER
--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
默认的Kerberos服务主的名称(也被GSSAPI使用)。默认是postgres。通常没有理由改变这个值,除非你是一个Windows环境,这种情况下该名称必须被设置为大写形式POSTGRES。
--with-openssl
编译SSL(加密)连接支持。这个选项需要安装OpenSSL包。configure将会检查所需的头文件和库以确保你的OpenSSL安装足以让配置继续下去。
--with-pam
编译PAM(可插拔认证模块)支持。
--with-bsd-auth
编译BSD认证支持(BSD认证框架目前只在OpenBSD上可用)。
--with-ldap
为认证和连接参数查找编译LDAP支持(详见Section32.17和Section20.3.7)。在Unix上,这需要安装OpenLDAP包。在Windows上将使用默认的WinLDAP库。configure将会检查所需的头文件和库以确保你的OpenLDAP安装足以让配置继续下去。
--with-systemd
--without-readline
避免使用Readline库(以及libedit)。这个选项禁用了psql中的命令行编辑和历史,因此我们不建议这么做。
--with-libedit-preferred
更倾向于使用BSD许可证的libedit库而不是GPL许可证的Readline。这个选项只有在你同时安装了两个库时才有意义,在那种情况下默认会使用Readline。
--with-bonjour
编译Bonjour支持。这要求你的操作系统支持Bonjour。在OSX上建议使用。
--with-uuid=LIBRARY
使用指定的UUID库编译uuid-ossp模块(提供生成UUID的函数)。LIBRARY必须是下列之一:
--with-ossp-uuid
--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
--disable-float4-byval
禁用float4值的"传值",导致它们只能被"传引用"。这个选项会损失性能,但是在需要兼容使用C编写并使用"version0"调用规范的老用户定义函数时可能需要这个选项。更好的长久解决方案是将任何这样的函数更新成使用"version1"调用规范。
--disable-float8-byval
--with-segsize=SEGSIZE
--with-blocksize=BLOCKSIZE
设置块尺寸,以K字节计。这是表内存储和I/O的单位。默认值(8K字节)适合于大多数情况,但是在特殊情况下可能其他值更有用。这个值必须是2的幂并且在1和32(K字节)之间。注意修改这个值需要一次initdb。
--with-wal-segsize=SEGSIZE
设置WAL段尺寸,以M字节计。这是WAL日志中每一个独立文件的尺寸。调整这个值来控制传送WAL日志的粒度非常有用。默认尺寸为16M字节。这个值必须是2的幂并且在1到64(M字节)之间。注意修改这个值需要一次initdb。
--with-wal-blocksize=BLOCKSIZE
设置WAL块尺寸,以K字节计。这是WAL日志存储和I/O的单位。默认值(8K字节)适合于大多数情况,但是在特殊情况下其他值更好有用。这个值必须是2的幂并且在1到64(K字节)之间。注意修改这个值需要一次initdb。
--disable-spinlocks
即便PostgreSQL对于该平台没有CPU自旋锁支持,也允许编译成功。自旋锁支持的缺乏会导致较差的性能,因此这个选项只有当编译终端或者通知你该平台缺乏自旋锁支持时才应被使用。如果在你的平台上要求使用该选项来编译PostgreSQL,请将此问题报告给PostgreSQL的开发者。
--disable-thread-safety
禁用客户端库的线程安全性。这会阻止libpq和ECPG程序中的并发线程安全地控制它们私有的连接句柄。
--with-system-tzdata=DIRECTORY
这个选项主要针对那些很了解他们的目标操作系统的二进制包发布者。使用这个选项主要优点是不管何时当众多本地夏令时规则之一改变时,PostgreSQL包不需要被升级。另一个优点是如果时区数据库文件在安装时不需要被编译,PostgreSQL可以被更直接地交叉编译。
--without-zlib
避免使用Zlib库。这样就禁用了pg_dump和pg_restore中对压缩归档的支持。这个选项只适用于那些没有这个库的少见的系统。
--enable-debug
把所有程序和库以带有调试符号的方式编译。这意味着你可以通过一个调试器运行程序来分析问题。这样做显著增大了最后安装的可执行文件的大小,并且在非GCC的编译器上,这么做通常还要关闭编译器优化,这些都导致速度的下降。但是,如果有这些符号的话,就可以非常有效地帮助定位可能发生问题的位置。目前,我们只是在你使用GCC的情况下才建议在生产安装中使用这个选项。但是如果你正在进行开发工作,或者正在使用beta版本,那么你就应该总是打开它。
--enable-coverage
如果在使用GCC,所有程序和库都会用代码覆盖率测试工具编译。在运行时,它们会在编译目录中生成代码覆盖率度量的文件。这个选项只用于GCC以及做开发工作时。
--enable-profiling
如果在使用GCC,所有程序和库都被编译成可以进行性能分析。在后端退出时,将会创建一个子目录,其中包含用于性能分析的gmon.out文件。这个选项只用于GCC和做开发工作时。
--enable-cassert
打开在服务器中的assertion检查,它会检查许多"不可能发生"的条件。它对于代码开发的用途而言是无价之宝,不过这些测试可能会显著地降低服务器的速度。并且,打开这个测试不会提高你的系统的稳定性!这些断言检查并不是按照严重性分类的,因此一些相对无害的小故障也可能导致服务器重启—只要它触发了一次断言失败。目前,我们不推荐在生产环境中使用这个选项,但是如果你在做开发或者在使用beta版本的时候应该打开它。
--enable-depend
--enable-dtrace
为PostgreSQL编译对动态跟踪工具DTrace的支持。
要指向dtrace程序,必须设置环境变量DTRACE。这通常是必需的,因为dtrace通常被安装在/usr/sbin中,该路径可能不在搜索路径中。
dtrace程序的附加命令行选项可以在环境变量DTRACEFLAGS中指定。在Solaris上,要在一个64位二进制中包括DTrace,你必须为configure指定DTRACEFLAGS="-64"。例如,使用GCC编译器:
./configureCC='gcc-m64'--enable-dtraceDTRACEFLAGS='-64'...使用Sun的编译器:
./configureCC='/opt/SUNWspro/bin/cc-xtarget=native64'--enable-dtraceDTRACEFLAGS='-64'...--enable-tap-tests
启用PerlTAP工具进行测试。这要求安装了Perl以及Perl模块IPC::Run。
如果你喜欢用那些和configure选取的不同的C编译器,那么你可以你的环境变量CC设置为你选择的程序。默认时,只要gcc可以使用,configure将选择它,或者是该平台的默认(通常是cc)。类似地,你可以用CFLAGS变量覆盖默认编译器标志。
你可以在configure命令行上指定环境变量,例如:
./configureCC=/opt/bin/gccCFLAGS='-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时的依赖性。另外这里指定的是Python2还是Python3(或者是隐式选择)决定了PL/Python语言的哪一种变种将成为可用的。
TCLSH
Tcl解释器的全路径。这将被用来决定编译PL/Tcl时的依赖性,并且它将被替换到Tcl脚本中。
XML2_CONFIG
用于定位libxml安装的xml2-config程序。
Note:在开发服务器内部代码时,我们推荐使用配置选项--enable-cassert(它会打开很多运行时错误检查)和--enable-debug(它会提高调试工具的有用性)。
如果在使用GCC,最好使用至少-O1的优化级别来编译,因为不使用优化(-O0)会禁用某些重要的编译器警告(例如使用未经初始化的变量)。但是,非零的优化级别会使调试更复杂,因为在编译好的代码中步进通常将不能和源代码行一一对应。如果你在尝试调试优化过的代码时觉得困惑,将感兴趣的特定文件使用-O0编译。一种简单的方式是传递一个选项给make:makePROFILE=-O0file.o。
2.编译
要开始编译,键入:
make(一定要记得用GNUmake)。依你的硬件而异,编译过程可能需要5分钟到半小时。显示的最后一行应该是:
AllofPostgreSQLsuccessfullymade.Readytoinstall.如果你希望编译所有能编译的东西,包括文档(HTML和手册页)以及附加模块(contrib),这样键入:
makeworld显示的最后一行应该是:
PostgreSQL,contrib,anddocumentationsuccessfullymade.Readytoinstall.3.回归测试
如果你想在安装文件前测试新编译的服务器,那么你可以在这个时候运行回归测试。回归测试是一个用于验证PostgreSQL在你的系统上是否按照开发人员设想的那样运行的测试套件。键入:
4.安装文件
Note:如果你正在升级一套现有的系统,请阅读Section18.6其中有关于升级一个集簇的指导。
要安装PostgreSQL,输入:
makeinstall这条命令将把文件安装到在step1中指定的目录。确保你有足够的权限向该区域写入。通常你需要用root权限做这一步。或者你也可以事先创建目标目录并且分派合适的权限。
要安装文档(HTML和手册页),输入:
makeinstall-docs如果你按照上面的方法编译了所有东西,输入:
makeinstall-world这也会安装文档。
你可以使用makeinstall-strip代替makeinstall,在安装可执行文件和库文件时把它们剥离。这样将节约一些空间。如果你编译时带着调试支持,那么抽取将有效地删除调试支持,因此我们应该只是在不再需要调试的时候做这些事情。install-strip力图做一些合理的工作来节约空间,但是它并不了解如何从可执行文件中抽取每个不需要的字节,因此,如果你希望节约所有可能节约的磁盘空间,那么你可能需要手工做些处理。
标准的安装只提供客户端应用开发和服务器端程序开发所需的所有头文件,例如用C写的定制函数或者数据类型(在PostgreSQL8.0之前,后者需要独立地执行一次makeinstall-all-headers命令,不过现在这个步骤已经融合到标准的安装步骤中)。
只安装客户端:.如果你只想装客户应用和接口,那么你可以用下面的命令:
make-Csrc/bininstallmake-Csrc/includeinstallmake-Csrc/interfacesinstallmake-Cdocinstallsrc/bin中有一些服务器专用的二进制文件,但是它们很小。
卸载:.要撤销安装可以使用命令makeuninstall。不过这样不会删除任何创建出来的目录。
清理:.在安装完成以后,你可以通过在源码树里面用命令makeclean删除编译文件。这样会保留configure程序生成的文件,这样以后你就可以用make命令重新编译所有东西。要把源码树恢复为发布时的状态,可用makedistclean命令。如果你想从同一棵源码树上为多个不同平台制作,你就一定要运行这条命令并且为每个编译重新配置(另外一种方法是在每种平台上使用一套独立的编译树,这样源代码树就可以保留不被更改)。
如果你执行了一次制作,然后发现你的configure选项是错误的,或者你修改了任何configure所探测的东西(例如,升级了软件),那么在重新配置和编译之前运行一下makedistclean是个好习惯。如果不这样做,你修改的配置选项可能无法传播到所有需要变化的地方。
5.安装后设置
5.1.共享库
在一些有共享库的系统里,你需要告诉你的系统如何找到新安装的共享库。那些并不是必须做这个工作的系统包括FreeBSD、HP-UX、Linux、NetBSD、OpenBSD和Solaris。
设置共享库的搜索路径的方法因平台而异,但是最广泛使用的方法是设置环境变量LD_LIBRARY_PATH,例如在Bourneshells(sh、ksh、bash、zsh)中:
LD_LIBRARY_PATH=/usr/local/pgsql/libexportLD_LIBRARY_PATH或者在csh或tcsh中:
在有些系统上,更好的方法可能是在编译之前设置环境变量LD_RUN_PATH。
在Cygwin上,把库目录放在PATH中或者把.dll文件移动到bin目录。
如果有疑问,请参考你的系统的手册页(可能是ld.so或rld)。如果稍后你收到下面这样的消息:
如果你用的系统是Linux,并且你还有root权限,那么你可以在安装之后运行:
/sbin/ldconfig/usr/local/pgsql/lib(或者等效的目录)以便让运行时链接器更快地找到共享库。请参考ldconfig的手册页获取更多信息。在FreeBSD、NetBSD和OpenBSD上,命令是:
/sbin/ldconfig-m/usr/local/pgsql/lib我们不知道其它的系统有等效的命令。
5.2.环境变量
如果你安装到/usr/local/pgsql或者其他默认不在搜索路径中的地方,那你应该在你的PATH环境变量里面增加一个/usr/local/pgsql/bin(或者是你在step1时给选项--bindir设置的任何值)。严格来说,这些都不是必须的,但这么做可以让你使用PostgreSQL更方便。
要做这些事情,把下面几行加到你的shell启动文件,如~/.bash_profile(如果想影响所有用户就放在/etc/profile):
PATH=/usr/local/pgsql/bin:$PATHexportPATH如果你用的是csh或者tcsh,那么用这条命令:
setpath=(/usr/local/pgsql/bin$path)为了让你的系统找得到man文档,你需要加类似下面的一行到一个shell启动文件里(除非你安装到了默认搜索的位置):
MANPATH=/usr/local/pgsql/share/man:$MANPATHexportMANPATH环境变量PGHOST和PGPORT为客户端应用指定了数据库服务器的主机和端口,它们会覆盖编译时的默认项。如果你想从远程运行客户端应用,那么为每个准备使用该数据库的用户都设置PGHOST将会非常方便。但这不是必须的,而且大部分客户端程序也可以通过命令行选项替换这些设置。
6.平台支持
如果代码包含规定要工作在一个平台(即一种CPU架构和操作系统的结合)上并且它最近已经被验证能在该平台上编译并通过其回归测试,PostgreSQL开发社区才会认为该平台是被支持的。目前,大部分平台兼容性的测试都是由PostgreSQL编译农场的测试机器自动完成的。如果你对在一个并没有出现在编译农场中的平台上运行PostgreSQL感兴趣,但是代码确实能够工作或者能被修改得工作,我们强烈鼓励你建立一个编译农场成员机器,这样进一步的兼容性可以被确认。
通常,PostgreSQL被期望能在这些CPU架构上工作:x86、x86_64、IA64、PowerPC、PowerPC64、S/390、S/390x、Sparc、Sparc64、ARM、MIPS、MIPSEL、M68K和PA-RISC。存在对M32R和VAX的代码支持,但是这些架构上并没有近期测试的报告。通常也可以在一个为支持的CPU类型上通过使用--disable-spinlocks配置来进行编译,但是性能将会比较差。
如果你在一个平台上有安装问题,并且该平台根据最近的编译农场结果已经可以被支持,请将问题报告给pgsql-bugs@postgresql.org。如果你有兴趣将PostgreSQL移植到一个新的平台,pgsql-hackers@postgresql.org是一个合适的讨论它的地方。
7.1.AIX
PostgreSQL能在AIX上工作,但是正确地安装它却富有挑战性。从4.3.3到6.1的AIX被认为是可支持的。你可以使用GCC或本地IBM编译器xlc。通常,使用最新版本的AIX和PostgreSQL能有所帮助。在编译农场中检查有关已知能工作的AIX版本的最新信息。
被支持的AIX版本的最小推荐修理级别是:
AIX4.3.3
MaintenanceLevel11+postML11bundle
AIX5.1
MaintenanceLevel9+postML9bundle
AIX5.2
TechnologyLevel10ServicePack3
AIX5.3
TechnologyLevel7
AIX6.1
BaseLevel
要检查你当前的修理级别,在AIX4.3.3至AIX5.2ML7中使用oslevel-r,或者在后面的版本中使用oslevel-s。
如果你已经在/usr/local中安装了Readline或libz,在你自己的选项之外使用下列configure标志:--with-includes=/usr/local/include--with-libraries=/usr/local/lib.
7.1.1.GCC问题
在AIX5.3上,使用GCC编译和运行PostgreSQL有一些问题。
你将要使用GCC继3.3.2之后的一个版本,特别是如果你在使用一个打包好的版本。我们在4.0.1上获得了成功。早期版本的问题看起来更多地与IBM打包的GCC有关,而非GCC真正的问题,因此如果你自己编译GCC,你更有可能使用早期版本的GCC取得成功。
7.1.2.Unix域套接字崩溃
AIX5.3有一个问题是sockaddr_storage定义得不够大。在版本5.3中,IBM增加了sockaddr_un(Unix域套接字的地址结构)的尺寸,但是没有相应地增加sockaddr_storage的尺寸。这样做的结果是在PostgreSQL中尝试使用Unix域套接字会导致libpq让该数据结构溢出。TCP/IP连接工作正常,但是Unix域套接字不行,这将使回归测试不能工作。
该问题已经被报告给了IBM,并且已被记录为缺陷报告PMR29657。如果你升级到maintenancelevel5300-03或更新,将会包括这个修复。一种快速的解决方法是把/usr/include/sys/socket.h中的_SS_MAXSIZE改成1025。在两种情况中,一旦你得到了修正过的头文件,你都需要重编译PostgreSQL。
7.1.3.Internet地址问题
PostgreSQL依赖系统的getaddrinfo函数来解析listen_addresses、pg_hba.conf等中的IP地址。旧版本的AIX在这个函数中有各种各样的缺陷。如果你存在与此有关的问题,更新到上文所示的合适的AIXfixlevel将会解决它。
一个用户报告:
当在AIX5.3上实现PostgreSQL版本8.1时,我们会周期性地碰到问题,在其中统计收集器会"神秘地"无法成功启动。这似乎是在IPv6实现中意外行为的结果。看起来PostgreSQL和IPv6无法和AIX5.3一起很好地工作。
下面任意一种动作都可以"修复"该问题。
(asroot)#ifconfiglo0inet6::1/0deletehosts=local,bind将其换成:
hosts=local4,bind4来使IPv6地址的搜索无效。
Warning
这实际上是对有关IPv6支持不成熟性的问题的一种变通方案,这在AIX5.3发布的过程中有了显著地改进。它可以和AIX5.3一起工作,但是不代表对此问题的一种华丽的解决方案。有报告称该变通方案不仅仅是多余的,还会在AIX6.1上导致问题,在AIX6.1中IPv6支持已变得更加成熟。
7.1.4.内存管理
AIX的特别之处在于它的内存管理。你可能有一个装备有好多个吉字节空闲RAM的服务器,但是在运行应用时仍然会得到内存不足或者地址空间错误。一个例子是createlang会因为罕见的错误失败。例如,作为PostgreSQL安装的拥有者运行:
-bash-3.00$createlangplperltemplate1createlang:languageinstallationfailed:ERROR:couldnotloadlibrary"/opt/dbs/pgsql748/lib/plperl.so":Amemoryaddressisnotintheaddressspacefortheprocess.作为拥有PostgreSQL安装的组中的非拥有者运行:
-bash-3.00$createlangplperltemplate1createlang:languageinstallationfailed:ERROR:couldnotloadlibrary"/opt/dbs/pgsql748/lib/plperl.so":Badaddress另一个例子是PostgreSQL服务器日志中的内存不足错误,每次内存分配接近或者超过256MB时都会失败。
所有这些问题的总体成因是服务器进程所用的寻址空间和内存模型。默认情况下,所有在AIX上编译的二进制都是32位。这并不依赖于硬件类型或使用的内核。这些32位进程被限制在4GB的内存中,并被使用几种模型之一安排成256MB的段。该默认值允许在堆中低于256MB,因为它和栈共享一个单独的段。
在createlang的例子中,检查你的umask和你的PostgreSQL安装中的二进制的权限。这个例子中涉及的二进制是32位的并且被用模式750而不是755安装。由于这种方式的权限设置,只有所有者或拥有组的成员可以载入该库。因为它不是所有人可读的,载入器将该对象放在进程的堆中而不是它应该被放入的共享库段中。
这个问题的"理想的"解决方案是使用PostgreSQL的64位编译,但是这不是总是实用的,因为有32位处理器的系统可以编译64位二进制但是却不能运行它。
如果想要一个32位二进制,在开始PostgreSQL服务器之前将LDR_CNTRL设置为MAXDATA=0xn0000000,其中1<=n<=8,并且尝试不同的值以及postgresql.conf设置来找一个能让你满意的配置。这种LDR_CNTRL的使用告诉AIX你希望服务器留出MAXDATA字节给堆,以256MB的段分配。当你找到了一个可工作的配置时,ldedit可以被用来修改二进制,这样它们默认使用想要的堆尺寸。PostgreSQL也可以被重新编译,传递configureLDFLAGS="-Wl,-bmaxdata:0xn0000000"来达到相同的效果。
对于一个64位编译,设置OBJECT_MODE为64并且传递CC="gcc-maix64"和LDFLAGS="-Wl,-bbigtoc"给configure(给xlc的选项可能不同)。如果你省略OBJECT_MODE的输出,你的编译可能会因为链接器错误而失败。当OBJECT_MODE被设置时,它告诉AIX的编译工具(如ar、as和ld)默认要处理哪些对象类型。
默认情况下,过量使用页面空间的情况可能会发生。不过我们还没有看到过,当进程用尽内存并且出现了过量使用时AIX会杀死进程。我们见到过的最接近于此的是fork失败,其原因是系统觉得已经没有足够的内存给另一个进程。和AIX的很多其他部分一样,如果这成为了一个问题,页面空间分配方法和耗尽内存导致的杀死在系统范围或进程范围是可以配置的。
参考和资源
"LargeProgramSupport",AIXDocumentation:GeneralProgrammingConcepts:WritingandDebuggingPrograms.
"ProgramAddressSpaceOverview",AIXDocumentation:GeneralProgrammingConcepts:WritingandDebuggingPrograms.
"PerformanceOverviewoftheVirtualMemoryManager(VMM)",AIXDocumentation:PerformanceManagementGuide.
"PageSpaceAllocation",AIXDocumentation:PerformanceManagementGuide.
"Paging-spacethresholdstuning",AIXDocumentation:PerformanceManagementGuide.
DevelopingandPortingCandC++ApplicationsonAIX,IBMRedbook.
7.2.Cygwin
PostgreSQL可以使用Cygwin来编译,它是用于Windows的一个类Linux环境,但是这种方法不如原生Windows编译(见Chapter17)并且我们已经不再推荐在Cygwin下运行一个服务器。
makeMAX_CONNECTIONS=5check(在某些系统上你可以有大约10个同时连接)。
可以把cygserverPostgreSQL服务器安装为WindowsNT服务。关于如何这样做的信息,请参考包含在Cygwin上PostgreSQL二进制包中的README文档。它被安装在目录/usr/share/doc/Cygwin中。
7.3.HP-UX
给定合适的系统补丁级别和编译工具,PostgreSQL7.3+应该可以工作在运行HP-UX10.X或11.X的Series700/800PA-RISC机器上。至少一个开发者例行地在HP-UX10.20上测试过,并且我们有在HP-UX11.00和11.11上成功安装的报告。
除了PostgreSQL源代码发布,你将需要GNUmake(HP的make不行),并且需要GCC或HP的ANSIC编译器。如果你想从Git源编译而不是一个发布包,你还将需要Flex(GNUlex)和Bison(GNUyacc)。我们还推荐确认你真的在使用最新的HP补丁。最低限度下,如果你在HP-UX11.11上编译64位二进制,你可能需要PHSS_30966(11.11)或一个后继补丁,否则initdb可能中止:
PHSS_30966s700_800ld(1)andlinkertoolscumulativepatch
如果你正在一台PA-RISC2.0机器上编译并且想让编译好的二进制运行在PA-RISC1.1机器上,你将需要在CFLAGS中指定+DAportable。
如果你正在一台HP-UXItanium机器上编译,你将需要最新的HPANSIC编译器,以及它的依赖补丁或后继补丁:
PHSS_30848s700_800HPCCompiler(A.05.57)PHSS_30849s700_800u2comp/be/pluginlibraryPatch
如果你同时有HP的C编译器和GCC的编译器,那么在运行configure时你可能希望显式地选择要使用的编译器:
./configureCC=cc用于HP的C编译器,或者
./configureCC=gcc用于GCC。如果你忽略这个设置,configure在可以选择时会使用gcc。
默认的安装目标位置是/usr/local/pgsql,你可能希望修改它为/opt之下的某个地方。如果是这样,使用configure的--prefix开关。
在回归测试中,在几何测试中可能会有某些低序位差别,这会根据你使用的编译器和数学库版本而变化。任何其他错误都需要怀疑。
7.4.MinGW/原生Windows
用于Windows的PostgreSQL可以使用MinGW编译,它是一个用于微软操作系统的类Unix的编译环境。也可以使用微软的VisualC++编译器套件来编译。MinGW编译使用本章中描述的正常编译系统;而VisualC++编译的工作完全不同并且在Chapter17中描述。后者是一种完全原生的编译并且没有像MinGW那样使用额外软件。在PostgreSQL的主网站上有一个现成的安装器可用。
在你安装完所有的东西之后,我们建议你在CMD.EXE下运行psql,因为MSYS控制台有缓冲问题。
7.4.1.在Windows上收集崩溃转储
7.5.SCOOpenServer和SCOUnixWare
PostgreSQL可以在SCOUnixWare7和SCOOpenServer5上编译。在OpenServer上,你可以使用OpenServerDevelopmentKit或UniversalDevelopmentKit。但是可能需要一些调整,如下所述。
7.5.1.Skunkware
对于UnixWare和OpenServer,Skunkware有不同的版本。请确保你为你的操作系统安装了正确的版本,除了以下需要注意的。
在UnixWare7.1.3及其以后,GCC被包括在UDKCD上作为GNUMake。
7.5.2.GNUMake
你需要使用GNUMake程序,它位于SkunkwareCD上。默认情况下,它作为/usr/local/bin/make安装。
对于UnixWare7.1.3及以上,GNUMake程序是UDKCD的OSTK部分,并且在/usr/gnu/bin/gmake中。
7.5.3.Readline
默认情况下,Readline安装到/usr/local/lib和/usr/local/include。但是,PostgreSQLconfigure程序在没有得到帮助的情况下将不能找到它。如果你安装了Readline,那么对configure使用下列选项:
./configure--with-libraries=/usr/local/lib--with-includes=/usr/local/include7.5.4.在OpenServer上使用UDK
如果你正在OpenServer上使用新的UniversalDevelopmentKit(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"7.5.5.阅读PostgreSQL手册页
默认情况下,PostgreSQL手册页被安装到/usr/local/pgsql/share/man。默认情况下,UnixWare不会在那里查看手册页。要能够阅读它们你需要修改/etc/default/man中的MANPATH变量,例如:
MANPATH=/usr/lib/scohelp/%L/man:/usr/dt/man:/usr/man:/usr/share/man:scohelp:/usr/local/man:/usr/local/pgsql/share/man在OpenServer上,某些额外的研究需要被覆盖来使得手册页可用,因为其手册系统与其他平台有点不同。当前,PostgreSQL将根本不会安装它们。
7.5.6.带7.1.1b特性补充的C99问题
对于那些早于随OpenUNIX8.0.0(UnixWare7.1.2)一起发布的编译器版本的编译器,它们包括7.1.1b特性补充,你可能需要在CFLAGS或CC环境变量中指定-Xb。这种问题的迹象是在编译引用内联函数的tuplesort.c时的一个错误。显然在7.1.2(8.0.0)及以后的编译器中已有修改。
7.5.7.UnixWare上的线程
对于线程,你必须在所有使用libpq的程序上使用-Kpthread。libpq使用pthread_*调用,这些只能在有-Kpthread/-Kthread标志的情况下可用。
7.6.Solaris
PostgreSQL在Solaris上得到了很好的支持。你的操作系统越新,你将会碰到更少的问题;细节如下。
7.6.1.要求的工具
你可以使用GCC或Sun的编译器套件进行编译。为了更好的代码优化,我们强烈推荐在SPARC架构下使用Sun的编译器。我们已经得到一些使用GCC2.95.1时的问题报告;我们推荐GCC2.95.3或之后的版本。如果你正在使用Sun的编译器,注意不要选择/usr/ucb/cc;而是使用/opt/SUNWspro/bin/cc。
7.6.2.OpenSSL的问题
当你编译PostgreSQL带有OpenSSL支持时,你可能在下列文件中得到编译错误:
这是由于标准/usr/include/crypt.h头部和OpenSSL提供的头文件之间的一个名字空间冲突导致的。
升级你的OpenSSL安装到版本0.9.6a来修复这个问题。Solaris9及以上有一个更新版本的OpenSSL。
7.6.3.configure抱怨一个失败的测试程序
如果configure抱怨一个失败的测试程序,可能的情况是运行时链接器无法找到某些库,可能是libz、libreadline或某些其他非标准库如libssl。要向它指出正确的位置,在configure命令行上设置LDFLAGS环境变量,例如:
configure...LDFLAGS="-R/usr/sfw/lib:/opt/sfw/lib:/usr/local/lib"更多信息可见ld手册页。
7.6.4.64-位编译有时会崩溃
在Solaris7和更老的版本上,64-位版本的libc有一个有缺陷的vsnprintf例程,这导致PostgreSQL中不稳定的核心转储。最简单的已知解决方案是强制PostgreSQL使用它自己的vsnprintf版本而不是库中的拷贝。要这样做,运行configure之后编辑一个由configure产生的文件:在文件src/Makefile.global中将行
LIBOBJS=改成
LIBOBJS=snprintf.o(可能有其他文件已经被列在这个变量中。顺序无影响)。然后正常编译。
7.6.5.为最优性能编译
如果你没有理由要使用SPARC上的64位二进制,最好用32位版本。64位操作较慢并且64位二进制比其32位变体要慢。并且在另一方面,AMD64CPU家族上的32位代码不是原生的,并且这也是问什么在这个CPU族中32位代码要明显地更慢。
7.6.6.用DTrace来跟踪PostgreSQL
如果你看到postgres可执行程序的链接中断并且报出下面的错误消息:
UndefinedfirstreferencedsymbolinfileAbortTransactionutils/probes.oCommitTransactionutils/probes.old:fatal:Symbolreferencingerrors.Nooutputwrittentopostgrescollect2:ldreturned1exitstatusmake:***[postgres]Error1说明你的DTrace安装太旧,无法处理静态函数中的探测。你需要Solaris10u4或更新的版本。