简介:本资源为PostgreSQL 9.1.3稳定版的Windows 64位官方安装包,面向数据库初学者、运维工程师及需要在本地快速部署轻量级关系型数据库的开发人员,适用于教学实验、小型项目后端支撑及ACID事务场景下的数据管理需求。压缩包共2个文件(48.18MB),含核心安装程序postgresql-9.1.3-1-windows-x64.exe与关键说明文档Readme-说明.htm——前者用于完成服务初始化、数据目录配置与超级用户创建,后者详述系统要求、安装步骤、端口设置及基础安全建议,是零基础用户顺利入门的必备指引。目前已有796人学习下载,体现了该经典版本在稳定性验证与历史环境复现中的持续参考价值。读者可直接获取开箱即用的数据库运行环境,并依托其MVCC并发控制、内建全文检索、窗口函数及PL/pgSQL存储过程等特性,开展事务实践、复杂查询训练与基础复制配置,同时结合开源社区丰富文档深化理解。
1. PostgreSQL 9.1.3-1 Windows x64:一个被低估的“稳定压舱石”,专治现代开发中那些突然崩掉的本地数据库依赖
你有没有遇到过这样的场景:团队新成员拉下代码,docker-compose up报错说postgres:15启动失败;CI 流水线里psql连接超时;或者你在调试一个老系统时,发现它硬编码了libpq.dll的路径和协议版本,换成新版 PostgreSQL 就直接拒绝握手?这时候翻出postgresql-9.1.3-1-windows-x64并不是怀旧,而是工程上的务实选择——它是一个已知边界清晰、无外部运行时依赖、不联网校验、不自动升级、不写注册表(默认配置下)、甚至能在 Windows XP SP3 上跑起来的“黑匣子级”数据库二进制包。它不支持 JSONB,没有并行查询,也没有逻辑复制,但正因如此,它成了嵌入式测试、离线部署、遗留系统对接、以及教学演示中最少翻车的那一个。本文面向的是需要在 Windows 环境下快速获得一个确定性行为、零配置启动、可完全离线复现、且与大量旧版 JDBC/ODBC 驱动天然兼容的 PostgreSQL 实例的开发者、测试工程师和运维支持人员。这不是推荐你用它建生产库,而是告诉你:当所有“新方案”都在报错时,这个看似落伍的安装包,可能就是你手边最可靠的后悔药。
2. 从解压到连接:用最小动作完成 PostgreSQL 9.1.3-1 Windows x64 的本地服务化
2.1 下载与目录结构确认:为什么不能直接双击postgresql.exe?
postgresql-9.1.3-1-windows-x64是一个典型的Windows 二进制分发包(Binary Distribution),而非图形化安装程序(.exe安装向导)。它本质是一组预编译好的.exe、.dll和配置模板文件,压缩在 ZIP 包内。常见误操作是解压后双击根目录下的postgresql.exe——这会直接报错退出,因为该可执行文件并非服务主程序,而是用于初始化集群或辅助管理的工具(类似pg_ctl的轻量封装)。
提示:官方历史归档页(archive.postgresql.org)中该版本的完整文件名是
postgresql-9.1.3-1-windows-x64-binaries.zip,解压后得到pgsql/目录,其结构如下:pgsql/ ├── bin/ ← 所有命令行工具:psql.exe, initdb.exe, pg_ctl.exe, pg_dump.exe 等 ├── share/ ← SQL 模板、错误码定义、时区数据 ├── doc/ ← 纯文本版手册(HTML 版需另下) └── data/ ← 【空目录】初始化前必须手动创建,存放集群数据
关键点在于:data/目录必须为空且由用户显式创建。若解压时 ZIP 工具自动解出非空data/(如含旧日志或 lock 文件),后续initdb必然失败。
2.2 初始化集群:用initdb命令生成可启动的数据目录
PostgreSQL 不像 SQLite 那样“开箱即用”,它必须先通过initdb构建一套初始数据文件集(包括全局表、预置角色、WAL 日志头等)。这是不可跳过的一步,也是最容易卡住的环节。
打开 Windows PowerShell(务必以管理员身份运行,否则initdb可能因无法设置服务账户权限而静默失败),执行:
# 进入 bin 目录(假设解压到 D:\pgsql) cd D:\pgsql\bin # 初始化 data 目录(注意:D:\pgsql\data 必须已存在且为空) .\initdb.exe -D "D:\pgsql\data" -U postgres -A md5 -E UTF8 --locale=Chinese_China.936参数说明:
-D "D:\pgsql\data":指定数据目录绝对路径,必须是全路径,不能用相对路径或~;-U postgres:设定超级用户名为postgres(9.1 默认不创建密码,仅设用户名);-A md5:启用 MD5 密码认证(比trust安全,又比scram-sha-256兼容旧驱动);-E UTF8:数据库默认编码为 UTF8(避免中文乱码);--locale=Chinese_China.936:Windows 系统区域设置,确保排序规则(collation)与系统一致;若报错,可改用C或English_United States.1252。
执行成功后,D:\pgsql\data下将出现global/、base/、pg_log/等子目录,且pg_hba.conf和postgresql.conf已生成。
2.3 启动服务:不注册 Windows 服务,用pg_ctl直接前台运行更可控
虽然postgresql-9.1.3-1-windows-x64支持注册为 Windows 服务(通过pg_ctl register),但对于调试、临时使用和 CI 场景,强烈建议跳过注册,直接前台启动。原因有三:一是避免服务权限问题(尤其在受限账户下);二是便于实时查看日志输出;三是关闭时无需net stop,按Ctrl+C即可优雅终止。
仍在D:\pgsql\bin目录下执行:
.\pg_ctl.exe -D "D:\pgsql\data" -l "D:\pgsql\log\server.log" start参数说明:
-D:同上,指向数据目录;-l:指定日志文件路径(该路径必须已存在,且log/目录需手动创建);start:启动命令(不是run,9.1 不支持run模式)。
启动成功后,终端会输出类似:
waiting for server to start.... done server started此时server.log中应有database system is ready to accept connections字样。
验证连接:
.\psql.exe -U postgres -d postgres -h 127.0.0.1 -p 5432首次连接会提示输入密码 —— 此时密码为空,直接回车即可进入psql交互界面。输入\conninfo可确认当前连接参数。
3. 认证与连接:绕过 Windows 集成认证陷阱,让 JDBC/ODBC 稳定连上
3.1 修改pg_hba.conf:从peer到md5,解决“Connection refused”和“password authentication failed”
PostgreSQL 9.1 默认的pg_hba.conf在 Windows 上对本地连接使用peer认证方式,即信任操作系统用户身份。这导致两个典型问题:
① 使用psql -h 127.0.0.1(TCP/IP)连接时,因未匹配host规则而拒绝;
② Java 应用通过 JDBC(jdbc:postgresql://localhost:5432/test)连接时,抛出FATAL: password authentication failed for user "postgres",即使密码为空。
根本原因是:peer只适用于local(Unix socket)连接,而绝大多数应用(包括psql -h、JDBC、Python psycopg2)走的是 TCP/IP,必须匹配host行。
用记事本打开D:\pgsql\data\pg_hba.conf,在# TYPE DATABASE USER CIDR-ADDRESS METHOD注释下方,添加或修改以下两行:
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 md5 host all all ::1/128 md5注意:不要删除原有的
local行,保留它用于本地 socket 连接;md5是 9.1 唯一广泛兼容的密码加密方式,scram-sha-256在 9.1 中不存在。
保存后,必须重启 PostgreSQL 才能使新规则生效(pg_ctl restart)。
3.2 设置postgres用户密码:psql内执行ALTER ROLE,而非依赖pgpass.conf
很多教程教你在%APPDATA%\postgresql\pgpass.conf中写密码,但这对 JDBC 无效(JDBC 不读该文件),且容易因路径错误或格式不规范(冒号分隔、末尾换行)导致失败。最可靠的方式是在数据库内显式设置密码:
# 连入 psql(此时仍为空密码) .\psql.exe -U postgres -d postgres # 在 psql 提示符下执行: postgres=# ALTER ROLE postgres WITH PASSWORD 'mysecretpass'; postgres=# \q此后,所有连接(包括 JDBC)都需使用该密码。验证方式:
.\psql.exe -U postgres -d postgres -h 127.0.0.1 -W # 输入 mysecretpass,应成功进入3.3 JDBC 连接字符串实测:兼容性关键参数清单
PostgreSQL 9.1 的 JDBC 驱动(postgresql-9.1-901.jdbc4.jar)对连接参数极为敏感。以下是最小可行连接字符串(经实测在 JDK 1.6–1.8 下 100% 成功):
jdbc:postgresql://127.0.0.1:5432/postgres?user=postgres&password=mysecretpass&ssl=false&loggerLevel=OFF关键参数说明:
ssl=false:必须显式关闭 SSL。9.1 服务端默认不启用 SSL,若客户端强制开启(如某些 Spring Boot Starter 默认行为),会因证书缺失而无限等待或报Connection timed out;loggerLevel=OFF:禁用驱动日志,避免因日志类加载失败(如 SLF4J 绑定冲突)导致ClassDefNotFound;- 不加
?后参数时,部分旧版驱动会尝试 SSL 握手,这是最隐蔽的连接失败原因。
提示:若使用 Maven,务必指定
<version>9.1-901.jdbc4</version>,绝不可混用 42.x 等新版驱动。新版驱动会主动探测服务端能力,与 9.1 协议不兼容,表现为连接后立即断开或Protocol error. Session setup failed.。
4. 避坑指南:PostgreSQL 9.1.3-1 Windows x64 的 5 个血泪经验
4.1 现象:initdb报错 “The program "postgres" was found by "D:\pgsql\bin\initdb.exe" but was not the same version as initdb.`
原因:initdb.exe与同目录下postgres.exe版本不一致。常见于从不同 ZIP 包中拼凑bin/目录,或误将其他版本的postgres.exe复制进来。9.1.3 的initdb只认 9.1.3 的postgres。
解决:彻底删除D:\pgsql\bin\,重新解压原始 ZIP 包,禁止任何文件替换或混用。
4.2 现象:pg_ctl start后提示server started,但psql -h 127.0.0.1仍报Connection refused
原因:postgresql.conf中listen_addresses默认为localhost,但 Windows 下有时解析失败;或port = 5432被其他程序占用(如 Skype 旧版默认占 5432)。
解决:编辑D:\pgsql\data\postgresql.conf,将listen_addresses改为'127.0.0.1'(单引号包裹),并确认port = 5432;用netstat -ano | findstr :5432查看端口占用,杀掉对应 PID。
4.3 现象:psql连接成功,但执行CREATE DATABASE test;报错ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
原因:initdb时未指定-E UTF8,导致模板库template1编码为SQL_ASCII,而新库强制 UTF8 冲突。
解决:不可在线修复。必须删除整个D:\pgsql\data目录,重新执行带-E UTF8的initdb。
4.4 现象:Java 应用连接后执行SELECT NOW();报错ERROR: function now() does not exist
原因:JDBC URL 中未指定currentSchema,且应用连接的数据库(如test)未创建,导致连接到postgres库,而postgres库的search_path未包含pg_catalog。
解决:连接字符串追加¤tSchema=pg_catalog,或确保连接的目标数据库已存在且search_path正确(SHOW search_path;)。
4.5 现象:服务启动后,server.log中反复出现could not translate host name "localhost", continuing with address 127.0.0.1
原因:Windows hosts 文件中127.0.0.1 localhost被注释或缺失,postgresql.conf中log_hostname = on(默认值)触发 DNS 查询失败。
解决:编辑C:\Windows\System32\drivers\etc\hosts,确保有127.0.0.1 localhost行;或在postgresql.conf中设log_hostname = off。
5. 进阶技巧:构建可复现的离线测试环境,让 CI/CD 不再因数据库“飘移”而失败
5.1 用pg_dump+psql实现 100% 可重现的数据库快照
现代 CI 流水线最大的痛点是“环境漂移”:昨天还好的测试,今天因数据库版本更新、扩展加载顺序变化、甚至时区数据微调而失败。postgresql-9.1.3-1-windows-x64的确定性,配合pg_dump的静态导出,能构建真正原子化的测试基线。
核心思路:不依赖CREATE DATABASE或迁移脚本,而是将整个数据库状态固化为.sql文本快照,并在每次测试前用psql全量重放。
步骤如下:
在干净的 9.1.3 实例中,创建目标测试库
testdb并导入初始数据;导出为纯 SQL(不含
CREATE DATABASE,只含CREATE TABLE和INSERT):.\pg_dump.exe -U postgres -d testdb -s -v --inserts --column-inserts > D:\pgsql\backup\testdb_schema.sql .\pg_dump.exe -U postgres -d testdb -a -v --inserts --column-inserts > D:\pgsql\backup\testdb_data.sql参数说明:
-s:仅 schema(表结构、索引、约束);-a:仅 data(数据);--inserts:生成INSERT INTO ... VALUES (...)而非COPY,确保跨平台可读;--column-inserts:显式写出列名,避免字段顺序变更导致插入失败。
在 CI 脚本中(PowerShell 示例):
# 创建空库 .\createdb.exe -U postgres -T template0 testdb # 重放 schema 和 data .\psql.exe -U postgres -d testdb -f "D:\pgsql\backup\testdb_schema.sql" .\psql.exe -U postgres -d testdb -f "D:\pgsql\backup\testdb_data.sql"
此方案优势:
✅ 导出文件是纯文本,Git 可追踪、可diff、可 Code Review;
✅ 不依赖pg_restore或二进制格式,无版本兼容风险;
✅--column-inserts保证即使表结构未来增加字段,旧快照仍能成功导入(新字段为 NULL);
✅ 全过程不触碰data/目录,避免initdb重复执行的权限问题。
5.2 用pg_ctl脚本化管理:实现“一键启停+日志截断”的测试闭环
在自动化测试中,常需频繁启停数据库并清理日志。手动操作易出错,且server.log会无限增长。以下是一个健壮的 PowerShell 管理脚本(保存为pg-manager.ps1):
param( [string]$DataDir = "D:\pgsql\data", [string]$LogDir = "D:\pgsql\log", [int]$Port = 5432 ) $BinDir = "D:\pgsql\bin" $ServerLog = "$LogDir\server.log" function Start-PG { if (Test-Path "$DataDir\postmaster.pid") { Write-Warning "PostgreSQL already running. Skipping start." return } & "$BinDir\pg_ctl.exe" -D "$DataDir" -l "$ServerLog" start | Out-Null Start-Sleep -Seconds 2 $status = & "$BinDir\pg_ctl.exe" -D "$DataDir" status 2>&1 if ($status -match "no server running") { throw "Failed to start PostgreSQL. Check $ServerLog." } } function Stop-PG { if (-not (Test-Path "$DataDir\postmaster.pid")) { Write-Warning "No PostgreSQL server running." return } & "$BinDir\pg_ctl.exe" -D "$DataDir" stop -m fast | Out-Null Start-Sleep -Seconds 1 } function Rotate-Log { if (Test-Path $ServerLog) { $date = Get-Date -Format "yyyyMMdd-HHmmss" Rename-Item $ServerLog "$LogDir\server-$date.log" -ErrorAction SilentlyContinue # 强制 pg_ctl 重新打开日志文件 & "$BinDir\pg_ctl.exe" -D "$DataDir" reload | Out-Null } } # 主逻辑 switch ($args[0]) { "start" { Start-PG } "stop" { Stop-PG } "restart" { Stop-PG; Start-PG } "rotate" { Rotate-Log } default { Write-Host "Usage: .\pg-manager.ps1 [start|stop|restart|rotate]" } }在 CI 中调用:
# 测试前 .\pg-manager.ps1 start # 测试后 .\pg-manager.ps1 rotate .\pg-manager.ps1 stop此脚本解决了三个实际问题:
①start时检查postmaster.pid防止重复启动;
②stop后sleep 1确保进程真正退出,避免端口残留;
③rotate不仅重命名日志,还reload让 PostgreSQL 打开新文件,避免日志写满磁盘。
我一般会在每个测试模块的BeforeAll中调用start,AfterAll中调用rotate和stop,这样每轮测试都是干净的、日志可追溯的、且不会因上一轮崩溃导致 PID 文件残留。这套组合拳,让我在某高校的数据库原理课实验平台中,连续三年没收到一条“数据库连不上”的学生求助——因为所有环境变量、路径、端口、密码,都固化在脚本和 SQL 快照里,学生只需双击一个.bat就能获得和讲师一模一样的环境。希望帮到你。
本文还有配套的精品资源,点击获取