GitLab Omnibus升级后NullifyOrphanRunnerIdOnCiBuilds迁移任务卡73%失败求助
GitLab Omnibus 迁移任务「NullifyOrphanRunnerIdOnCiBuilds: ci_builds」失败排查与解决
基本信息
- 安装方式:自托管GitLab Omnibus
- 当前版本:15.11.6
- 升级路径:从12.8.1多次升级至15.11.6
问题现象
升级完成后,后台迁移任务「NullifyOrphanRunnerIdOnCiBuilds: ci_builds」中途失败,始终卡在73.00%进度,重试后仍卡在该节点并再次失败。
任务运行状态截图

报错消息截图

解决办法
1. 定位具体报错原因
先查看迁移日志和数据库日志,确定卡顿/失败的根源:
# 查看GitLab迁移日志 sudo gitlab-ctl tail gitlab-rails/migration.log # 查看PostgreSQL日志 sudo gitlab-ctl tail postgresql
重点关注是否存在锁表、数据量过大、数据约束冲突等问题。
2. 手动分批处理迁移数据
若因ci_builds表数据量过大导致超时,可手动拆分迁移操作:
- 暂停GitLab服务避免数据写入干扰:
sudo gitlab-ctl stop
- 进入PostgreSQL控制台:
sudo gitlab-psql
- 分批更新孤儿runner_id记录:
-- 先统计待处理记录数 SELECT COUNT(*) FROM ci_builds WHERE runner_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM ci_runners WHERE id = ci_builds.runner_id); -- 每次更新1000条,重复执行直到完成 UPDATE ci_builds SET runner_id = NULL WHERE runner_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM ci_runners WHERE id = ci_builds.runner_id) LIMIT 1000;
- 标记迁移任务为已完成:
sudo gitlab-rails runner "Migration.where(name: 'NullifyOrphanRunnerIdOnCiBuilds').update_all(status: 2)"
- 重启GitLab服务:
sudo gitlab-ctl start
3. 调整迁移超时配置
若为超时导致失败,可临时延长迁移超时时间:
- 编辑GitLab配置文件:
sudo nano /etc/gitlab/gitlab.rb
- 添加或修改超时设置:
gitlab_rails['db_migration_timeout'] = 3600 # 设置为1小时,可按需调整
- 重新配置并重启服务:
sudo gitlab-ctl reconfigure sudo gitlab-ctl restart
- 重新执行迁移:
sudo gitlab-rake db:migrate
4. 修复数据异常
若日志显示数据约束冲突,先修复异常数据:
-- 查找异常记录 SELECT * FROM ci_builds WHERE runner_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM ci_runners WHERE id = ci_builds.runner_id); -- 修复异常记录 UPDATE ci_builds SET runner_id = NULL WHERE runner_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM ci_runners WHERE id = ci_builds.runner_id);
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

