{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: 私有化部署

{{< /details >}}

数据库迁移因未完成的分批后台迁移失败

当更新到极狐GitLab 版本 14.2 或更高版本时,数据库迁移可能会失败,并显示如下消息:

StandardError: An error has occurred, all later migrations canceled:

Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
  {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob",
   :table_name=>"push_event_payloads",
   :column_name=>"event_id",
   :job_arguments=>[["event_id"],
   ["event_id_convert_to_bigint"]]
  }

要解决此错误:

  • 如果您没有遵循这些说明,您必须选择以下操作之一:
    • 回滚并升级 到更新到 14.2+ 之前的一个必需版本。
    • 前滚,停留在当前版本,并手动确保分批迁移成功完成。

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

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

  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 队列中

{{< alert type=”warning” >}}

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

{{< /alert >}}

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

# 对于 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+ 个待处理作业,这可能会导致运行时内存溢出。

{{< tabs >}}

{{< tab title=”Linux 软件包 (Omnibus)” >}}

# 启动 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) }

{{< /tab >}}

{{< tab title=”自编译 (源代码)” >}}

# 启动 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) }

{{< /tab >}}

{{< /tabs >}}

后台迁移卡在 “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 状态中清除它们是安全的:

{{< tabs >}}

{{< tab title=”Linux 软件包 (Omnibus)” >}}

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

# 在 rails 控制台中执行以下命令
Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
  puts "Running pending job '#{job.class_name}' with arguments #{job.arguments}"
  result = Gitlab::BackgroundMigration.perform(job.class_name, job.arguments)
  puts "Result: #{result}"
end

{{< /tab >}}

{{< tab title=”自编译 (源代码)” >}}

# 启动 rails 控制台
sudo -u git -H bundle exec rails RAILS_ENV=production

# 在 rails 控制台中执行以下命令
Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
  puts "Running pending job '#{job.class_name}' with arguments #{job.arguments}"
  result = Gitlab::BackgroundMigration.perform(job.class_name, job.arguments)
  puts "Result: #{result}"
end

{{< /tab >}}

{{< /tabs >}}

高级搜索迁移卡住

在极狐GitLab 15.0 中,一个名为 DeleteOrphanedCommit 的高级搜索迁移可能在跨版本升级时永久卡在 pending 状态。这个问题在极狐GitLab 15.1 中得到了纠正。

如果您是使用极狐GitLab 15.0 的极狐GitLab 私有化部署客户并使用高级搜索,您将会遇到性能下降。要清理迁移,请升级到 15.1 或更高版本。

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

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

错误:Elasticsearch 版本不兼容

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