在 Windows 上以原生方式安装和运行 PostgreSQL

来自 PostgreSQL wiki
跳转到导航跳转到搜索

支持的平台

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

PostgreSQL 支持 Windows 2000、XP、2003 和 Vista。它可以在 32 位和 64 位系统上运行。

我听说 NT4 受支持。是真的吗?

尽管没有官方支持,但 PostgreSQL 可以运行在 Windows NT4 上,但有一些小问题,包括

  • 安装程序无法正常工作,因此您需要手动编译和安装代码。
  • PostgreSQL 使用 NTFS 文件系统中称为“重新解析点”的功能来实现表空间。NT4 中没有重新解析点,因此无法使用表空间。
  • Windows NT4 标准版中不包含“runas.exe”,这使得从管理员帐户启动 PostgreSQL 变得困难。

还需要注意的是,NT4 上的测试很少。

Windows 95/98/ME 怎么样?

PostgreSQL 需要这些平台上不可用的功能,因此无法在这些平台上运行。如果您需要在这些平台上运行 PostgreSQL,您可以查看 Cygwin 端口,它对 9x 平台提供基本支持。

Windows 有 64 位版本的 PostgreSQL 吗?

在撰写本文时,简短的答案是“没有”。但是,PostgreSQL 的 32 位版本可以在 64 位平台上运行,实际上,对于 PostgreSQL 而言,64 位版本不像其他一些软件那样重要,这是有充分理由的

  • PostgreSQL 依赖于操作系统来执行大部分数据缓存。由于运行 32 位进程的主要限制是可寻址的内存总量,因此基于数据库引擎执行所有缓存的系统无法寻址具有 16Gb 内存的系统的全部内存。对于 PostgreSQL,我们将大部分缓存留给操作系统,只要操作系统是 64 位,它就可以寻址这些内存。
  • PostgreSQL 使用多进程架构,而不是多线程。在多线程数据库服务器中,所有客户端连接共享内存空间,并且再次受到可寻址内存区域总量的限制。对于 PostgreSQL,您可以轻松地为每个后端拥有超过 1Gb 的内存(如果需要),而不会出现内存不足,这将大大推迟您需要使用 64 位的时刻。
  • 在某些情况下,运行 PostgreSQL 的 32 位版本实际上可能更好,以减少内存使用量。在 64 位服务器中,每个指针和每个整数的占用空间是 32 位服务器的两倍。这种开销可能很大,而且很可能没有必要。

安装

我在 Windows 上安装 PostgreSQL 需要什么?

在 Windows 上安装 PostgreSQL 的最简单方法是使用 PostgreSQL FTP 站点和镜像提供的 Windows 安装程序包。这将安装 PostgreSQL 的预编译版本以及 pgAdmin(一个图形化管理和管理程序)、一系列“contrib”模块以提供额外的专门功能以及各种过程语言的选择。

要使用安装程序,您需要一台运行 Windows 2000、XP、2003 或 Vista 的计算机,并且安装了 Windows 安装程序服务。安装程序将根据需要创建一个服务帐户,并初始化数据库集群。

可以从 这里 下载安装程序。

从源代码编译 PostgreSQL 需要什么?

Windows 编译常见问题解答位于 FAQ_MINGW,其中包含有关使用 MinGW 在 Windows 系统上编译 PostgreSQL 源代码的完整详细信息。PostgreSQL 8.3 及更高版本可以使用 Microsoft Visual C++ 2005 构建(2008 也应该可以工作,但目前尚未测试)。有关详细信息,请参阅 文档

为什么我需要一个非管理员帐户来运行 PostgreSQL?

当黑客利用软件包中的软件错误进入计算机时,他们会获得运行该服务的用户的权限。虽然我们不知道 PostgreSQL 中存在任何此类错误,但我们强制使用非管理员服务帐户,以最大程度地减少黑客在找到并利用 PostgreSQL 中的错误来入侵系统时可能造成的损害。

这在 Unix 世界中一直是惯例,并且随着 Microsoft 和其他供应商努力提高其系统的安全性,这也逐渐成为 Windows 世界中的标准做法。

请注意,从 PostgreSQL 8.2 版本开始,可以在管理员帐户下运行。PostgreSQL 8.2 及更高版本能够在启动时不可撤销地放弃管理员权限,从而确保在极不可能发生 PostgreSQL 被入侵的情况下,系统其余部分仍然安全。

我可以将 PostgreSQL 安装在 FAT 分区上吗?

PostgreSQL 的首要任务是数据的完整性。FAT 和 FAT32 文件系统根本无法提供保证数据完整性所需的可靠性。此外,FAT 提供的安全功能不足,无法保护原始数据文件免遭未经授权的修改。最后,PostgreSQL 利用名为“重新解析点”的功能来实现表空间。此功能在 FAT 分区上不可用。

NTFS 文件系统是一个日志文件系统,提供更好的可靠性和崩溃恢复功能。此外,它拥有全面的访问控制系统,并提供 PostgreSQL 使用的重新解析点功能。

因此,PostgreSQL 安装程序包不会在除 NTFS 分区之外的任何分区上初始化数据库集群。服务器和实用程序可以安装在任何分区类型上。

但是,人们已经认识到,在某些系统上(例如开发人员的 PC),FAT 分区可能是唯一的选择。在这种情况下,您可以像往常一样安装 PostgreSQL,但不要初始化数据库集群。安装完成后,在 FAT 分区上手动运行“initdb.exe”程序。但是,安全性与可靠性将受到影响,任何创建表空间的尝试都将失败。

PostgreSQL 需要哪些文件系统权限?

PostgreSQL 服务帐户需要对通往服务目录的所有目录具有读取权限。它仅需要对数据目录具有写入权限。具体来说,它不应该被授予对包含二进制文件的目录的读取权限以外的任何权限。(安装目录下的所有目录都由安装程序设置,因此,除非您更改了某些内容,否则应该不会出现任何问题)。

PostgreSQL 还需要对系统 DLL 文件(如 kernel32.dll 和 user32.dll(以及其他文件))具有读取权限,这通常在默认情况下会授予,并且需要对 CMD.EXE 二进制文件具有读取权限,在某些情况下,该文件可能被锁定并需要打开。

如果您在多用户系统上运行 PostgreSQL,则应从 PostgreSQL 目录中删除所有非管理员用户对这些目录的权限。任何用户都不应该对 PostgreSQL 文件拥有权限——所有通信都是通过 libpq 连接完成的。直接访问数据文件会导致信息泄露或系统不稳定!

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

从 PostgreSQL 8.1 开始,(UTF8) UNICODE 编码在 Windows 上得到完全支持。8.0 不再受支持。

我安装了非英语语言,但所有消息都显示为英语!

安装过程中选择的语言仅用于安装程序。 要更改已安装产品的消息语言,请确保已安装“国家语言”支持功能。 然后编辑您的 postgresql.conf 文件,并将“lc_messages”参数的值更改为您想要的语言。

常见安装错误

PostgreSQL 和/或安装程序在启动时崩溃、无法启动或启动时挂起

迄今为止最常见的原因是防病毒软件和防火墙。 如果您的机器上安装了任何防火墙软件,请尝试禁用或卸载它。 如果安装了任何防病毒软件,您必须禁用它以使用 PostgreSQL 的目录。 如果这仍然不能解决问题,则可能需要从机器中完全卸载软件。

有报道称“nod32”防病毒产品存在特定问题。 如果您使用此产品,请将“postmaster.exe”添加到排除进程列表(在高级选项下可用)。 已有报道称此方法可以解决问题。

还报告了 McAfee 和 Panda 防病毒软件以及 NetLimiter 网络监控软件的特定问题。 尽管有些人确实有 PostgreSQL 与这些软件包一起使用,但没有特定甚至推荐的解决方案在某些情况下不起作用,因此问题似乎是特定于安装的,有时甚至需要卸载。

如果您安装了“cygwin”,并且 cygwin\bin 目录存在于系统 PATH 变量中,也会出现问题。 cygwin 目录中与解释语言(TCL、perl、python)相关的 DLL 文件包含可能导致安装程序或已安装的 PostgreSQL 版本挂起或崩溃的错误。 在运行安装程序之前,请从路径中删除 cygwin\bin 目录!

安装程序声称指定的帐户是管理员,但它不是!

最有可能的是,指定的帐户是管理员或超级用户,即使您没有意识到。 安装程序使用的检查专门检查是否属于“Administrators”或“Power Users”组。 使用“本地用户和组”向后工作 - 打开“Administrators”组,查看谁是成员。 然后检查任何(域或本地)组,这些组是“Administrators”组的成员,以及任何该组的成员等等。 PostgreSQL 检查任何级别的嵌套组。

我收到错误消息“用户未被授予此计算机上的请求登录类型”或类似消息

确保指定的 PostgreSQL 帐户具有“以服务身份登录”和“本地登录”权限。 “本地登录”仅在安装部分需要,安装完成后可以删除,如果安全策略需要的话。(权限使用“本地安全策略”MMC 管理单元授予和撤销。 “本地登录”是默认值,而“以服务身份登录”通常会由安装程序自动授予)。

如果您仍然遇到此问题,请启用审核(也使用“本地安全策略”管理单元),并告诉我们您的设置中需要哪些其他权限。

请注意,如果您的计算机是域成员,则安全策略的设置可以使用组策略在域级别控制。

我在安装/运行 initdb 时遇到权限错误

确保 PostgreSQL 服务帐户对安装目录的上级目录具有权限。 安装程序将设置安装目录的权限,但不会设置其父目录的权限。

我收到一条错误消息,提示无法从终端服务会话安装 PostgreSQL

不幸的是,确实如此。 PostgreSQL 后端无法从 TS 会话运行,为了执行 initdb,安装程序必须启动一个独立的后端。 因此,必须从控制台执行安装。 请注意,如果您使用的是 Windows Server 2003,您可以获得对实际控制台的远程访问,而不仅仅是管理会话。 为此,请通过执行“mstsc /console”启动远程桌面连接,然后照常连接。 这将锁定服务器的本地控制台,并让您控制该会话。 在这种情况下,PostgreSQL 应该可以正常安装。

我更改了目录,但 PostgreSQL 仍然安装在默认目录中

确保您更改了“root”功能的目录。 PostgreSQL 安装程序允许更改某些单独功能的目录。 如果您更改了“root”功能(“PostgreSQL”),则任何子功能(例如“数据库服务器”)都会自动将此值作为默认值继承,但如果您只更改了子功能,则安装的其余部分将保留在默认位置。

在升级时,安装程序提示我没有安装服务的权限,但我已以管理员身份登录

解决此问题的变通方法是先卸载先前版本。 请注意,这不会删除您的数据!! 然后重新安装新版本,并确保使用完全相同的目录。 这应该可以解决问题。 请注意,这只能在不需要转储/重新加载的次要版本升级(例如,从 8.0.1 升级到 8.0.2)中实现。

我收到一条错误消息,提示无法打开安装包

这可能是由两件事引起的。 最有可能的原因是您双击了 ZIP 文件中的 MSI 文件。 为了使安装正常工作,您必须将整个 ZIP 文件解压缩到一个临时目录,然后运行它。 另一个原因是您的下载已损坏。 请尝试再次下载,使用不同的镜像。

常见运行时问题

我在安装过程语言时遇到“动态加载错误”

最常见的原因是过程语言的实际语言 DLL 丢失。 PostgreSQL DLL 仅包含语言绑定,并且需要语言发行版 DLL 存在于系统 PATH 中。 有关不同过程语言的当前必需 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 知识库文章。 请注意,这应该非常谨慎,因为指定过高的值可能会阻止系统启动。