apt-mark hold是最稳妥轻量的防升级手段,通过在包状态层标记实现快速可逆锁定,适用于主服务、客户端库及驱动等关键数据库依赖包,并需批量锁定、递归查依赖、三步验证及周期性维护。

直接用 apt-mark hold 标记关键数据库依赖包是最稳妥、最轻量的防升级手段。它不修改源配置、不干扰APT策略,只在包状态层做标记,生效快、可逆强、运维友好。
明确要锁定的核心包范围
数据库稳定运行往往不只是靠主服务(如 mysql-server 或 postgresql),还高度依赖配套组件。建议按层级锁定:
-
主服务包:如
mysql-server、postgresql、redis-server -
客户端与连接库:如
mysql-client、libmysqlclient21、libpq5 -
驱动与扩展:如
php-mysql、python3-mysqldb、odbcinst -
内核级依赖(谨慎):如
libc6一般不建议 hold,但若确认某次 glibc 升级引发兼容问题,可临时加锁并记录原因
批量锁定 + 依赖自动补全
手动逐个输入容易遗漏,推荐组合命令一次性覆盖主包及其直接运行时依赖:
先查清依赖关系:
apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances mysql-server | grep "Depends:" | awk '{print }' | sort -u
再执行批量锁定(示例):
sudo apt-mark hold mysql-server mysql-client libmysqlclient21 php-mysql
注意:apt-cache depends 默认只显示直接依赖;如需递归包含全部运行时依赖,加上 --recurse 参数更可靠,但请人工核对输出,避免误锁系统基础包(如 systemd、apt 自身)。
验证锁定是否真正生效
锁定后务必三步验证,缺一不可:
- 运行
apt-mark showhold确认包名拼写准确、已出现在列表中 - 执行
apt list --upgradable | grep -E "(mysql|pgsql|redis)",确认目标包不再出现在可升级列表 - 模拟升级:运行
apt upgrade --dry-run,检查输出中是否明确跳过被 hold 的包(会提示类似Keeping package 'mysql-server' as it is held.)
长期维护要点
Hold 不是“设完就忘”的操作,需配合周期性管理:
- 每次系统大版本升级(如 Ubuntu 22.04 → 24.04)前,必须清理 hold 列表,评估是否仍需保留
- 安全公告发布后,若被 hold 的包存在高危漏洞,应优先测试新版兼容性,而非长期回避升级
- 在配置管理工具(Ansible / Puppet)中固化 hold 命令,并加入注释说明锁定原因和预期解除时间
- 避免使用
dpkg --set-selections直接设 hold —— 它绕过 apt-mark 的校验逻辑,易被 GUI 工具或某些安装流程意外重置











