はじめに
これまでに、3回シリーズとしてgitbucket-dockerをビルドしてから動かすまで、また外部データベースとしてPostgreSQLを使う方法を書いてきました。
今回は、外部データベースとして使用するPostgreSQLをバージョンアップする方法について書いていきたいと思います。
ここで、「gitbucket-dockerを動かす (3) 外部データベースとしてPostgreSQLを使う」では、PostgreSQL用のDockerコンテナーとして「12.1-alpine」を使用していました。現在は、「13.3-alpine」を使用することができますので、こちらにバージョンアップします。ところが、PostgreSQLのメジャーバージョンアップの場合には、そのままでは動かすことができなくてDBを移行する必要があります。
つまり具体的に、gitbucket-dockerを使う場合にPostgreSQLをバージョン12.1から13.3にバージョンアップする際のDB移行の方法について整理していくことにします。
PostgreSQL12.1のDBバックアップ
PostgreSQLの文書には、次のように記載されています。
PostgreSQLのメジャーバージョンは、例えば8.4のようにバージョン番号の最初の二つの数字の組で表されます。 PostgreSQLのマイナーバージョンは、バージョン番号の3番目の数字の組で表されます。例えば8.4.2は8.4の2番目のマイナーリリースです。 マイナーリリースでは内部データ保存形式は決して変更されず、同じメジャーバージョン番号の以前と以降のマイナーリリースと常に互換性があります。例えば8.4.2は8.4、8.4.1、8.4.6と互換性があります。 互換性のあるバージョン間での更新は、サーバが停止している間に実行ファイルを置き換えサーバを再起動するだけです。 データディレクトリはそのままです。マイナーアップグレードはそのように簡単です。
PostgreSQL 9.0.4文書 24.4. リリース間の移行
PostgreSQLのメジャーリリースでは、内部データ保存形式は変更されることがあります。そのため、アップグレードは複雑になります。
具体的な移行方法としては、「pg_dumpでのデータの移行」と「pg_upgradeでのデータの移行」が記載されています。ここで、pg_upgradeについては次のようにも記載されています。
contribプログラムpg_upgradeを使えばPostgreSQLのあるメジャーバージョンから次のものにインストールをその場で移行することができます。 この方法では古いバージョンと新しいものとを同時に動作させる機会は与えられないことは心に留めておいて下さい。 また、pg_upgradeはpg_dumpほど実運用でテストされていませんので、何か上手くいかなかった場合に備えて最新のバックアップを取っておくことを強く勧めます。
PostgreSQL 9.0.4文書 24.4. リリース間の移行
そこで、ここではpg_dumpによる移行を行いたいと思います。
最初に、現在のPostgreSQL 12.1のDBをバックアップします。そのために、現在gitbucket-dockerで使っているdocker-compose.ymlファイルからPostgreSQL 12.1だけを動かすdocker-compose.ymlファイルを作成します。ここでは、old.ymlとしてみます。
またgitbucket-dockerでボリュームマウントしていたディレクトリーをgitbucketからgitbucket.oldにリネームしておきます。このためのdocker-compose用の設定ファイルは次の内容になります。
version "3.1""
services:
postgres:
image: postgres:12.1-alpine
ports:
- 5432:5432
environment:
- POSTGRES_DB=gitbucket
- POSTGRES_USER=sa
- POSTGRES_PASSWORD=sa
- TZ=Asia/Tokyo
- LANG=ja_JP.UTF-8
volumes:
- ./gitbucket.old/var/lib/postgresql/data:/var/lib/postgresql/data
ここでは、PostgreSQL用のユーザー、パスワードを”sa”としていますが実際の内容で修正してください。
準備ができたら、PostgreSQLのDockerコンテナーを起動します。
$ docker-compose -f old.yml up
正常に起動したら、別の端末画面からPostgreSQLのDockerコンテナーにログインして実行します。
$ docker exec -it gitbucket-docker_postgres_1 bash
bash-5.0$
ログインに成功したら、DBをのバックアップを実行します。
bash-5.0$ cd /var/lib/postgresql/data
bash-5.0$ pg_dumpall -U sa >backup
DBのバックアップを取得できたので、PostgreSQLを終了します。
$ docker-compose -f old.yml down
PostgreSQL 13.3のDBリストア
新しいバージョン用のdocker-compose.ymlファイルを作成します。こちらは、マウント用のディレクトリーをgitbucket.newとしてみます。また、PostgreSQLは13.3にしてみます。この場合のdocker-compose用のファイルを、new.ymlとして以下のような内容で作成しておきます。
version: '3.1'
services:
postgres:
image: postgres:13.3-alpine
ports:
- 5432:5432
environment:
- POSTGRES_DB=gitbucket
- POSTGRES_USER=sa
- POSTGRES_PASSWORD=sa
- TZ=Asia/Tokyo
- LANG=ja_JP.UTF-8
volumes:
- ./gitbucket.new/var/lib/postgresql/data:/var/lib/postgresql/data
準備ができましたので、新しいバージョンのPostgreSQLを起動します。
$ docker-compose -f new.yml up
一旦、PostgreSQLを終了してから、先ほどバックアップしたファイルをコピーします。
$ docker-compose -f new.yml down
$ sudo cp ./gitbucket.old/var/lib/postgresql/data/backup ./gitbucket.new/var/lib/postgresql/data
ここで、再度PostgreSQLを起動してからバックアップしておいたDBのリストアを実行します。
$ docker-compose -f new.yml up
$ docker exec -it gitbucket-docker_postgres_1 bash
bash-5.1# cd /var/lib/postgresql/data
bash-5.1# psql -U sa gitbucket <backup
bash-5.1# exit
$ docker-compose -f new.yml down
Gitbucketのデータ移行
PostgreSQLのDBをバージョンアップできましたから、続けて元々のGitbucketのデータを移行します。
$ cd gitbucket.old
$ sudo rsync -av data ../gitbucket.new
すべて移行しましたから、ディレクトリー名を元に戻しておきます。
$ sudo mv gitbucket.new gitbucket
これで、Gitbucketで使用しているPostgreSQLDBをバージョンアップすることができました。