Help us learn about your current experience with the documentation. Take the survey.

排查后台迁移问题

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab Self-Managed

因批处理后台迁移未完成导致数据库迁移失败

当升级到 GitLab 14.2 或更高版本时,数据库迁移可能会失败,并显示类似以下的错误信息:

StandardError: 发生错误,所有后续迁移已取消:

期望给定配置的批处理后台迁移被标记为 'finished',但实际是 'active':
  {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob",
   :table_name=>"push_event_payloads",
   :column_name=>"event_id",
   :job_arguments=>[["event_id"],
   ["event_id_convert_to_bigint"]]
  }

要解决此错误:

回滚并遵循所需的升级路径

要回滚并遵循所需的升级路径:

  1. 回滚并恢复之前安装的版本
  2. 在升级到 14.2+ 之前,先升级到 14.0.5 或 14.1。
  3. 在尝试再次升级之前,检查批处理后台迁移的状态,并确保它们都被标记为完成。如果仍有标记为活动的,手动完成它们

向前滚动并在升级版本上完成迁移

向前滚动的过程取决于是否需要停机。

对于有停机时间的部署

运行所有批处理后台迁移可能需要相当长的时间,具体取决于您的 GitLab 安装规模。

  1. 在数据库中 检查批处理后台迁移的状态,并使用适当的参数 手动运行它们,直到状态查询不返回任何行。

  2. 当所有迁移的状态都标记为完成时,为您的安装重新运行迁移。

  3. 从您的 GitLab 升级中 完成数据库迁移

    sudo gitlab-rake db:migrate
  4. 运行重新配置:

    sudo gitlab-ctl reconfigure
  5. 完成您的安装升级。

对于无停机时间的部署

由于失败的迁移是部署后迁移,您可以保持在升级版本的运行实例上,并等待批处理后台迁移完成。

  1. 从错误消息中 检查批处理后台迁移的状态,并确保它被列为完成。如果迁移仍然处于活动状态,可以:
  2. 重新运行您的安装迁移,以便剩余的部署后迁移完成。

后台迁移保留在 Sidekiq 队列中

以下操作可能会影响您的 GitLab 性能。它们运行执行各种数据库或文件更新的 Sidekiq 作业。

运行以下检查。如果检查返回非零值且计数没有随时间减少,请遵循本节中的其余步骤。

# 对于 Linux 包安装:
sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'

# 对于自编译安装:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'

重新执行以下命令是安全的,特别是当您有 1000+ 个待处理作业时,这可能会溢出您的运行时内存。

# 启动 rails 控制台
sudo gitlab-rails c

# 在 rails 控制台中执行以下命令
scheduled_queue = Sidekiq::ScheduledSet.new
pending_job_classes = scheduled_queue.select { |job| job["class"] == "BackgroundMigrationWorker" }.map { |job| job["args"].first }.uniq
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
# 启动 rails 控制台
sudo -u git -H bundle exec rails RAILS_ENV=production

# 在 rails 控制台中执行以下命令
scheduled_queue = Sidekiq::ScheduledSet.new
pending_job_classes = scheduled_queue.select { |job| job["class"] == "BackgroundMigrationWorker" }.map { |job| job["args"].first }.uniq
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }

后台迁移卡在 “pending” 状态

对于卡在 pending 状态的后台迁移,运行以下检查。如果 它返回非零值且计数没有随时间减少,请遵循本节中的其余步骤。

# 对于 Linux 包安装:
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigrationJob.pending.count'

# 对于自编译安装:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigrationJob.pending.count'

重新尝试这些迁移以清除它们的 pending 状态是安全的:

# 启动 rails 控制台
sudo gitlab-rails c

# 在 rails 控制台中执行以下命令
Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
  puts "运行待处理作业 '#{job.class_name}',参数为 #{job.arguments}"
  result = Gitlab::BackgroundMigration.perform(job.class_name, job.arguments)
  puts "结果: #{result}"
end
# 启动 rails 控制台
sudo -u git -H bundle exec rails RAILS_ENV=production

# 在 rails 控制台中执行以下命令
Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
  puts "运行待处理作业 '#{job.class_name}',参数为 #{job.arguments}"
  result = Gitlab::BackgroundMigration.perform(job.class_name, job.arguments)
  puts "结果: #{result}"
end

高级搜索迁移卡住

在 GitLab 15.0 中,名为 DeleteOrphanedCommit 的高级搜索迁移可能在升级过程中永久卡在 pending 状态。此问题 已在 GitLab 15.1 中修复

如果您是使用 GitLab 15.0 和高级搜索的 GitLab 自托管客户,您会遇到性能下降。 要清理此迁移,请升级到 15.1 或更高版本。

对于其他卡在 pending 状态的高级搜索迁移问题,重试已停止的迁移

如果在所有待处理的高级搜索迁移完成之前升级 GitLab,任何在新版本中已移除的待处理迁移都无法执行或重试。 在这种情况下,您必须 从头重新创建索引

错误:Elasticsearch version not compatible

要解决此问题,请确认您的 Elasticsearch 或 OpenSearch 版本 与您的 GitLab 版本兼容