
很多人第一次在 Windows 上裝 PostgreSQL以為跟裝個普通軟件一樣一路 Next 就行結(jié)果卡在密碼策略、端口占用、命令行工具認(rèn)不出 psql 這些細(xì)節(jié)上折騰半天連不上數(shù)據(jù)庫。這篇文章把我在 Windows 環(huán)境下安裝 PostgreSQL、用 Navicat 連接、以及過程中最常踩的坑完整過一遍希望你看完能一次走通。1. 安裝前的準(zhǔn)備工作1.1 版本選擇與安裝包獲取PostgreSQL 官方提供 Windows 安裝包下載時別盲目選最新版。對大多數(shù)項目來說穩(wěn)定版比嘗鮮版更重要。我的建議是選擇當(dāng)前最新的穩(wěn)定大版本比如 16.x 系列而不是剛發(fā)布不久的 17 或者更舊的 12、13。新版雖然功能新但一些第三方工具比如 Navicat 的舊版本、某些 ORM 驅(qū)動可能要等一陣子才能完美適配。可以在官網(wǎng)的 download 頁面找到 Windows 安裝器一般是個.exe文件幾十 MB 到一百多 MB 不等。1.2 安裝前的系統(tǒng)檢查在雙擊安裝包之前最好先做兩件事檢查是否已安裝過 PostgreSQL有些人在不知情的情況下裝過或者裝了某些集成環(huán)境自帶的 PostgreSQL導(dǎo)致端口沖突或服務(wù)名沖突。建議先打開“服務(wù)”窗口WinR 輸入services.msc看看有沒有包含postgresql字樣的服務(wù)。確認(rèn) 5432 端口是否被占用PostgreSQL 默認(rèn)端口是 5432。提前打開命令行執(zhí)行一下netstat -ano | findstr 5432如果沒有任何輸出說明端口空閑。如果有輸出且狀態(tài)是LISTENING那就得留意了要么是舊版本 PostgreSQL要么是其他程序占用了。在安裝時可以改端口但我個人建議優(yōu)先解決端口占用問題盡量保持 5432 這個默認(rèn)端口免得后面連接配置的時候還要單獨寫端口號。2. 安裝 PostgreSQL 的完整過程2.1 安裝向?qū)е鸩讲僮髂玫桨惭b包后雙擊運行接下來就是跟著向?qū)ё?。大部分步驟很直白但有幾個環(huán)節(jié)容易出問題我一個個說。第一步選擇安裝目錄。默認(rèn)是C:\Program Files\PostgreSQL\16如果你不想裝在 C 盤可以改成 D 盤或者其他位置。這里要注意安裝目錄不要包含中文和空格否則極少數(shù)情況下會導(dǎo)致一些命令行工具或驅(qū)動加載異常。也別圖省事直接把整個 PostgreSQL 裝在根目錄后面想找配置文件的時候會很難受。第二步選擇組件。安裝向?qū)屇愎催x組件默認(rèn)是全部勾選包括 PostgreSQL Server、pgAdmin 4、Stack Builder、Command Line Tools。建議全選尤其是 Command Line Tools里面包含psql、pg_dump、pg_restore這些命令行工具備份恢復(fù)、日常維護都離不開它們。pgAdmin 4 是官方圖形化管理工具留著沒壞處。第三步設(shè)置數(shù)據(jù)目錄。這一步相當(dāng)關(guān)鍵。默認(rèn)數(shù)據(jù)目錄在安裝目錄下的data文件夾里如果你把安裝目錄放在系統(tǒng)盤那數(shù)據(jù)庫文件也默認(rèn)放在系統(tǒng)盤。有條件的強烈建議把數(shù)據(jù)目錄單獨指定到數(shù)據(jù)盤或容量充足的磁盤分區(qū)。比如我習(xí)慣放在D:\PostgreSQL\Data這樣后續(xù)如果系統(tǒng)重裝或卸載軟件數(shù)據(jù)文件還在不至于全盤皆輸。安裝向?qū)Ю镉幸徊綄iT讓你設(shè)置 Data Directory在這一步改好即可。第四步設(shè)置超級用戶密碼。這里設(shè)置的密碼是數(shù)據(jù)庫超級用戶postgres的密碼。有兩點要特別注意密碼別用太簡單的雖然本地開發(fā)沒人管你但一旦端口暴露到公網(wǎng)或者局域網(wǎng)弱密碼就等于裸奔。務(wù)必牢記這個密碼Navicat 連接、psql 登錄都是用這個密碼。實在怕忘就臨時記在密碼管理器里。注意這個密碼跟安裝 PostgreSQL 的 Windows 系統(tǒng)用戶密碼沒有任何關(guān)系別想著“Windows 登錄密碼不就是這個”那是兩碼事。第五步設(shè)置端口。默認(rèn)是 5432。除非你的 5432 確實被占用了否則別改。如果改了后面連接數(shù)據(jù)庫時端口必須寫對很多新手連接失敗就是端口寫錯了。第六步 locale 設(shè)置。安裝過程中會讓你選 locale也就是區(qū)域和編碼。這一步非常多人踩坑。默認(rèn)值通常是操作系統(tǒng)當(dāng)前區(qū)域?qū)?yīng)的 locale在中文 Windows 上可能會默認(rèn)成Chinese (Simplified) China但如果你打算用psql或者處理一些國際化的數(shù)據(jù)建議選擇C或者en_US.UTF-8具體看你的數(shù)據(jù)需求。不過說實話多數(shù)情況下用默認(rèn)的也能跑只是如果后面發(fā)現(xiàn)中文亂碼或者排序有問題往往就是 locale 沒選對。更穩(wěn)妥的做法是選C數(shù)據(jù)庫默認(rèn)編碼UTF8基本能在通用場景下兼容絕大多數(shù)客戶端。全部設(shè)置完之后向?qū)R總一遍你填的信息確認(rèn)無誤后點擊 Next 開始安裝。安裝過程會執(zhí)行初始化數(shù)據(jù)庫、注冊 Windows 服務(wù)、安裝命令行工具等動作一般幾分鐘內(nèi)完成。2.2 驗證安裝是否成功安裝完成后不要急著去打開 Navicat先在本地把基礎(chǔ)驗證做了。Windows 開始菜單里能找到pgAdmin 4或SQL Shell (psql)。如果你用的是SQL Shell (psql)啟動后它會依次問你 Server、Database、Port、Username、Password。直接回車使用默認(rèn)值本機、postgres 數(shù)據(jù)庫、5432 端口、postgres 用戶最后輸入你剛才設(shè)置的密碼??吹揭韵绿崾揪驼f明安裝成功了postgres#出現(xiàn)這個提示符說明你已經(jīng)進入了 PostgreSQL 的命令行交互界面。此時可以敲一個簡單的命令試試SELECT version();能正常返回 PostgreSQL 版本信息就說明服務(wù)在跑數(shù)據(jù)庫也能正常響應(yīng)。3. 核心配置解析PostgreSQL 服務(wù)與連接原理3.1 Windows 服務(wù)機制安裝完成后PostgreSQL 不是在前臺跑的程序而是作為 Windows 的后臺服務(wù)運行。你可以在服務(wù)管理里找到名字類似postgresql-x64-16的服務(wù)。這意味著即使沒有任何圖形界面打開數(shù)據(jù)庫也能一直運行。這點對很多新手來說是個認(rèn)知盲區(qū)他以為要開著某個窗口才能訪問數(shù)據(jù)庫其實完全不需要。只要服務(wù)狀態(tài)是“正在運行”任何客戶端都能連接。如果你發(fā)現(xiàn)數(shù)據(jù)庫連不上第一步就是去服務(wù)管理里確認(rèn)這個服務(wù)是否在運行雙擊服務(wù)還能設(shè)置啟動類型為“自動”確保開機自啟。3.2 連接 PostgreSQL 的底層邏輯無論你用 Navicat 還是命令行 psql連接一個 PostgreSQL 數(shù)據(jù)庫本質(zhì)上就是在做一件事向 PostgreSQL 服務(wù)發(fā)起 TCP 連接然后通過認(rèn)證。連接過程中需要幾樣信息主機地址本機就是localhost或127.0.0.1遠(yuǎn)程機器就是對方的 IP。端口號默認(rèn)5432。用戶名默認(rèn)超級用戶是postgres也可以創(chuàng)建普通用戶。密碼安裝時設(shè)置的那個。數(shù)據(jù)庫名默認(rèn)安裝后會有一個名為postgres的數(shù)據(jù)庫如果要連其他庫需要先創(chuàng)建。連接時會讀取 PostgreSQL 的認(rèn)證配置文件也就是pg_hba.conf。這個文件決定了哪些 IP 段可以訪問、用什么方式認(rèn)證密碼、信任、拒絕等。Navicat 連接報錯如果出現(xiàn) “no pg_hba.conf entry for host”就說明遠(yuǎn)端連接的規(guī)則沒放開。后面會詳細(xì)說怎么改。3.3 安裝路徑與配置文件位置PostgreSQL 的配置文件都在數(shù)據(jù)目錄下而不是安裝目錄下。比如postgresql.conf主配置文件包括監(jiān)聽地址、端口、內(nèi)存參數(shù)、日志等。pg_hba.conf客戶端認(rèn)證配置文件控制誰可以連、怎么驗證身份。如果需要修改監(jiān)聽地址比如允許遠(yuǎn)程連接要改postgresql.conf里的listen_addresses默認(rèn)是localhost只允許本機連接。改成*或具體 IP 后還要在pg_hba.conf里加上對應(yīng)的認(rèn)證規(guī)則然后重啟服務(wù)才能生效。很多人在文件里改了老半天發(fā)現(xiàn)沒效果大概率是忘了重啟服務(wù)。4. Navicat 連接 PostgreSQL 圖文詳解4.1 新建連接前的信息準(zhǔn)備打開 Navicat我用的是 Navicat 16 版本其他版本界面大同小異點擊左上角的“連接”選擇 “PostgreSQL”。在彈窗里填這些內(nèi)容連接名隨便起比如本地PG只是用來區(qū)分不同連接不參與實際連接。主機本機填localhost或127.0.0.1。如果是遠(yuǎn)程連接的服務(wù)器填對方的 IP 或域名。端口5432安裝時改過端口的填你改的那個。用戶名postgres密碼安裝時設(shè)置的超級用戶密碼。數(shù)據(jù)庫這一步可以先不填連接成功后會在左側(cè)展開看到所有數(shù)據(jù)庫也可以直接填postgres先行測試。填完后點擊“測試連接”。如果彈窗提示“連接成功”說明數(shù)據(jù)庫服務(wù)正常、認(rèn)證也通過了。4.2 連接成功后的基礎(chǔ)操作連接成功之后左側(cè)會出現(xiàn)連接下的數(shù)據(jù)庫列表。默認(rèn)只有一個postgres數(shù)據(jù)庫。要新建一個業(yè)務(wù)數(shù)據(jù)庫右鍵“連接名”或“數(shù)據(jù)庫”節(jié)點選擇“新建數(shù)據(jù)庫”。數(shù)據(jù)庫名稱、所有者一般選postgres編碼選UTF8模板選template0因為template1可能帶有一些額外的對象復(fù)制過來不干凈。如果你平時用的是 MySQL會發(fā)現(xiàn) PostgreSQL 的很多概念跟 MySQL 不太一樣。比如PostgreSQL 里有“模式”Schema的概念數(shù)據(jù)庫Database下是模式模式里才是表。默認(rèn)的public模式就是 MySQL 里的默認(rèn)庫空間。新建表時表歸屬在某個模式底下用的時候要寫成schema名.表名。這些概念理解不到位的話連接上之后會有點懵但用順手了就回不去了。4.3 連接失敗的常見提示與含義Navicat 連接出錯時錯誤信息往往是一大段英文看得人頭皮發(fā)麻。我挑幾個最常見的說一下錯誤一server does not listen意思是服務(wù)沒有在監(jiān)聽。檢查幾步服務(wù)是否啟動了端口是否填對了是否遠(yuǎn)程連接遠(yuǎn)程連接要改listen_addresses否則服務(wù)只在本地監(jiān)聽。錯誤二password authentication failed密碼驗簽失敗。密碼填錯了或者你連的用戶不是postgres也可能該用戶設(shè)置了不同的密碼。如果是遠(yuǎn)程連接還要確認(rèn)pg_hba.conf允許該 IP 通過密碼方式認(rèn)證。錯誤三no pg_hba.conf entry for host ...服務(wù)端根本沒有把你這個 IP 放進白名單。去pg_hba.conf添加一條規(guī)則比如host all all 0.0.0.0/0 scram-sha-256這么寫表示允許所有 IP 通過密碼認(rèn)證訪問所有數(shù)據(jù)庫僅限測試環(huán)境生產(chǎn)環(huán)境建議指定客戶端 IP 段。錯誤四database does not exist填的數(shù)據(jù)庫名不存在。要么先創(chuàng)建要么連接時留空。4.4 Navicat 與 pgAdmin 的選擇很多人裝了官方自帶的 pgAdmin但還是習(xí)慣用 Navicat因為界面簡潔連接管理方便導(dǎo)入導(dǎo)出也更直觀。不過 pgAdmin 完全免費Navicat 需要授權(quán)。如果你只是偶爾連一下pgAdmin 夠用如果日常工作頻繁操作多個庫Navicat 的體驗會好很多。關(guān)鍵是Navicat 只是客戶端不會影響數(shù)據(jù)庫服務(wù)端本身的配置和運行。不管用哪個客戶端最終都是走同樣的 TCP/IP 協(xié)議和認(rèn)證流程。所以千萬別在服務(wù)端問題上糾結(jié)客戶端選型先把服務(wù)端這一層的網(wǎng)絡(luò)和認(rèn)證打通再說。5. 常見問題排查與避坑指南5.1 psql 命令找不到很多人裝完后打開命令提示符輸入psql提示“不是內(nèi)部或外部命令”。這是因為安裝過程中雖然裝了命令行工具但沒有把psql的路徑加入系統(tǒng)環(huán)境變量。默認(rèn)情況下psql 在安裝目錄下的bin目錄里比如C:\Program Files\PostgreSQL\16\bin兩個解決辦法手動把bin目錄加入 PATH 環(huán)境變量右鍵“此電腦” - 屬性 - 高級系統(tǒng)設(shè)置 - 環(huán)境變量 - Path - 新建把上面的路徑加進去?;蛘呙看未蜷_ SQL Shell 工具它已經(jīng)幫你把路徑配好了不用手動處理。我個人建議把bin加進 PATH因為后面你用pg_dump做備份、用psql執(zhí)行 SQL 腳本都需要能直接調(diào)命令。5.2 端口被占用的排查思路如果安裝時提示 5432 端口無法使用先用前面的 netstat 命令找到占用進程的 PID然后在任務(wù)管理器里找到對應(yīng)進程搞清楚是什么程序。常見情況你之前裝過 PostgreSQL舊的實例還在跑。裝了某些數(shù)據(jù)庫管理集成環(huán)境自帶了 PostgreSQL。其他應(yīng)用恰好占用了 5432。如果是舊實例在跑建議直接卸載掉舊版本否則很容易出現(xiàn)混淆。之前我就碰到過一臺機器上裝了 PostgreSQL 12 和 16服務(wù)同時跑著5432 被老的占著新的只能用 5433。后來想連老的密碼又忘了折騰了很久才理清楚。5.3 遠(yuǎn)程連接配置的完整步驟本地連接通常沒問題畢竟 localhost 和密碼認(rèn)證都是默認(rèn)支持的。但如果你想在局域網(wǎng)內(nèi)用另一臺電腦連接這臺機器的 PostgreSQL會發(fā)現(xiàn)問題不少。完整配置步驟如下第一步改監(jiān)聽地址。打開postgresql.conf找到下面這一行#listen_addresses localhost改成listen_addresses *這個符號表示監(jiān)聽所有網(wǎng)卡上的連接請求。如果你只想允許特定 IP 訪問可以寫成具體的 IP 列表但一般應(yīng)用場景下用*就夠。第二步改認(rèn)證規(guī)則。打開pg_hba.conf在文件末尾追加host all all 192.168.1.0/24 scram-sha-256192.168.1.0/24表示允許這個網(wǎng)段的客戶端來連你可以改成自己的局域網(wǎng)網(wǎng)段。第三步重啟服務(wù)。在服務(wù)管理里找到 PostgreSQL 服務(wù)右鍵選擇“重啟”。第四步關(guān)注防火墻。Windows 防火墻默認(rèn)會攔截外部對 5432 端口的訪問。在“高級安全 Windows Defender 防火墻”里新建入站規(guī)則放行 TCP 5432 端口。這一步漏掉的話外部怎么都連不上。提示遠(yuǎn)程連接的生產(chǎn)環(huán)境不要用0.0.0.0/0這種全放行的規(guī)則至少在防火墻和pg_hba.conf里限制成具體網(wǎng)段否則數(shù)據(jù)庫暴露在公網(wǎng)上很容易被惡意掃描攻擊。5.4 密碼與加密方式不匹配PostgreSQL 從 14 版本開始默認(rèn)密碼加密方式改成了scram-sha-256。如果你之前用過舊版本可能習(xí)慣用md5。如果pg_hba.conf里寫的是md5而數(shù)據(jù)庫密碼是以scram-sha-256方式存儲的認(rèn)證就會失敗。解決辦法就是統(tǒng)一為一種方式。生成pg_hba.conf時默認(rèn)的scram-sha-256一般不需要改除非有老客戶端不兼容。Navicat 對scram-sha-256的支持很成熟低版本可能有些問題。如果你用了很老版本的 Navicat連接時提示unsupported frontend protocol之類的錯誤大概率是客戶端版本太舊不識別新的認(rèn)證協(xié)議。解決辦法是升級 Navicat或者暫時把pg_hba.conf改成md5但需要同時把那行認(rèn)證方式改為 md5并且密碼得是 md5 格式存儲的比較麻煩。5.5 中文亂碼問題中文亂碼多半出在數(shù)據(jù)庫編碼設(shè)置上。安裝時選了中文 locale 會導(dǎo)致某些特殊字符處理方式不同更常見的是在創(chuàng)建數(shù)據(jù)庫時沒選對編碼。創(chuàng)建數(shù)據(jù)庫時把字符集選成UTF8模板選template0基本可以避免絕大多數(shù)亂碼問題。如果你已經(jīng)建好數(shù)據(jù)庫且里面全是中文數(shù)據(jù)這時候改編碼很麻煩建議在剛創(chuàng)建時就把編碼定好。另外Navicat 連接時也可以在連接屬性的“高級”里設(shè)置編碼為自動或UTF-8保證客戶端和服務(wù)端的編碼一致。5.6 忘記超級用戶密碼怎么辦如果是自己的開發(fā)機把數(shù)據(jù)目錄下的pg_hba.conf臨時改成local all all trust host all all 127.0.0.1/32 trust然后重啟服務(wù)此時本機連接不需要密碼。用 psql 連上后執(zhí)行ALTER USER postgres WITH PASSWORD 新的密碼;改完之后把pg_hba.conf改回原來的認(rèn)證方式再重啟服務(wù)。這個操作需要你能進去編輯數(shù)據(jù)目錄下的配置文件。如果你是完全托管在云端的數(shù)據(jù)庫那只能通過云廠商的控制臺重置密碼了。6. 安裝后的日常配置建議6.1 設(shè)置 PATH 環(huán)境變量前面提到過把bin目錄加入環(huán)境變量的好處這里再補充幾個實際用法。配好 PATH 后你可以直接在任何目錄下執(zhí)行pg_dump -U postgres -d 數(shù)據(jù)庫名 -f 備份文件.sql pg_restore -U postgres -d 數(shù)據(jù)庫名 備份文件.sql psql -U postgres -d 數(shù)據(jù)庫名 -f 腳本.sql不用每次 cd 到安裝目錄去敲命令省下大量重復(fù)勞動。尤其是做定時備份的時候腳本里直接寫命令名比寫全路徑干凈很多。6.2 數(shù)據(jù)備份策略PostgreSQL 不像某些一鍵備份工具那樣有明顯的“背份”按鈕日常開發(fā)中用命令行備份就夠了。我常用的備份方式有兩種方式一SQL 格式備份文本文件pg_dump -U postgres -d 數(shù)據(jù)庫名 -f backup.sql這種格式可讀性好適合小數(shù)據(jù)量和跨版本遷移用 psql 就能恢復(fù)psql -U postgres -d 數(shù)據(jù)庫名 -f backup.sql方式二自定義格式備份二進制pg_dump -U postgres -F c -d 數(shù)據(jù)庫名 -f backup.dump恢復(fù)時用 pg_restorepg_restore -U postgres -d 數(shù)據(jù)庫名 backup.dump后者支持選擇性恢復(fù)、并行恢復(fù)數(shù)據(jù)量大的時候效率更高。6.3 性能與日志的基本把握不要一上來就亂調(diào)shared_buffers、work_mem這些參數(shù)。Windows 下 PostgreSQL 的性能瓶頸往往在 IO 和配置不當(dāng)上而不是參數(shù)不夠大。建議保持默認(rèn)先跑一段時間看日志。日志位置在數(shù)據(jù)目錄的log文件夾里出現(xiàn)問題可以按時間查看。如果確實要優(yōu)化比如機器內(nèi)存有 16G可以把shared_buffers調(diào)到 2G 到 4G但要注意 Windows 上 PostgreSQL 的shared_buffers設(shè)置得過高反而可能引起性能問題。沒有清晰需求時保持默認(rèn)永遠(yuǎn)是最穩(wěn)的選擇。7. 個人實操體會我在 Windows 上裝 PostgreSQL 的次數(shù)少說也有兩位數(shù)了踩過的坑基本都集中在剛裝完的階段。最大的體會是安裝本身并不復(fù)雜麻煩的是安裝時低估了后續(xù)連接配置的重要性。如果你一開始就把密碼記清楚、數(shù)據(jù)目錄分盤存放、端口不沖突、pg_hba.conf 和防火墻提前想好后面所有的連接問題起碼少一大半。還有一點PostgreSQL 跟 MySQL 的思路差別挺大尤其是數(shù)據(jù)庫、模式、表的三層結(jié)構(gòu)初次接觸的人容易在“我應(yīng)該連哪個庫”這個問題上懵。我的經(jīng)驗是先不要創(chuàng)建一堆數(shù)據(jù)庫而是就放在postgres庫里玩等你理解了模式的概念再按業(yè)務(wù)拆庫拆 schema改動成本會低很多。最后分享一個小技巧連接 Navicat 的時候如果你有多個環(huán)境本地、測試、生產(chǎn)建議在連接名上加上環(huán)境后綴比如本地PG、測試PG、生產(chǎn)PG。聽起來很蠢但真的能防止你手滑在生產(chǎn)庫上執(zhí)行危險操作。別問我怎么知道的。