在 Windows 环境中使用 PostgreSQL 的常见做法是下载安装程序并进行配置。该方式操作简便,可自动完成依赖组件和系统服务的部署。然而,对于无需 PostgreSQL 持续运行、需要在多个版本之间灵活切换,或希望具备可复制至任意计算机并直接运行的便携式环境的场景,本文将介绍一种更灵活的实现方案。
该方案仅适用于个人开发环境。在未进行安全加固的情况下,不应将其用于共享或生产部署等场景。
下载软件包
首先需要获取 PostgreSQL 安装包。官方下载主页会跳转至适用于 Windows 的下载页面,默认推荐使用 EDB 提供的安装程序。
由于本文所介绍的方法不依赖安装程序,应前往提供 ZIP 压缩包的页面下载相应文件。

选择所需的 PostgreSQL 数据库版本,此示例以 18.0 版为例。将压缩包下载并保存至本地,例如默认的下载目录,文件大小约为 325MB。
准备安装目录
创建一个用于解压和存放二进制文件的目录。本文示例在 d:\stack 下创建 stack 文件夹,用于集中存放不同测试环境组件。为节省磁盘空间,可将该文件夹设置为压缩存储,相关方法可参考“开始前的准备”部分说明。
目录结构示例如下:
- 主目录:
d:\stack - PostgreSQL 18 目录:
d:\stack\pg-18(建议避免目录名中出现空格)
解压文件
将下载的压缩包解压至 pg-18 目录中。解压后通常会生成一个名为 pgsql 的子文件夹,其中包含 bin、doc、include 等文件夹。为简化目录结构,可将这些文件夹上移至 d:\stack\pg-18 下,并删除空的 pgsql 文件夹。
完成解压后,还需进行必要的环境变量配置,以确保 PostgreSQL 能正常启动。
背景说明 — 所需环境变量
在启动 PostgreSQL 前,需要配置以下环境变量,以确保可执行文件能够正常运行:
- PATH : Windows 系统的路径变量,需要将所使用的 PostgreSQL 版本放在最前面。
- PGDIR : PostgreSQL 安装的基础目录,本例中为
d:\stack\pg-18。 - PGDATA : 存放数据的目录(即数据库实际存储位置)。可指向安装目录内的文件夹,也可指定到其他路径。为简化操作,本例将其设置为 PGDIR 下的 data 目录。
- PGLOCALEDIR : 本地化文件所在目录,本例中为
PGDIR\share\locale。 - PGPORT : 数据库服务器运行端口,默认值为 5432,若端口被占用,可选择 5412、5416、5418 等。
- PGDATABASE : 默认数据库名称,通常设置为 postgres。
- PGUSER : 管理员账户名称,通常设置为 postgres。
- PGLOGS : 日志文件存放路径。
配置完成后,可使用 pg_ctl 工具启动或停止 PostgreSQL 服务。
在启动或停止服务器之前,需先通过 pg_ctl 的 initdb 子命令创建新的数据库集群,并添加以下参数:
- -A trust:设置 PostgreSQL 信任所有本地连接(详见下文)。
- -U postgres:将本地超级用户设置为 postgres。
- -E UTF8:指定服务器编码为 UTF-8,以保证兼容性。
说明:trust 模式仅适用于本地测试环境,不适合生产场景。如需修改认证方式,可编辑 pg_hba.conf 文件进行调整。
脚本文件说明
需创建四个命令脚本,用于管理 PostgreSQL 环境:
pg-18-vars.cmd:用于设置环境变量,确保命令行下的其他工具能够正确识别 PostgreSQL 的相关路径和配置。其他脚本在执行前均会调用此脚本以设置变量。pg-18-start.cmd:用于启动 PostgreSQL 服务器。pg-18-stop.cmd:用于停止 PostgreSQL 服务器。pg-18-initialize.cmd:用于初始化数据库集群。
各命令脚本的设置方式如下:
@ECHO ON
:: Save the directory where we are
pushd %CD%
:: Shift directories to the correct path
%~d0
cd %~dp0
:: Set the variable using the common file
call pg18-vars.cmd
:: The actual command that needs to do something
"%PGDIR%\bin\pg_ctl" <---- the actual parameters: start, stop, initdb ----->
:: Restore the directory where we started from
popd
为了实现从任意路径执行脚本,命令脚本按照以下步骤进行处理:
- 保存当前执行目录(可参考 pushd / popd 的用法)。
- 切换至脚本所在目录。
- 使用 call 调用
pg-18-vars.cmd,以确保执行完毕后控制权返回当前脚本。 - 执行脚本所需的
pg_ctl命令。 - 返回到最初执行脚本的目录。
这些命令脚本将放置在 stack 的根目录,即 D:\Stack,此时通用配置如下:
@SET PATH=%~dp0pg-18\bin;%PATH%
@SET PGDIR=%~dp0\pg-18
@SET PGDATA=%PGDIR%\data
@SET PGLOCALEDIR=%PGDIR%\share\locale
@SET PGPORT=5418
@SET PGDATABASE=postgres
@SET PGUSER=postgres
@SET PGLOGS=%~dp0\logs\pg-18\logfile
日志说明:通常建议将日志统一存放在 d:\stack 下的公共目录,而非各个安装目录中(在日常使用和维护时更便于管理)。因此,本例中日志路径设置为 d:\stack\logs\pg-18,而非 d:\stack\pg-18\logs。可根据实际需求调整日志存放位置。
不同的 pg_ctl 命令行需根据用途进行设置:
- 初始化:需添加前文讨论的额外参数。
"%PGDIR%\bin\initdb" -U postgres -A trust -E UTF8
- 启动:指定数据库位置和日志文件路径,并执行启动操作。
"%PGDIR%\bin\pg_ctl" -D "%PGDATA%" -l "%PGLOGS%" start
- 停止:指定数据库位置和日志文件路径,并执行停止操作。
"%PGDIR%\bin\pg_ctl" -D "%PGDATA%" -l "%PGLOGS%" stop
执行脚本
准备完四个命令脚本后,即可执行。
初始化
首先,执行初始化命令。
$ pg18-initialize.cmd
$ pushd D:\stack
$ D:
$ cd D:\stack\
$ call pg18-vars.cmd
$ ECHO Preparing for PostgreSQL 18
Preparing for PostgreSQL 18
$ "D:\stack\pg-18\bin\initdb" -U postgres -A trust -E UTF8
The files belonging to this database system will be owned by user "Mohit".
This user must also own the server process.
The database cluster will be initialized with locale "English_Singapore.1252".
The default text search configuration will be set to "english".
Data page checksums are enabled.
creating directory D:/stack/pg-18/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... windows
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Asia/Kuala_Lumpur
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Success. You can now start the database server using:
^"D^:^\stack^\pg^-18^\bin^\pg^_ctl^" -D ^"D^:^\stack^\pg^-18^\data^" -l logfile start
所有操作结果符合预期。此时在同一命令窗口执行 set pg,即可看到 PostgreSQL 18 的环境变量已正确设置。
$ set pg
PGDATA=D:\stack\pg-18\data
PGDATABASE=postgres
PGDIR=D:\stack\pg-18
PGLOCALEDIR=D:\stack\pg-18\share\locale
PGLOGS=D:\stack\logs\pg-18\logfile
PGPORT=5418
PGUSER=postgres
注意,数据库服务器端口已设置为 5418,便于区分 PostgreSQL 18 版本。在连接服务器时,需要确保使用正确的端口号。
此外,可通过 where 命令查看 PostgreSQL 可执行文件路径。
$ where pg_ctl
D:\stack\pg-18\bin\pg_ctl.exe
启动服务器
接下来可以启动服务器。若无异常,命令行将显示服务器已成功启动。
$ pg18-start.cmd
$ pushd D:\stack
$ D:
$ cd D:\stack\
$ call pg18-vars.cmd
$ ECHO Preparing for PostgreSQL 18
Preparing for PostgreSQL 18
$ "D:\stack\pg-18\bin\pg_ctl" -D "D:\stack\pg-18\data" -l "D:\stack\logs\pg-18\logfile" start
waiting for server to start.... done
server started
打开任务管理器,可见 postgres 进程正在运行。

连接服务器
PostgreSQL 现自带 PgAdmin 4 图形化管理工具。该程序以前位于 pgAdmin 4\bin\pgadmin4.exe,现在位于 pgAdmin 4\runtime\pgAdmin4.exe。启动后,将打开基于浏览器的图形界面,用于连接服务器。
初次运行时,可能会出现安全提示,需要选择 Run Anyway 以继续:

启动完成后,将显示主界面:


点击 [Add new server] 添加新服务器,首先填写服务器标识信息。

接着输入服务器详细信息,与环境变量配置保持一致:
- Host name/address:localhost
- Port:5418
- Maintenance database:postgres
- User:postgres

点击 Save 后,服务器将显示在左侧面板中。展开该节点,即可看到服务器正在运行,状态为在线。

停止服务器
执行 pg-18-stop.cmd 即可停止服务器。
$ ECHO Preparing for PostgreSQL 18
Preparing for PostgreSQL 18
$ "D:\stack\pg-18\bin\pg_ctl" -D "D:\stack\pg-18\data" -l "D:\stack\logs\pg-18\logfile" stop
waiting for server to shut down.... done
server stopped
服务器停止后,可直接关闭 PgAdmin 4 图形界面。
参考资料
以下页面提供更多参考信息:
- pg_ctl 的说明可参考 PostgreSQL 官方文档,其中包含所有可执行操作及主要参数的详细解释。
- initdb 的使用说明也可在官方文档中找到。
- 本文早期版本针对 PostgreSQL 16,可在此网站查看。
- 本文更早期版本针对 PostgreSQL 12,同样可在此网站查看。
本文旨在记录操作流程,便于复用与查阅。如对读者有所帮助,亦为本文价值所在。如有进一步建议或讨论,可通过 X(原 Twitter)@onghu、Mastodon @onghu@ruby.social 或 Bluesky @onghu.com 联系。
本文翻译自:https://notepad.onghu.com/2025/portable-postgresql-on-windows-without-installation-pg18/
PostgreSQL 18便携版Windows部署
1318

被折叠的 条评论
为什么被折叠?



