MOOSSin
選單

全部文章 · 開源工具

在 Windows 主機上跑 PostgreSQL:安裝之後要立刻做的幾件事

PostgreSQL 在 Windows 上裝起來很快,但預設值是給通用情境的。只聽本機、改用 Windows 整合驗證、搬資料目錄、把排序規則釘成 C、備份用 pg_dump 而不是複製目錄。這篇是我替一個本機資料專案裝完之後的清單,還有一個關於「大象」的題外話。

PostgreSQL 的吉祥物是一隻大象,名字叫 Slonik。我每次看到它都會想,選大象真的很貼切:穩重、記性好、不太會跑得很快但也絕對不會跌倒,還有,一旦住進你家就很難請走。

PostgreSQL 是 1996 年至今持續開發的關聯式資料庫,授權是寬鬆的 PostgreSQL License,16 版在 2023 年 9 月釋出。它在 Windows 上有 EDB 維護的安裝程式,幾分鐘就能裝成服務。裝好之後的預設值是給通用情境的,下面是我替一個只在自己電腦上跑、持續從很多來源寫入資料的專案裝完之後,立刻改掉的幾件事。

為什麼這次不是 SQLite

我平常很愛 SQLite,寫過一整篇替它說話。但這個專案的寫入模式完全不同:幾十個排程各自每小時往裡面寫,還有幾條串流一直在進。SQLite 同一時間只能有一個寫入者,這種情況下它會變成一個大家排隊的窗口,隊伍越排越長。PostgreSQL 的鎖定和並行模型就是為這種場面設計的,很多人同時寫,它一點都不慌。

只聽本機

安裝程式產生的 postgresql.conf 裡 listen_addresses 可能是 *,意思是「所有網路介面都聽」。這台機器上沒有任何東西需要從外面連進來,就改成 localhost。改完重啟服務,用 netstat 確認只剩本機迴路位址在聽。

這件事我建議裝完的五分鐘內就做。不是因為會馬上出事,是因為五分鐘後你就會忘記,然後某天你會在某個掃描報告上看到自己的資料庫。

用 Windows 整合驗證

pg_hba.conf 支援 sspi 驗證方式,也就是用目前登入的 Windows 帳號直接連,設定檔裡不需要任何密碼。應用程式的連線字串只剩主機、埠和資料庫名。超級使用者的密碼在安裝精靈裡由人設定,之後只在必要時用。

沒有密碼的連線字串聽起來像是少了什麼,其實是少了一個會被複製、截圖、貼到聊天室裡的東西。我看過太多專案的設定檔裡躺著一行 password=,旁邊還有註解寫「記得改掉」,三年沒改。

搬資料目錄

預設資料目錄在系統碟。要搬到別的磁碟,步驟是:停服務,用 robocopy /E /COPYALL 連權限一起複製,改服務的啟動參數裡的 -D 路徑,改安裝程式登錄的 Data Directory,起服務。我搬過一次,九百多個檔案,零失敗,整個過程比預期乾脆。

搬之前我很緊張,因為資料庫這種東西給人一種「不要亂動」的氣場。搬完之後發現它就是一個資料夾,大象只是看起來很重,其實搬起來還好。當然,前提是服務停了,你不能在大象走路的時候搬它。

排序規則釘成 C

這是我裝完才學到的,寫在這裡讓你不用學第二次。

安裝時的地區設定跟著 Windows 走,資料庫的預設 collation 會是本地語系的 Windows 碼頁。這對排序穩定性是個問題:同樣的查詢在不同 collation 下順序可能不同,而很多去重和取最新的邏輯靠順序。你以為你拿到的是最新那一筆,其實是在某種排序規則下「看起來最新」的那一筆。

凡是順序有意義的欄位,查詢裡明確加 COLLATE "C";或者一開始 initdb 就選 C,之後省事很多。C 排序就是單純比位元組,沒有任何語言上的聰明,而在資料庫裡,不聰明常常是好事。

分區、原始檔、匯出

持續流入的觀測資料,主表按月做宣告式分區,這是 PostgreSQL 10 起就有的功能。每個月一張子表,查詢的時候它自己知道去哪幾張找,刪舊資料的時候整張子表丟掉就好,不用一列一列刪。

每個來源的原始回應存成檔案,不進資料庫,資料庫只放正規化後的列。舊的分區定期匯出成 Parquet 給分析工具用,資料庫只留近期的熱資料。驅動程式用 psycopg 3,匯出走 COPY 的串流介面,不把整張表讀進記憶體。這套分工另外有一篇寫。

小劇場:這隻大象會不會很吃資源

「PostgreSQL 不是那種要一台專用伺服器的東西嗎?我的筆電跑得動嗎?」

「跑得動。它預設的記憶體設定很保守,保守到你可能要調高才會發揮實力。」

「那它會不會一直在背景吃 CPU?」

「沒有查詢的時候它幾乎不動,就像大象站著的時候其實很安靜。」

「所以它比較像一個很大隻但很乖的寵物。」

「對,只是你要記得餵它備份。」

備份用 pg_dump

不要複製使用中的資料目錄,那樣拿到的東西可能打不開。pg_dump 產生一致的邏輯備份,pg_basebackup 產生實體備份,兩者都在服務運作中執行,大象不用停下來。

我必須誠實說,我自己的那個專案到現在還沒有排定資料庫備份,理由是先把資料來源接完。這個洞我知道,寫在這裡是提醒。公開承認自己沒做的事,比假裝做了好,至少下次有人問「你備份了嗎」的時候,我可以說「還沒,但我有寫在部落格上」,雖然這個回答一點都不能讓人放心。

什麼時候選它而不是 SQLite

我的分界線是寫入者的數量。單一應用程式寫、多人讀的內容型系統,SQLite 夠了;很多獨立的程序或串流同時寫,PostgreSQL 的鎖定和並行模型才撐得住。至於 ClickHouse 這類分析型資料庫,它沒有原生 Windows 版本,在 Windows 上要透過 Docker 或 WSL2,我把它留到資料量真的到了再說。

大象很好,但不是每個房間都需要一隻大象。需要的時候,它會是你家裡最可靠的那一位。

那隻大象的來歷

PostgreSQL 的前身是 1986 年柏克萊的 POSTGRES 計畫,Michael Stonebraker 主持,名字的意思是「Ingres 之後」,Ingres 是他更早的另一個資料庫。1996 年加入 SQL 支援之後改名 PostgreSQL,所以正確的唸法是「Post-gres-Q-L」,雖然大家都唸成「Postgres」而且沒有人在意。

大象的來歷比較可愛。1997 年郵件列表上在討論要用什麼當標誌,有人提議大象,理由是阿嘉莎克莉絲蒂有一本小說叫《大象的證詞》,原文書名是 Elephants Can Remember,大象記性好,資料庫也該記性好。就這樣定了。牠的名字 Slonik 是俄文「小象」的意思,來自一位俄羅斯開發者。一個資料庫的吉祥物來自一本推理小說,我覺得很符合這個社群的氣質:認真,但有一點古怪的幽默感。

它每年秋天出一個大版本,這個節奏維持了很多年,你可以把它當成日曆用。每個大版本都有幾個很實用的新東西,但舊版本會維護五年,你不用急著跟。

常見的三個誤會

第一個誤會是「PostgreSQL 很難」。它的預設值和文件都很友善,難的是「調校」,而調校是資料量到了才需要的事。小專案裝好就能用,跟 SQLite 一樣,只是多一個服務在跑。

第二個誤會是「MySQL 和 PostgreSQL 差不多」。日常 CRUD 差不多,但一到複雜查詢、JSON、全文檢索、擴充功能,兩邊的哲學差很多。PostgreSQL 傾向「把事情做對」,這在你需要它的時候會很明顯。

第三個誤會是「資料目錄可以隨便備份」。前面說過了,但這個誤會會讓人失去資料,值得再說一次。使用中的資料目錄直接複製,拿到的很可能是一份不一致的東西。用 pg_dump。

一個週末可以試的小練習

裝一個 PostgreSQL,Windows 用安裝程式,Mac 用 Homebrew,都幾分鐘。裝完先做這篇講的第一件事:找到 postgresql.conf,看 listen_addresses 是什麼,改成 localhost,重啟。

然後用 psql 進去,建一張按月分區的表:CREATE TABLE readings (at timestamptz, value real) PARTITION BY RANGE (at);,再建兩個月的子表。插幾筆資料,用 EXPLAIN SELECT * FROM readings WHERE at >= '2026-09-01' 看它只去掃一張子表。這個「它自己知道去哪找」的瞬間,是分區最讓人開心的地方。

最後 pg_dump 你的資料庫 > backup.sql,打開看一眼,你會發現備份就是一堆 SQL,人看得懂的那種。

後記

大象很好,但不是每個房間都需要一隻大象。這句話我寫完之後想了一下,覺得它其實在講的是「認識自己的需求」。我很多年都在用 SQLite,因為我的需求是 SQLite 的形狀;這次換了大象,是因為需求的形狀變了。工具沒有好壞,只有合不合。至於備份,我會排的,真的。

官方網站:postgresql.org

閱讀偏好

返回全部文章作者與內容更正

留言(0)

還沒有留言。讀完有想法,歡迎留下第一則。

留言經站長審核後才會顯示。暱稱和留言會公開,請不要寫下電話、地址等個人資料;資料怎麼處理,請見隱私權政策。