{{< 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+ 之前,先更新到 14.0.5 或 14.1。
- 检查分批后台迁移的状态,确保它们都标记为已完成,然后再尝试再次升级。如果任何仍然标记为活动状态,手动完成它们。
前滚并在升级版本上完成迁移
前滚的过程取决于是否需要停机。
对于需要停机的部署
运行所有分批后台迁移可能会根据您的极狐GitLab 安装规模需要很长时间。
- 在数据库中 检查分批后台迁移的状态,并用适当的参数 手动运行它们,直到状态查询返回没有行。
- 当所有的状态都标记为完成时,重新运行您的安装迁移。
-
从极狐GitLab 升级中 完成数据库迁移:
sudo gitlab-rake db:migrate
-
运行重新配置:
sudo gitlab-ctl reconfigure
- 完成您的安装升级。
对于无需停机的部署
由于失败的迁移是部署后迁移,您可以停留在已升级版本的运行实例上,并等待分批后台迁移完成。
- 从错误消息中 检查分批后台迁移的状态,确保它被列为已完成。如果迁移仍然活跃,请选择:
- 等待直到它完成。
- 手动完成它。
- 重新运行您的安装迁移,以便剩余的部署后迁移完成。
后台迁移仍在 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 版本 兼容。