アップグレード失敗後のバックアップからのリストア

アップグレードは通常スムーズで、バックアップからの復元はめったに起こりません。 しかし、問題が発生した場合の復旧方法を知っておくことは重要です。

以前のバージョンにロールバックし、バックアップを復元します。

アップグレードに失敗した場合、一番手っ取り早い解決策は、以前のバージョンにロールバックすることです。

まず、コードやパッケージをロールバックします。 ソースのインストールでは、古いバージョン (ブランチまたはタグ) をチェックアウトします。 Omnibus のインストールでは、古い.deb または.rpm パッケージをインストールします。 次に、バックアップからリストアします。Backup and Restoreドキュメントの指示に従ってください。

次回のアップグレードで起こりうる問題

ロールバックが必要な場合、その後のアップグレードで問題が発生する可能性があります。 これは、失敗したアップグレード中にいくつかのテーブルが追加された可能性があるためです。 古いバックアップからリストアした後もこれらのテーブルが存在する場合、今後のアップグレードで移行に失敗する可能性があります。

GitLab 8.6から、この問題を防ぐためにバックアップをインポートする前にすべてのテーブルを削除するようになりました。 8.6より前のバージョンにバックアップをリストアしている場合は、次回アップグレードするときに手動で問題を修正する必要があるかもしれません。

エラーの例

== 20151103134857 CreateLfsObjects: migrating =================================
-- create_table(:lfs_objects)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateTable: ERROR:  relation "lfs_objects" already exists

エラーからバージョンをコピーします。この場合、バージョン番号は20151103134857です。

警告:以下の手順は、これが必要であると確信できる場合にのみ使用してください。

GitLab 8.6 以上

データベースRakeタスクにバージョンを渡し、手動で移行完了をマークします。

# Source install
sudo -u git -H bundle exec rake gitlab:db:mark_migration_complete[20151103134857] RAILS_ENV=production

# Omnibus install
sudo gitlab-rake gitlab:db:mark_migration_complete[20151103134857]

マイグレーションが正常にマークされたら、Rakedb:migrate タスクを再度実行します。失敗したマイグレーションがすべて完了とマークされるまで、このプロセスを何度か繰り返す必要があるでしょう。

GitLab < 8.6

# Source install
sudo -u git -H bundle exec rails console -e production

# Omnibus install
sudo gitlab-rails console

Railsコンソールで以下のコマンドを入力します:

ActiveRecord::Base.connection.execute("INSERT INTO schema_migrations (version) VALUES('20151103134857')")
exit

マイグレーションが正常にマークされたら、Rakedb:migrate タスクを再度実行します。失敗したマイグレーションがすべて完了とマークされるまで、このプロセスを何度か繰り返す必要があるでしょう。