在原生Windows系统上安装和运行PostgreSQL的常见问题

(英文版)最后更新:2006/03/27 11:44:24 EST

(中文版)最后更新:2006/09/22 20:30:00 CST

(英文版)当前维护人员: Dave Page (dpage@postgresql.org)

(中文版)当前维护人员:Daojing.Zhou(doudou586@gmail.com) 、金步国(MSN:csfrank122@hotmail.com)

致谢:感谢原中文版维护人员Daojing.Zhou和laser所做的开创性工作,使我这个后来者不用从零开始翻译。

本文档的最新版本(英文版)可在http://pginstaller.projects.postgresql.org/faq/FAQ_windows.html浏览。

在原生Windows平台下编译PostgreSQL的常见问题(FAQ)可在http://www.postgresql.org/files/documentation/faqs/FAQ_MINGW.html浏览。

本文档内容仅针对PostgreSQL的Windows原生版本,还有一个Cygwin模拟版本,它的FAQ文档可以在http://www.postgresql.org/files/documentation/faqs/text/FAQ_CYGWIN浏览。


支持的系统平台

1.1) PostgreSQL可以运行在哪些Windows版本上?
1.2) 我听说PostgreSQL可以在Windows NT4平台下运行,是这样吗?
1.3) PostgreSQL可以运行在Windows 95/98/ME平台下吗?

安装

2.1) 在Windows上安装PostgreSQL需要做些什么?
2.2) 自已从源代码编译PostgreSQL该怎么做?
2.3) 为何运行PostgreSQL需要一个非管理员帐号?
2.4) 可以将PostgreSQL安装在FAT分区吗?
2.5) PostgreSQL需要什么样的文件系统权限?
2.6) 为什么我不能选择Unicode编码?
2.7) 我在安装时选择了一个非英文的语言,但所有的信息仍显示为英文!
2.8) [译者添加]如何使用免安装版本完全手动安装?

常见的安装错误

3.1) PostgreSQL与/或其安装程序在启动时崩溃、不能正常启动或是启动后挂起
3.2) 安装程序声称指定的帐号是管理员帐号,但(你认为)不是!
3.3) 我收到一个类似"the user has not been granted the requested logon type at this computer(用户没有被分配必需的登录权限)"的错误信息
3.4) 在安装/运行initdb时,我收到一个权限错误信息
3.5) 我收到一个错误信息显示PostgreSQL不能从一个终端服务(Terminal Services)会话中进行安装
3.6) 安装时我改变了目录,但PostgreSQL还是安装在默认目录中
3.7) 在升级安装时,安装程序说我没有权限安装一个服务,但我是以管理员登录的
3.8) 我收到一个错误说安装包无法打开

常见的运行时错误

4.1) 我在安装一个过程语言时收到"dynamic load error"错误
4.2) 虽然我只启动了一次服务但却发现有很多postgres.exe进程


支持的系统平台

1.1) PostgreSQL可以运行在哪些Windows版本上?

PostgreSQL可运行在Windows 2000/XP/2003上,截止本文档完成时,主要是在32位的Windows版本上进行了测试。

1.2) 我听说PostgreSQL可以在Windows NT4平台下运行,是这样吗?

虽然官方未表示支持,事实上PostgreSQL可以运行在Windows NT4系统上,但存在以下一些小问题:

另外要说明的是,在Windows NT4下,我们对PostgreSQL系统所作的测试较少。

1.3) PostgreSQL可以运行在Windows 95/98/ME平台下吗?

PostgreSQL所必需的一些操作系统功能在这些操作系统下不存在,因此不能运行。如果你一定要在这些操作系统下运行PostgreSQL,你可以使用Cygwin模拟环境版本,该版本提供Win9X平台下的基本支持。

安装

2.1) 在Windows上安装PostgreSQL需要做些什么?

在Windows上安装PostgreSQL最简单的方法是从PostgreSQL的FTP站点或镜像站点下载Windows版本的安装程序,这个安装程序可以(采用默认或定制方式)在Windows上安装一个已编译好的PostgreSQL数据库软件、pgAdmin(一个图形界面的管理程序)、可选择的提供额外功能的附加模块、可选择的过程语言。

为了能够使用这个安装程序,你的计算机需要运行Windows 2000/XP/2003,同时系统的安装服务(Windows Installer)应已启用,安装程序会根据需要来创建一个(用于启动postmaster的)服务帐号,同时初始化数据库。

安装程序可从这里下载。

2.2) 自已从源代码编译PostgreSQL该怎么做?

在Windows下从源代码编译PostgreSQL的常见问题FAQ在http://www.postgresql.org/files/documentation/faqs/FAQ_MINGW.html里有编译过程的详细细节。

2.3) 为何运行PostgreSQL需要一个非管理员帐号?

当黑客利用一个软件的BUG进入一台计算机时,他就获得了这个软件运行所使用的用户帐号的权限。目前我们不知道PostgreSQL是否有这样的BUG,我们坚持使用非管理员帐号运行PostgreSQL的目的就是为了减少(万一)黑客利用在PostgreSQL发现的BUG可能对系统造成的损害。

在UNIX的世界中,(不使用管理员帐号进入系统)这已是一个常见的习惯了,在Windows世界中,微软和其他软件供应商们为了提高系统的安全性,也开始逐渐将这一操作变成标准习惯。

2.4) 可以将PostgreSQL安装在FAT分区吗?

PostgreSQL首要任务是要保证数据的完整性。FAT和FAT32文件系统不能提供这样的可靠性保障,而且FAT文件系统缺乏安全性保障,使得保护原始数据无法保证不被未经授权的更改。最后,PostgreSQL使用一项"多分点"的功能来完成表空间功能,这一特性在FAT文件系统下也是无法实现的。

NTFS文件系统是一个日志文件系统,提供了好得多的可靠性和恢复功能,而且它有较全面的访问控制功能,并提供PostgreSQL要用到的多分点功能。

基本上述原因,PostgreSQL安装程序只能在NTFS分区中完成数据库的初始化工作,而PostgreSQL服务器程序自身和一些工具程序可以安装在任何分区中。

然而也要看到,在一些系统中,特别是开发人员的电脑上,也许只有一种FAT分区,在这种情况下,你可以象正常情况下一样安装PostgreSQL,但不要进行数据库的初始化工作,在安装完成后,在FAT分区上手动执行initdb.exe程序,但安全性和可靠性就不能保证了,并且建立表空间也会失败。

2.5) PostgreSQL需要什么样的文件系统权限?

PostgreSQL的运行帐号需要对PostgreSQL安装目录下及所有子目录具有权限,同时需要对数据目录具有权限,特别是这个帐号不应具有对含有二进制程序文件的目录除了权限以外的任何权限(所有安装目录下的目录权限,安装程序均会自动设置好,所以除非你想改变什么设置,一般情况下,安装后没有任何权限设置问题)。

PostgreSQL还需要对系统DLL文件(如kernel32.dll和user32.dll以及其他DLL文件)具有权限, 默认这些权限是已分配的,但对CMD.exe程序的执行,在某些情况下,会被锁定,需额外分配此权限。

如果你在一个多用户系统中运行PostgreSQL,你应该移除非管理员对PostgreSQL目录的操作权限,用户永远不需要处理PostgreSQL文件的权限,所有的通讯都是通过libpq连接来完成,直接存取PostgreSQL数据文件会导致数据不安全和系统的不稳定!

2.6) 为什么我不能选择Unicode编码?

[注意]在PostgreSQL 8.1版本中,(UTF8)UNICODE编码在Windows平台上是完全支持的。这个条目是仅仅针对8.0版本而言的。

对于PostgreSQL而言,"UNICODE"等价于"UTF8"。Windows平台上的PostgreSQL 8.0版本对UTF8的支持是不完整的,因此不能使用。安装程序将允许你选择任何PostgreSQL和Windows同时支持的编码。

在pgsql-hackers邮件列表中,Aleksander Kmetec详细阐述了Unicode问题:

因为Postgres依赖于操作系统的一些字符串处理函数,所以操作系统需要支持数据库使用的编码。很不幸,Windows并不支持PG的某些服务端编码。

如果前面说的你不太明白,这里有一个简短的实际例子:对于一个UNICODE(即UTF8)数据库,你应当在运行initdb时使用一个兼容的locale,对我而言也就是:"sl_SI.utf8"(Linux)或"Slovenian_Slovenia.65001"(Windows)。[译者注]对于我们中国人来说则是:"zh_CN.utf8"(Linux)或"Chinese_People's Republic of China.65001"(Windows)。

虽然Windows下号称utf8的代码页(codepage)是65001,但实际上这并不是一个真正有效的代码页。相关文档最初位于http://www.sharmahd.com/tm/codepages.html,不过很可惜,现在已经不存在了。摘录内容如下:

"65000(UTF-7)和65001(UTF-8)只是伪代码页,它们并没有相应的NLS(本地语言支持)文件。这两个代码页的数字只能在调用WideCharToMultiByte()和MultiByteToWideChar() API时一起使用。"

这就意味着 UPPER(), LOWER(), ORDER BY 在UNICODE数据库上不能正确工作,甚至不能在运行initdb时使用65001代码页。虽然小小的改变一下initdb可以允许我将LC_COLLATE设为"Slovenian_Slovenia.65001",但是排序的结果仍然是一团糟。原因在前面的引用中已经解释了。

经过检查,我得到了Windows下的PG实际支持但并未公开的编码列表:

2.7) 我在安装时选择了一个非英文的语言,但所有的信息仍显示为英文!

在安装时选择的语言只是选择了安装程序的语言,要改变提示信息的语言, 首先确认你已安装了自然语言支持(Natural language support)特性,然后编辑postgresql.conf文件来改变lc_messages参数的值来选择你想要的语言。

2.8) [译者添加]如何使用免安装版本完全手动安装?

以 Windows XP SP2 默认环境进行手动安装为例,其他版本未经测试。

首先下载postgresql-8.1.4-1-binaries-no-installer.zip,假设解压后的目录是:D:\GreenAPP\pgsql(下面使用"$PG"表示该目录)。
在"$PG"目录下创建一个rootpass.txt文件,内容为数据库的超级用户密码。
准备工作到此结束,下面的步骤以管理员身份执行。

移动DLL文件[8.1.5及以上版本不需要这一步骤]:

cd $PG
move /y lib\comerr32.dll   bin\
move /y lib\krb5_32.dll    bin\
move /y lib\libeay32.dll   bin\
move /y lib\libiconv-2.dll bin\
move /y lib\libintl-2.dll  bin\
move /y lib\libpq.dll      bin\
move /y lib\pthreadGC2.dll bin\
move /y lib\ssleay32.dll   bin\

添加新的postgres用户,并将密码设为:p

net user postgres p /ADD /EXPIRES:NEVER /PASSWORDCHG:NO
net localgroup users postgres /delete

创建data目录并设置访问权限:

md data
cacls .    /T /E /P postgres:R
cacls data /T /E /P postgres:C

初始化PostgreSQL数据库,切换用户时需要手动输入postgres用户的密码:p

runas /noprofile /env /user:postgres "bin\initdb -D data -E EUC_CN --locale=\"Chinese_People's Republic of China.936\" -A md5 -U root --pwfile=rootpass.txt"

这样就安装好了。需要说明的是数据库默认编码为:EUC_CN(GB2312),区域设置为:zh_CN.GBK,数据库超级用户名为:root,密码为rootpass.txt文件内容,使用md5认证。

以后可以使用:

runas /noprofile /env /user:postgres "$PG\bin\pg_ctl start -w -D $PG\data"
启动PG,使用:
$PG\bin\pg_ctl stop -D $PG\data -m smart
关闭PG。

常见的安装错误

3.1) PostgreSQL与/或其安装程序在启动时崩溃、不能正常启动或是启动后挂起

目前这一现象最主要的原因是防病毒软件和防火墙软件造成的。如果你的电脑上安装有防火墙软件,可以试着禁用它或是卸载它。如果你的电脑上安装有防病毒软件,你也必须禁止它对PostgreSQL使用目录进行监控,如果这样还不能起作用,也许需要完全地从你的电脑中卸载它。

有一些关于nod32防病毒产品的特例情况,如果你使用这个产品,在其高级选项中,将"postmaster.exe"加入到它不处理程序列表中去(在"高级选项"中),这样就可以解决这个问题。

也有一些关于Mcafee和Panda防病毒软件以及NetLimiter网络监控软件的特例情况报告,由于一些人能够使PostgreSQL与这些软件共同工作,因此对那些PostgreSQL与这些软件不能正常运行的情况没有特殊的或是推荐的方案,问题表现出安装有一定的特殊性,有时需要卸载或重新安装。

另外还有一个问题就是如果你安装了Cygwin,并且cygwin\bin目录在系统的环境变量PATH(搜索路径)中,在cygin目录下有一些与解释型语言(TCL, perl, python)相关的DLL文件可能含有BUG会导致安装程序或是安装好的PostgreSQL运行时挂起或崩溃,只要在运行安装程序前将cygwin\bin从系统路径中删除即可!

3.2) 安装程序声称指定的帐号是管理员帐号,但(你认为)不是!

最大可能是你所指定的帐号是一个管理员帐号或是Power用户组帐号,但是你还未意识到这一点。安装程序会特别针对管理员组和Power用户组的成员进行检查。按照你原来的方法使用本地用户和工作组再操作一次 --- 打开管理员工作组,看一下有哪些成员。然后检查任何属于管理员级别的工作组(域中或本地组),同时也检查这些组的成员。 PostgreSQL可以对嵌套的工作组设置进行深入的检查。

3.3) 我收到一个类似"the user has not been granted the requested logon type at this computer(用户没有被分配必需的登录权限)"的错误信息

首先确认所指定的PostgreSQL帐号有"作为服务程序登录"和"本地登录"的权限,"本地登录"的权限只是在安装时需要,安装完成后可以根据安全策略的需要删除此权限(权限的分配和删除可进入MMC(管理控制台)程序的"本地安全策略"的子栏目,"本地登录"的权限是默认的,"作为服务程序登录"的权限正常情况下是由安装程序分配的)。

如果仍然存在此问题,打开"审核允许"权限(也在"本地安全策略"的子栏目中),同时也请通知我们在这种情况下还需要什么权限。

注意,如果你的计算机是"域"中的成员,你的安全策略设置也许是在域服务器上使用工作组安全策略来设定的。

3.4) 在安装/运行initdb时,我收到一个权限错误信息

确认PostgreSQL的运行帐号对安装的PostgreSQL目录具有(合适的)权限。安装程序会设置安装目录的权限,但并不设置其父目录的权限。详见问题 2.5可浏览所必须的权限信息。

3.5) 我收到一个错误信息显示PostgreSQL不能从一个终端服务(Terminal Services)会话中进行安装

很不幸,确实是这样。PostgreSQL的后台程序不能够从终端服务会话中运行,为了能够初始化数据库,安装程序需要启动一个独立的后台进程,因此安装程序需要从控制台中启动。如果你使用的是Windows Server 2003,你可以获取对真正控制台的远程存取权限, 为了做到这一点,可以通过执行mstsc /console命令来启动远程桌面连接,这会锁定服务器上的本地控制台而给你完全的控制权,在这种情况下,PostgreSQL的安装没有问题。

3.6) 安装时我改变了目录,但PostgreSQL还是安装在默认目录中

首先确认你更改了根目录的内容, PostgreSQL安装程序允许更改每一个模块的目录,如果你更改了根目录("PostgreSQL"),其他的子模块(如Database Server)将自动继承根目录的值作为缺省值,但是如果你只是更改了子模块的目录,系统还是会安装在缺省的目录。

3.7) 在升级安装时,安装程序说我没有权限安装一个服务,但我是以管理员登录的

解决之道是首先卸载先前的版本,这并不会删除你的数据,然后确保将新版本安装到同一目录中,就可以解决这个问题了。需要注意的是这个方法仅仅适用于小的版本升级(如:8.0.1→8.0.2),因为它们不需要转储/重载(dump/reload)。

3.8) 我收到一个错误说安装包无法打开

可能有两个原因。最可能的原因是你直接在ZIP文件中双击MSI所致,你必须将ZIP完全解压到一个临时目录中以后在运行MSI文件。另一个原因是你下载的文件已经被损坏了,可以尝试从另一个不同的镜像站点重新下载来解决问题。

常见的运行时错误

4.1) 我在安装一个过程语言时收到"dynamic load error"错误

大多数情况下这表示与某个过程语言相关的DLL文件丢失,PostgreSQL的DLL文件只包含了该语言的绑定,还需要该过程语言自身的DLL文件存在于系统的环境变量PATH(搜索路径)中。不同的过程语言需要的不同的DLL文件,详情可参见安装指南

为了找出具体哪一个DLL文件丢失,你可以使用来自微软的依赖性检查工具,它在微软的支持软件工具包中,在一个单独的安装光盘上,只要运行了 depends plpython.dll (对PL/python语言来说)就可以显示出哪一个DLL文件不存在了。

4.2) 虽然我只启动了一次服务但却发现有很多postgres.exe进程

这是正常情况。PostgreSQL使用多进程体系结构,在一个无用户连接的空系统中会有2至5个进程,一旦用户开始连接服务器,PostgreSQL的进程数就会增加。