科技 · 实用指南
pg_dump 报“server version mismatch”?先核实客户端路径与恢复目标
服务器可能没有故障;真正执行的往往是 shell、GUI、包装脚本或容器里的旧版 pg_dump。记录可执行文件与端点,选择兼容客户端,并在验收前完成隔离恢复。

服务器可能没有故障;真正执行的往往是 shell、GUI、包装脚本或容器里的旧版 pg_dump。记录可执行文件与端点,选择兼容客户端,并在验收前完成隔离恢复。
pg_dump 可以导出受支持的旧版 PostgreSQL 服务器,但会拒绝比自身主版本更新的服务器。 在 shell 中查看版本,不能证明 GUI、CI、包装脚本或容器使用的是同一可执行文件。
1. 记录失败调用者与精确二进制
保存启动备份的脚本、GUI 配置、容器镜像或 CI 步骤,同时记录 stderr、退出码、command -v、配置路径、解析后路径、文件归属和 pg_dump --version。
证据必须在同一执行环境采集。交互式 shell 可能找到 18,而服务、桌面程序或镜像仍调用 17。
2. 确认服务器端点与主版本
记录 host、port、database 与 user,但不要泄露秘密。检查 PGHOST、PGPORT 与 service 文件,再通过预期端点查询 server_version 和 server_version_num。
不要用本地软件包或 socket 名推断服务器主版本;远程或托管端点可能已经升级,而备份执行器仍被冻结。
3. 不改生产服务器地选择兼容客户端
选择主版本不低于源服务器且仍支持它的 pg_dump。把包装器指向明确的软件包二进制或固定客户端镜像,不要盲目替换服务器文件或通用符号链接。
更换客户端并不升级数据库。保留旧执行器,直到新命令、连接与输出都有证据。
4. 保留 dump 合同并检查输出
有意选择 plain、custom 或 directory 格式。保存 stderr 警告与零退出码;若恢复合同包含角色或 tablespace,还要纳入 pg_dumpall。
archive 先用 pg_restore --list 检查;纯 SQL 检查头部,并用 psql -X 与 ON_ERROR_STOP 恢复,避免早期错误被后续语句掩盖。
5. 验收前在隔离目标恢复
恢复到与预期目标主版本一致的隔离服务器。正确创建空数据库、应用所需 globals,并记录所有错误,不要靠删除陌生语句来制造成功。
核验 schema、extension、owner、行数、constraint 与安全的应用检查。只有这些证据才能把成功的 dump 命令变成可恢复备份。
