Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

pg_dump 顯示「server version mismatch」?先證明 client 路徑與 restore target

server 可能正常;真正執行的常是 shell、GUI、wrapper 或 container 裡的舊 pg_dump。記錄 executable 與 endpoint,選 compatible client,並在驗收前完成 isolated restore。

識別 pg_dump client、server endpoint 與 restore target 的圖
原創插畫:command name 不等於完整 client identity。 Watch at Ease

server 可能正常;真正執行的常是 shell、GUI、wrapper 或 container 裡的舊 pg_dump。記錄 executable 與 endpoint,選 compatible client,並在驗收前完成 isolated restore。

pg_dump 可 dump 受支援的舊 PostgreSQL server,但拒絕比自身 major version 更新的 server。 shell 的 version check 不能證明 GUI、CI、wrapper 或 container 使用同一 executable。

1. 保存 failing caller 與精確 binary

保存 wrapper、GUI profile、container image 或 CI step,並記錄 stderr、exit status、command -v、configured path、resolved path、ownership 與 pg_dump --version。

證據必須在相同 execution context 取得。interactive shell 可能找到 18,但 service 或 image 仍呼叫 17。

2. 證明 server endpoint 與 major version

記錄 host、port、database、user 而不洩漏 secrets。檢查 PGHOST、PGPORT 與 service file,再從預期 endpoint 查 server_version 與 server_version_num。

不要從 local package 或 socket name 推斷 server major;managed endpoint 可先升級而 runner 仍 pinned。

3. 不改 production 地選 compatible client

使用 major 不低於 source server 且仍支援它的 pg_dump。讓 wrapper 指向 explicit binary 或 pinned client image,不盲改 server files 或 generic symlink。

更換 client 不等於 upgrade database。保留舊 runner 直到新 command、connection 與 output 都證實。

4. 保存 dump contract 並 inspect output

刻意選 plain、custom 或 directory format。保存 stderr warnings 與 zero exit;若 roles/tablespaces 在 recovery contract 中,另納入 pg_dumpall。

archive 先跑 pg_restore --list;plain SQL 檢查 header,並以 psql -X 與 ON_ERROR_STOP restore。

5. acceptance 前做 isolated restore

restore 到符合 intended target major 的 isolated server。正確建立 empty database、套用 globals,完整記錄 errors,不靠刪除陌生 statements 製造成功。

核驗 schemas、extensions、ownership、row counts、constraints 與 safe application check 後才 acceptance。

align client、inspect output 與 prove restore 的圖
原創插畫:修正 version boundary 並驗證 recovery。 Watch at Ease