在原生 Windows 上运行和安装 PostgreSQL
支持的平台
PostgreSQL 在哪些版本的 Windows 上运行?
PostgreSQL 支持 Windows XP 及更高版本,至少从 9.0 版本开始。它将在 32 位和 64 位系统上运行。
服务器版本未在服务器发布新主要版本后发布的新操作系统版本上进行测试。例如,Windows 7 在 PostgreSQL 8.4 发布后发布,因此 PostgreSQL 8.3 不支持它。类似地,当即将发布的 RHEL 6 发布时,只有 PostgreSQL 9.0.x 将支持它。我们的目标是支持 Windows 的新版本,最迟在他们发布后的下一个 PostgreSQL 主要版本中进行支持。
有关一键式安装程序支持的平台信息,请参阅安装程序下载页面,该页面位于 Windows 下载页面 的主要位置。
有关非 Windows 平台的信息,请参阅 主要常见问题解答 和 主要下载页面。
哪些 Windows 平台不受支持?
PostgreSQL 安装程序未在以下平台上进行测试或支持
- Windows XP Embedded
- Windows 2000
- Windows NT 4
- Windows NT 3.5.x
- Windows 95/98/ME/3.x
- Windows CE
- Windows Mobile
这些平台不受支持。请不要在邮件列表中询问有关这些平台的任何帮助。
有关 嵌入式 Windows 版本上的安装 的一些更多信息,请阅读 安装故障排除说明。
我听说 NT4 和 Windows 2000 是支持的。是真的吗?
虽然没有官方支持,但 PostgreSQL 可能会在 Windows NT4 和 Windows 2000 上运行,但存在一些小问题,包括
- 安装程序可能无法正常工作,因此您需要手动从二进制 .zip 版本安装 PostgreSQL,或者自己编译。
- PostgreSQL 使用 NTFS 文件系统中称为“重新解析点”的功能来实现表空间。NT4 中不可用重新解析点,因此无法在 NT4 上使用表空间。
- Windows NT4 标准版中没有“runas.exe”,这使得从管理员帐户启动 PostgreSQL 变得很困难。
还应注意,在 NT4 上进行的测试很少。
- Windows NT 4 或 Windows 2000 上没有进行测试,因此较新版本可能无法在这些平台上运行。
请不要在邮件列表中请求有关这些已过时平台的帮助。一些 专业支持 公司可能能够为您提供帮助。
Windows 95/98/ME 呢?
PostgreSQL 需要这些平台上不可用的功能,因此无法在这些平台上运行。如果您需要在这些平台上运行 PostgreSQL,可以查看 Cygwin 端口,它对 9x 平台提供基本支持。
是否有适用于 Windows 的 64 位版本的 PostgreSQL?
是的。64 位 Windows 端口 是为 PostgreSQL 9.0 发布的。
以前版本的 PostgreSQL 的 32 位版本通常在 64 位 Windows 上运行良好。尽管它们实际上无法直接使用超过大约 1GB 的 shared_buffers,但它们仍然可以从超过 4GB 的内存中受益,因为 Windows 内核将使用该内存来缓存磁盘读取。
64 位 ODBC 驱动程序呢?
在撰写本文时,psqlODBC 源代码中存在 64 位支持,但没有 64 位 ODBC 驱动程序的官方二进制版本。请查看 psqlODBC 网站以获取详细信息。
安装
在 Windows 上安装 PostgreSQL 需要什么?
请参阅 Windows 版 PostgreSQL 下载页面,了解在 Windows 上下载和安装 PostgreSQL 的各种方法。
在 Windows 上安装 PostgreSQL 最简单的方法是使用 EnterpriseDB 维护的一键式安装程序包,您可以在上面链接的页面中获得它。这将安装 PostgreSQL 以及 pgAdmin(一个图形化管理和管理程序)、一些“contrib”模块以提供额外的专门功能,以及您选择的过程语言。将安装一个名为 StackBuilder 的程序,以帮助您下载和安装您可能需要的任何其他组件,例如 ODBC 或 JDBC 驱动程序。
从源代码编译 PostgreSQL 需要什么?
请参阅 文档,了解有关如何为 Windows 编译 PostgreSQL 的说明,包括有关支持的编译器和工具的详细信息。
为什么我需要一个非管理员帐户来运行 PostgreSQL?
当黑客使用软件包中的软件错误进入计算机时,他们将获得运行该服务的用户的权限。虽然我们不知道 PostgreSQL 中是否存在这样的错误,但我们强制使用非管理员服务帐户,以最大程度地减少黑客在找到并利用 PostgreSQL 中的错误来入侵系统的情况下可能造成的损害。
这在 Unix 世界中一直是惯例,并且随着 Microsoft 和其他供应商努力提高其系统的安全性,它也开始成为 Windows 世界中的标准做法。
请注意,随着 PostgreSQL 8.2 的发布,可以在管理员帐户下运行。PostgreSQL 8.2 及更高版本能够在启动时不可撤销地放弃管理员权限,从而确保在极不可能的情况下 PostgreSQL 被入侵时,系统其余部分仍然安全。
我可以将 PostgreSQL 安装在 FAT 分区上吗?
不支持或未在 FAT32 文件系统上使用 PostgreSQL,因为 FAT32 是一个糟糕的文件系统,无法在其上运行任何数据库。
PostgreSQL 的首要任务是数据的完整性。FAT 和 FAT32 文件系统根本无法提供运行任何数据库所需的可靠性和崩溃安全性。此外,FAT 提供的安全性功能不足,无法保护原始数据文件免遭未经授权的修改。最后,PostgreSQL 利用称为“重新解析点”的功能来实现表空间。此功能在 FAT 分区上不可用。
NTFS 文件系统是一个日志文件系统,提供更好的可靠性和崩溃恢复。此外,它具有全面的访问控制系统,并提供 PostgreSQL 使用的重新解析点功能。
因此,PostgreSQL 安装程序包不会在除 NTFS 分区之外的任何地方初始化数据库集群。服务器和实用程序可以安装在任何分区类型上。
但是,必须认识到,在极少数情况下,FAT 分区可能是唯一的选择。在这种情况下,您可以像往常一样安装 PostgreSQL,但不要初始化数据库集群。安装完成后,手动在 FAT 分区上运行“initdb.exe”程序。然而,安全性可靠性将会受到影响,任何尝试创建表空间的操作都将失败。不要在生产环境中将 PostgreSQL 用于 FAT32。
人们问这个问题最常见的原因是,当他们有一个 USB 密钥或外部硬盘驱动器,并且想要在其上放置一个 PostgreSQL 数据库时。不要这样做。您可以将 USB 密钥和外部硬盘驱动器格式化为 NTFS,并且应该这样做,如果您想要在它们上运行数据库。FAT 不是崩溃安全的,在 Windows 中不使用“安全删除...”就移除硬盘驱动器,在硬盘驱动器看来就相当于崩溃。损坏的可能性极大。如果要使用 PostgreSQL 来存储您关心的任何数据,非常重要的是,要使用 NTFS 格式化可移动驱动器。
PostgreSQL 需要什么文件系统权限?
PostgreSQL 服务帐户需要对通向服务目录的所有目录拥有读取权限。它只需要对数据目录拥有写入权限。具体而言,它不应被授予除对包含二进制文件的目录的读取权限之外的任何其他权限。(安装目录下的所有目录都由安装程序设置,所以除非您更改了某些内容,否则不会出现任何问题)。
PostgreSQL 还需要对系统 DLL 文件(如 kernel32.dll 和 user32.dll(以及其他文件))拥有读取权限,这通常在默认情况下是授予的,以及对 CMD.EXE 二进制文件拥有读取权限,在某些情况下,它可能会被锁定,需要打开。
如果您在多用户系统上运行 PostgreSQL,则应从 PostgreSQL 目录中删除所有非管理员用户的权限。任何用户永远都不需要对 PostgreSQL 文件拥有权限 - 所有通信都是通过 libpq 连接完成的。直接访问数据文件会导致信息泄露或系统不稳定!
为什么我不能选择 Unicode 作为编码?
从 PostgreSQL 8.1 开始,UTF-8 unicode 编码在 Windows 上得到完全支持。Unicode ODBC 驱动程序支持 UTF-16,JDBC 驱动程序也具有完整的 unicode 支持。
PostgreSQL 服务器不支持用于内部数据存储或在线通信的 2 字节 UTF-16 或 4 字节 UTF-32 Unicode 编码。由于 UTF-16 是 Windows 上的默认编码,并且 Windows 用户通常所说的“Unicode”就是指它,您可能认为这会成为一个问题,但实际上,这没什么问题,因为 ODBC 和 JDBC 驱动程序会处理这个问题。使用 libpq 直接的程序需要了解这一点,但其他程序则不需要了解这一点。
我在非英语环境中安装了,但所有消息都以英语显示!
安装过程中选择的语言只会选择安装程序使用的语言。要更改已安装产品的消息语言,请确保您已安装国家/地区语言支持功能。然后编辑您的 postgresql.conf 文件并将lc_messages参数的值更改为所需的语言。
常见安装错误
PostgreSQL 或安装程序在启动时崩溃、无法启动或在启动时挂起
在 Windows 上,PostgreSQL 安装和运行时出现问题的最常见原因是 Windows 脚本宿主问题、防病毒软件问题和第三方(非 Microsoft)软件防火墙。人们有时也会遇到 postgres 服务帐户密码的问题。
以下文章介绍了这些问题。请阅读这些文章并按照其说明操作,然后再寻求安装程序问题的帮助。
防病毒软件
如果您安装了任何防病毒软件,您必须排除要由 PostgreSQL 使用的数据目录,并且必须排除 postgresql.exe 进程。如果仍然无法解决问题,可能需要从计算机中完全卸载防病毒软件。
防病毒软件会干扰 PostgreSQL 的运行,因为 PostgreSQL 需要 Windows 中的文件访问命令的行为完全符合 Microsoft 的文档说明,而许多防病毒程序包含错误或意外的行为更改,会导致这些命令的行为发生细微的错误。大多数程序并不关心,因为它们以相当简单的方式访问文件。由于 PostgreSQL 会不断地从多个进程中读取和写入同一组文件,因此它往往会触发防病毒软件中的编程和设计错误,特别是与并发性相关的问题。这些问题会导致随机和不可预测的错误,甚至会导致数据损坏。
防病毒软件也可能会大大降低 PostgreSQL 的运行速度。因此,您至少应排除 postgres.exe 和数据目录,以便扫描程序忽略它们。
什么防病毒软件兼容?
用于构建 Windows 安装程序的系统都运行 Sophos AV 或 AVG 免费版,并且这些系统通过运行这些程序的完整 PostgreSQL 回归测试集。Microsoft Security Essentials 也已知有效。
已报告nod32防病毒产品存在特定问题。如果您使用的是此产品,请将“postmaster.exe”添加到排除进程列表(可在高级选项中找到)。这已报告能解决问题。
还报告了 McAfee 和 Panda 防病毒软件以及 NetLimiter 网络监控软件存在特定问题。虽然有些人确实使 PostgreSQL 与这些软件包一起正常工作,但没有针对这些软件包的特定或甚至推荐的解决方案,在某些情况下这些解决方案都无效,因此这些问题似乎是安装特定的,有时甚至需要卸载。
软件防火墙
如果您在计算机上安装了任何第三方防火墙软件,请尝试将其禁用或卸载。在 Windows XP 及更高版本上,实际上不需要第三方防火墙,因为 Microsoft 提供的内置防火墙已经做得很好。某些编写不当的第三方防火墙无法正确卸载,因此在卸载后,您可能需要告诉 Windows 修复其网络设置.
如果您以前使用的是第三方防火墙,现在已将其卸载,请务必重新打开 Windows 防火墙,因为许多产品在安装期间会将其关闭,并在卸载期间未能将其重新打开。
安装程序退出时出现运行时安装错误?
安装程序可能会退出并显示以下错误:执行 Microsoft VC++ 运行时安装程序时出错。这只会发生在 Windows 上。
出现此问题的主要原因有两个:
1) Windows 脚本宿主无法执行 VB 脚本。如果脚本宿主被禁用(这种情况很少见),或者安装程序已损坏,则可能会发生这种情况。此问题的标志是类似CScript 错误:找不到脚本引擎“VBScript”以用于脚本“C:\...的消息。通常可以通过重新注册 VBScript 解释器来解决此问题 - 点击开始->运行,然后输入以下内容并点击确定
regsvr32 %systemroot%\system32\vbscript.dll
如果失败,在 Windows 的旧版本上,您可以尝试更新脚本宿主.
此外,请确保 HKEY_CLASSES_ROOT\.vbs\(Default) 中的注册表值为 VBSFile。 [1]
2) 安装程序无法正确地读取和写入系统TEMP目录中的文件。如果TEMP或TMP环境变量被设置为非标准值,则可能会发生这种情况,可以通过日志文件中指示脚本无法执行或找不到的错误来识别。要解决此问题,请确保TEMP和TMP变量被设置为正确的值。
postgres 用户密码问题
Dave Page 撰写了一篇博客文章,解释了不同密码的用途,以及如何克服诸如重置密码等常见问题。
PATH 环境变量
如果您安装了cygwin,并且 cygwin\bin 目录存在于系统 PATH 变量中,也会出现问题。cygwin 目录中存在与解释型语言(TCL、perl、python)相关的 DLL 文件,其中包含可能导致安装程序或已安装的 PostgreSQL 版本挂起或崩溃的错误。在运行安装程序之前,请从路径中删除 cygwin\bin 目录!
当 PATH 环境变量包含包含 libssl 和/或 libintl 版本的目录时,也观察到出现问题。
安装/运行 initdb 时出现权限错误
请确保 PostgreSQL 服务帐户对通向已安装目录的目录拥有权限。安装程序将设置安装目录的权限,但不会设置其父目录的权限。
您还可能会在“一键安装”程序中看到相关的错误显示为“数据库集群初始化失败”。
检查您的 install-postgresql 日志,但这通常与权限错误有关。以下主题可能有所帮助,
http://forums.enterprisedb.com/posts/list/2044.page#7503
或者,您可以修复目录权限,然后像这样手动重启 v9 的 initcluster.vbs 脚本,
cscript //NoLogo "<install_path>/installer/server/initcluster.vbs" "postgres" "postgres" "<password>" "<install_path>" "<data_path>" 5432 "DEFAULT"
检查 %COMSPEC% 环境变量
某些 Windows 安装似乎最终得到了一个不正确的 %COMSPEC% 环境变量,这会阻止 initdb 的执行。
在命令提示符中,运行
echo %COMSPEC%
您应该得到类似以下的结果:
C:\Windows\system32\cmd.exe
(其中 C:\Windows 是您的 Windows 安装位置)。
如果您看到其他内容,请检查“系统”控制面板,并在“环境”部分中检查 COMSPEC。如果其值在那里不正确,
- 创建一个系统还原点;然后
- 备份您的计算机;然后
- 在系统环境设置中更改它,使其指向 cmd.exe 的正确位置
您可以通过以下方式测试以确保其正确,
- 打开一个新的 cmd.exe 提示符(不要重新使用已经打开的提示符);然后
- 运行
"%COMSPEC%" /C "echo test ok"
它应该打印“test ok”。
安装程序声称指定的帐户是管理员,但它不是!
最有可能的是,指定的帐户是管理员或超级用户,即使您没有意识到这一点。安装程序使用的检查专门检查是否属于“管理员”或“超级用户”组。使用“本地用户和组”从后向前检查 - 打开“管理员”组,查看谁是成员。然后检查任何(域或本地)组,这些组是“管理员”组的成员,以及该组成员的任何组等等。PostgreSQL 会检查任何级别的嵌套组。
我收到一条错误消息,说无法从终端服务会话安装 PostgreSQL
很遗憾,PostgreSQL 后端无法在 TS 会话中运行,为了执行 initdb,安装程序必须启动一个独立的后端。因此,必须从控制台进行安装。请注意,如果您使用的是 Windows Server 2003,您可以获得对实际控制台的远程访问权限,而不仅仅是管理会话。为此,请通过执行 *mstsc /console* 启动远程桌面连接,然后像往常一样连接。这将锁定服务器的本地控制台,并让您控制该会话。在这种情况下,PostgreSQL 应该可以正常安装。
我收到错误消息“用户未被授予此计算机上的请求登录类型”或类似消息
确保指定的 PostgreSQL 帐户具有“以服务身份登录”和“本地登录”权限。“本地登录”仅在安装过程中需要,安装完成后可以删除,如果安全策略要求这样做。(权限是使用“本地安全策略”MMC 管理单元授予和撤销的。“本地登录”是默认设置,安装程序通常会自动授予“以服务身份登录”。)
如果您仍然遇到此问题,请启用审核(也使用“本地安全策略”MMC 管理单元)并告诉我们您的设置中需要哪些其他权限。
请注意,如果您的计算机是域成员,安全策略的设置可能受使用组策略在域级别控制。
如何删除服务帐户 - 它不在用户列表中!
Windows 有时会将某些帐户从 GUI 工具中隐藏,因此无法从那里删除它们。这包括为 PostgreSQL 自动创建的服务帐户(可能来自以前的安装)。要删除此帐户,请在命令行上使用 NET 命令
NET USER <username> /DELETE
其中 <username> 是用户的 Windows 登录名,例如 *postgres*。
常见运行时问题
安装过程语言时出现“动态加载错误”
最常见的情况是,过程语言的实际语言 DLL 丢失。PostgreSQL DLL 仅包含语言绑定,需要系统 PATH 中存在语言发行版 DLL。有关当前不同过程语言所需 DLL 的列表,请参阅安装说明。
要找出究竟缺少哪些 DLL 文件,您可以使用 Microsoft 的 *depends* 工具。它在 Windows 支持工具中提供,这些工具在 Windows CD 中作为单独的安装提供。只需运行 *depends plpython.dll*(对于 PL/python)即可显示缺少哪些导入项。
即使我只启动了服务器一次,也看到了很多 postgres.exe 进程
这是正常的。PostgreSQL 使用多进程架构。在空系统中,您会看到两个到五个进程。一旦客户端开始连接,进程数量就会增加。
如何设置环境变量?
PostgreSQL 使用环境变量进行多个设置。要在大多数 Windows 版本中更改环境变量,请进入“我的电脑”的“属性”,然后进入“高级”。请注意,有两组环境变量 - 一组用于系统,适用于所有用户,另一组用于当前用户。如果要更改环境变量以影响 PostgreSQL 服务,则必须更改系统变量。更改系统变量后,必须重新启动服务。
即使拥有强大的硬件,我也无法同时运行超过约 125 个连接
以服务身份运行时,您可能会遇到超过大约 125 个并发连接的故障。发生这种情况是因为 PostgreSQL 依赖的一些库依赖于 user32.dll,而 user32.dll 从称为“桌面堆”的区域分配内存。桌面堆分配给每个登录会话,非交互式会话通常分配 512KB。每个运行的 postgres 进程通常会消耗大约 3.2KB 的桌面堆,这与其他开销相结合,可能会在 125 个连接左右耗尽分配的堆。从命令行运行时不会发生这种情况(更确切地说,在连接数量多得多时才会发生),因为交互式登录会话通常分配 3MB 的桌面堆。
您可以通过修改注册表中的第三个 SharedSection 值来增加非交互式桌面堆,如这篇文章Microsoft 知识库文章中所述。请注意,应谨慎操作,因为指定过高的值可能会阻止系统启动。
Windows 版本特定问题
我可以在 64 位 Windows 上安装 32 位 PostgreSQL 吗?
最近的 32 位版本的 PostgreSQL(8.3 及更高版本)可以安装在 64 位 Windows XP 及更高版本上并使用,尽管它们保留了 32 位对最大进程地址空间(以及共享内存)的限制。
您可以从服务器运行的计算机上的 64 位程序或其他计算机连接到 32 位 postgresql 服务器,如果在运行程序的计算机上安装了 64 位 libpq 或 psqlODBC 驱动程序。
由于 32 位版本的 PostgreSQL 服务器仅安装 32 位 libpq 和 pgsqlODBC,因此只有服务器安装的计算机上的 32 位程序才能使用数据库,除非作为附加组件安装了 64 位 ODBC 驱动程序或 libpq。
PostgreSQL ODBC 驱动程序在哪里?我在 64 位 Windows 上运行 32 位 PostgreSQL
您需要使用 32 位 ODBC 管理员来设置使用 32 位驱动程序的 32 位应用程序的数据源。
除非您还安装了 64 位版本 的 psqlODBC,否则 32 位安装的 PostgreSQL 仅包含 32 位 ODBC 驱动程序。32 位 ODBC 驱动程序只能被 32 位程序使用,*不会显示在 64 位 ODBC 管理员中*。
这让人感到困惑,因为在 64 位 Windows 上,c:\windows\system32\odbcad32
是 *64 位* ODBC 驱动程序管理员,尽管名称如此。这是 Windows 开发过程中的一个历史遗留问题。显然,许多应用程序和安装程序依赖于 odbcad32.exe 具有该名称和路径,因此尽管现在名称很愚蠢,但 Microsoft 还是被迫保留它,这在 16 位到 32 位的过渡中是有意义的,但现在没有意义了。这就是“system32”目录在 64 位 Windows 上仍然被称为“system32”的原因。PostgreSQL 无能为力。
请参阅:http://support.microsoft.com/kb/942976
您将在本文中看到,64 位 Windows 上的 32 位 ODBC 管理员是
%systemdrive%\Windows\SysWoW64\odbcad32.exe
您可以使用上面的路径从“开始 -> 运行”启动它。您将在 32 位 ODBC 管理员中看到 PostgreSQL ODBC 驱动程序。
您 *不能* 在 64 位应用程序中使用 32 位 ODBC 驱动程序。这意味着您仍然只能使用 PostgreSQL ODBC 驱动程序与 32 位应用程序一起使用,除非您也安装了 64 位 ODBC 驱动程序。
我可以在 32 位 PostgreSQL 服务器上使用 64 位 ODBC 程序吗?
只有在您安装了 64 位 [2] 驱动程序的情况下。请参阅安装部分。