在 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...