Docker部署的GitLab CE升级14.2.x时数据库迁移失败问题求助
GitLab CE Docker版14.0.x升级14.2.x迁移失败解决方案
前置操作
操作前必须完整备份GitLab所有挂载卷(配置、数据、日志目录),避免数据损坏
- 回滚到可正常运行的14.0.7版本容器,确保服务正常启动、数据无异常
- 进入容器后先检查所有未完成的后台迁移任务:
# 替换<your-gitlab-container-name>为实际的GitLab容器名称 docker exec -it <your-gitlab-container-name> gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
如果返回结果大于0,等待所有常规后台迁移执行完成,再继续下一步。
3. 查看批量后台迁移任务状态:
docker exec -it <your-gitlab-container-name> gitlab-rake gitlab:background_migrations:status
确认CopyColumnUsingBackgroundMigrationJob对应ci_job_artifacts表的任务状态为活跃/卡住状态。
方案一:正确执行手动终结迁移命令
日志提示的命令默认存在shell转义问题,Docker环境下需使用调整后的命令:
docker exec -it <your-gitlab-container-name> gitlab-rake "gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,ci_job_artifacts,id,'[[\"id\", \"job_id\"],[\"id_convert_to_bigint\", \"job_id_convert_to_bigint\"]]']"
命令执行完成后,再次运行迁移状态检查命令,确认对应任务状态变为finished,之后执行:
docker exec -it <your-gitlab-container-name> gitlab-ctl reconfigure
确认无报错后,停止14.0.7容器,启动14.2.1版本容器完成升级即可。
方案二:手动标记迁移完成(仅方案一失效时使用)
如果方案一执行后任务仍未标记为完成,可进入Rails控制台手动修改任务状态:
- 进入Rails控制台
docker exec -it <your-gitlab-container-name> gitlab-rails console
- 执行以下命令修改迁移状态:
migration = Gitlab::Database::BackgroundMigration::BatchedMigration.find_for_configuration( Gitlab::Database::MAIN_DATABASE_NAME, 'CopyColumnUsingBackgroundMigrationJob', 'ci_job_artifacts', 'id', [["id", "job_id"], ["id_convert_to_bigint", "job_id_convert_to_bigint"]] ) migration.status = 3 migration.save!
- 退出控制台后执行
gitlab-ctl reconfigure确认无报错,再启动14.2.1版本容器完成升级。
注意事项
- 升级全程确保服务器内存不低于4G,内存不足会导致迁移任务卡住
- 升级过程中不要强行终止容器,避免数据库事务异常
- 如果ci_job_artifacts表数据量过大,手动终结迁移的执行时间会较长,耐心等待命令执行完成即可
内容的提问来源于stack exchange,提问作者Adamwolf
相关产品推荐
相关产品推荐

