科技 · 實用指南
pg_dump 顯示「server version mismatch」?先證明 client 路徑與 restore target
server 可能正常;真正執行的常是 shell、GUI、wrapper 或 container 裡的舊 pg_dump。記錄 executable 與 endpoint,選 compatible client,並在驗收前完成 isolated restore。

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。
