公司用的内部系统突然提示“补丁发布失败”,运维同事在群里发了个哭脸表情包;或者你刚升级完某款ERP,后台日志里反复刷出 Failed to deploy patch v2.3.1 ——别急着重启服务器,先看这几点。
一、检查补丁包本身有没有问题
最常踩的坑:补丁文件上传不完整。比如用浏览器拖拽上传时网络抖动,或FTP断连,导致 .zip 解压后缺了 config.json 或 update.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 exceeded 或 Duplicate 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% 的问题答案就藏在第一屏里。