Watch at Ease看见世界,读懂生活。

科技 · 实用指南

pg_dump 报“server version mismatch”?先核实客户端路径与恢复目标

服务器可能没有故障;真正执行的往往是 shell、GUI、包装脚本或容器里的旧版 pg_dump。记录可执行文件与端点,选择兼容客户端,并在验收前完成隔离恢复。

识别 pg_dump 客户端、服务器端点与恢复目标的示意图
原创插画:命令名不等于完整的客户端身份。 Watch at Ease

服务器可能没有故障;真正执行的往往是 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 命令变成可恢复备份。

对齐客户端、检查输出并证明恢复的示意图
原创插画:修正版本边界并验证恢复。 Watch at Ease