一次持续近一周的 Nextcloud 后台数据库迁移:PreviewMigrationJob 的资源失控、限速执行与最终完成
在一次 Nextcloud 大版本升级之后,系统表面上已经完成版本更新,维护模式也已经解除,但数据库和存储层仍然存在一个持续运行的后台迁移任务: 这个任务最终持续了接近一周。 它并不是传统意义上“数据库 Schema 升级跑了一个星期”,而是 Nextcloud 把一部分历史数据迁移拆成了后台任务,使主版本升级可以提前结束,而大规模历史数据转换则在服务恢复之后继续进行。 这类设计可以缩短维护窗口,但也带来了一个容易被忽略的问题: 升级完成,不代表升级相关的所有数据迁移都已经结束。 一、迁移的实际规模 该实例积累了大量历史 Preview 数据。 当时统计到的迁移规模大致为: 因此,这并不是一个几十秒能够结束的普通后台任务。 Nextcloud 会让 PreviewMigrationJob 分批处理数据,而不是在版本升级过程中一次性完成全部迁移。 这也是为什么: 已经执行成功, 也都已经恢复正常, 但后台仍然持续进行数据迁移。 二、真正的问题不是“慢”,而是普通 cron 调度下出现资源失控 最开始,这项任务完全交给 Nextcloud 正常的 cron 机制运行。 例如: 正常情况下,这种方式没有问题。 但对于一个规模达到十万级数据库记录、百万级历史 Preview 文件的迁移任务来说,问题开始出现。 后台 PHP 任务逐渐堆积,部分进程进入: 也就是 Linux 中的不可中断 I/O 等待状态。 随后系统出现了明显异常: CPU 本身并不是主要瓶颈。 真正的问题更接近: …