无需安装!PostgreSQL 18 Windows 便携部署方案
在 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 ... okSuccess. 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/
