문제 해결

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

일괄 백그라운드 마이그레이션이 완료되지 않아 데이터베이스 마이그레이션이 실패하는 경우

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. 14.2+로 업데이트하기 전에 필요한 버전 중 하나로 롤백 및 업그레이드 하세요.
  2. 현재 버전을 유지한 채 롤 포워드하고 일괄 마이그레이션을 매뉴얼으로 성공적으로 완료하십시오.

롤백 및 필요한 업그레이드 경로 따르기

  1. 이전에 설치된 버전을 롤백하고 복원하세요.
  2. 14.2+로 업데이트 하기 전에 14.0.5 또는 14.1 중 하나로 업데이트하십시오.
  3. 일괄 백그라운드 마이그레이션의 상태를 확인하고, 다시 업그레이드를 시도하기 전에 모든 마이그레이션이 완료되었는지 확인하십시오. 만약 활성 상태로 남아 있다면, 매뉴얼으로 완료할 수 있습니다.

업그레이드된 버전에서 마이그레이션을 완료하기 위한 롤 포워드

다운타임이 있는 배포의 경우

모든 일괄 백그라운드 마이그레이션을 실행하려면 GitLab 설치의 크기에 따라 상당한 시간이 소요될 수 있습니다.

  1. 데이터베이스의 일괄 백그라운드 마이그레이션 상태를 확인하고, 적절한 인수로 매뉴얼으로 실행하여 상태 조회 결과가 더 이상 행이 반환되지 않도록 합니다.
  2. 모든 마이그레이션의 상태가 완료로 표시된 경우, 설치의 데이터베이스 마이그레이션을 다시 실행합니다.
  3. GitLab 업그레이드를 완료합니다.

다운타임이 없는 배포의 경우

마이그레이션 실패는 배포 후 마이그레이션이며, 업그레이드된 버전의 실행 인스턴스로 남아 있을 수 있습니다. 이 경우, 일괄 백그라운드 마이그레이션을 기다릴 수 있습니다.

  1. 에러 메시지의 일괄 백그라운드 마이그레이션의 상태를 확인하고, 완료되었는지 확인하십시오. 아직 활성 상태라면, 완료될 때까지 기다리거나 매뉴얼으로 완료할 수 있습니다.
  2. 설치의 마이그레이션을 다시 실행하여 나머지 배포 후 마이그레이션이 완료되도록 합니다.

Sidekiq 대기열에 남아 있는 백그라운드 마이그레이션

caution
다음 작업은 GitLab 성능에 지장을 줄 수 있습니다. 다양한 데이터베이스 또는 파일 업데이트를 수행하는 Sidekiq 작업을 실행합니다.

다음 확인을 실행하십시오. 이 확인이 0이 아니고 시간이 지나도 감소하지 않으면, 이 섹션의 나머지 단계를 따르십시오.

# 리눅스 패키지 설치의 경우:
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개 이상의 보류 중인 작업이 있는 경우에는 아래 명령을 다시 실행해도 안전합니다.

리눅스 패키지 (Omnibus)
# 레일스 콘솔 실행
sudo gitlab-rails c

# 레일스 콘솔에서 다음 실행
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) }
소스로 컴파일된 경우
# 레일스 콘솔 실행
sudo -u git -H bundle exec rails RAILS_ENV=production

# 레일스 콘솔에서 다음 실행
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) }

‘보류’ 상태의 백그라운드 마이그레이션이 멈춰있는 경우

보류 중인 백그라운드 마이그레이션에 대해 다음 확인을 실행하십시오. 이 확인이 0이 아니고 시간이 지나도 감소하지 않으면, 이 섹션의 나머지 단계를 따르십시오.

# 리눅스 패키지 설치의 경우:
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'

이러한 마이그레이션을 다시 시도하여 보류 상태에서 제거하는 것은 안전합니다.

리눅스 패키지 (Omnibus)
# 레일스 콘솔 실행
sudo gitlab-rails c

# 레일스 콘솔에서 다음 실행
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: #{result}"
end
소스로 컴파일된 경우
# 레일스 콘솔 실행
sudo -u git -H bundle exec rails RAILS_ENV=production

# 레일스 콘솔에서 다음 실행
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: #{result}"
end