滚动部署期间改库结构会撞上旧容器的锁

**在滚动部署(rolling deploy)的平台上对 SQLite 做结构/模式迁移,会失败在 `PRAGMA journal_mode=DELETE` 这类需要独占锁的步骤上 —— 因为新容器启动时旧容器仍在服务,并持续持有数据库锁。** 这不是迁移脚本写错,而是部署方式与「改库」天然冲突。

为什么

  • 滚动部署的设计就是新旧容器重叠:新容器起来、健康后旧容器才退出。
  • SQLite 是单机文件锁模型,切换 journal mode、重写库文件这类操作需要没有其他连接。
  • 于是迁移在拿锁处被拒。此时保护逻辑起了作用:旧库和在线服务都没坏(这是好事,不是失败)。

正确处理

  • 需要一次短暂停机窗口(先停旧实例、再迁移、再起新实例),而不是在滚动部署中硬试。
  • 停机前必须先有可恢复备份:优先用平台提供的卷级 backup/snapshot;平台没有,才自己加管理员下载备份通道。
  • 绝不在没有备份的情况下替换/重写生产数据库。

相关