补丁发布失败怎么办?5个常见原因和对应解法

公司用的内部系统突然提示“补丁发布失败”,运维同事在群里发了个哭脸表情包;或者你刚升级完某款ERP,后台日志里反复刷出 Failed to deploy patch v2.3.1 ——别急着重启服务器,先看这几点。

一、检查补丁包本身有没有问题

最常踩的坑:补丁文件上传不完整。比如用浏览器拖拽上传时网络抖动,或FTP断连,导致 .zip 解压后缺了 config.jsonupdate.sql。打开补丁目录手动核对文件列表,再对比发布说明文档里的必含文件清单。

顺手验证下签名(如果用了数字签名):

openssl dgst -sha256 patch_v2.3.1.zip
输出的哈希值和官网公布的是否一致?不一致就重下。

二、权限不够,系统直接拒之门外

Linux 下跑 Java 应用补丁,经常卡在 Permission denied: /opt/app/patch/tmp。不是磁盘满了,是补丁脚本试图往 /tmp 写临时文件,但当前用户没写入权限。切到部署用户执行:

sudo -u appuser ls -ld /tmp
确认目录权限是 drwxrwxrwt(最后的 t 表示 sticky bit),否则加一句:
sudo chmod 1777 /tmp

三、数据库迁移脚本执行中断

补丁里带 SQL 变更,但某条 ALTER TABLE 语句锁表太久,超时回滚,整个发布流程就挂了。登录数据库查最近的 error log:

SELECT * FROM mysql.general_log WHERE argument LIKE '%patch%' ORDER BY event_time DESC LIMIT 10;
重点找 Lock wait timeout exceededDuplicate column name 这类报错。手动执行出错语句前,先备份原表:
CREATE TABLE user_info_bak_20240520 AS SELECT * FROM user_info;

四、依赖服务没起来,补丁干等着

新补丁要调用 Redis 缓存服务,但运维昨天刚把 Redis 集群做了主从切换,IP 地址变了,配置文件却没更新。检查补丁启动日志里有没有类似 Connection refused: redis://10.1.2.5:6379 的字样。快速验证方式:

telnet 10.1.2.5 6379
不通就立刻改配置,别等发布脚本自己重试三次再报错。

五、时间不同步引发证书校验失败

某次安全补丁发布失败,错误日志只有一行:Invalid signature: certificate expired。结果发现应用服务器时间比 NTP 服务器快了 8 分钟——证书有效期精确到秒,差半分钟都不认。用这条命令同步时间:

sudo ntpdate -s time.windows.com
然后再试一次发布。

补丁不是越新越好,而是得稳着上。每次失败后别直接点“重试”,先翻日志前 20 行,90% 的问题答案就藏在第一屏里。