dockerで動かしているPostgreSQL 11をアップグレードしたい
docker-composeで動かしているPostgreSQLをアップグレードしたい
dbms:
image: postgres:11.2-alpine
environment:
TZ: ${OS_TIMEZONE}
PGPORT: ${DB_PORT}
POSTGRES_PASSWORD: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -d postgres -U postgres"]
interval: 10s
timeout: 10s
retries: 5
restart: always
volumes:
- ./service/postgres/mount:/docker-entrypoint-initdb.d
- dbms_data:/var/lib/postgresql/data
11のデータが入っているので単純に12にすると以下のエラーが出る
dbms_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
dbms_1 |
dbms_1 | 2021-12-17 12:39:28.564 JST [1] FATAL: database files are incompatible with server
dbms_1 | 2021-12-17 12:39:28.564 JST [1] DETAIL: The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 12.9.
[
pg_upgrade
が使えそう
今回はdocker-composeで動かしており、docker volume としてdata directoryがあるので、 docker-postgres-upgrade
を使うと良さそう
下記コマンドで行けそう
$ docker run --rm \
-v ${compose project prefix}_dbms_data:/var/lib/postgresql/11/data \
-v dbms_data_14:/var/lib/postgresql/14/data \
tianon/postgres-upgrade:11-to-14
実行したらエラーが出た。
PostgreSQLが実行中というエラーらしい。
dbms_data
の中身を見たら postmaster.pid
が残っていたのでおそらくこれが原因だと思われる。
There seems to be a postmaster servicing the old cluster.
Please shutdown that postmaster and try again.
Failure, exiting
docker-compose down
していたのがおそらく良くなかった。
docker-compose up -d dbms
でPostgreSQLだけ起動し、その後 docker-compose stop
でshutdownさせてあげたら成功した 🎉
$ docker run --rm ... tianon/postgres-upgrade:11-to-14
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
dbms_data_14
を docker-composeでvolume mountして起動してみる
dbms:
image: postgres:${VERSION_DBMS}
environment:
TZ: ${OS_TIMEZONE}
PGPORT: ${DB_PORT}
POSTGRES_PASSWORD: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -d postgres -U postgres"]
interval: 10s
timeout: 10s
retries: 5
restart: always
volumes:
- ./service/postgres/mount:/docker-entrypoint-initdb.d
- dbms_data_14:/var/lib/postgresql/data
volumes:
dbms_data:
dbms_data_14:
external: true
dbms_data_14
は普通のdocker volumeとして作成されているので external: true
をつけてあげる。
docker-compose exec dbms psql -U postgres
でDBの中身を確認 👀
大丈夫そう 🎉
dbms_1 | 2021-12-17 06:36:17.704 UTC [1193] FATAL: no pg_hba.conf entry for host "172.19.0.9", user "sonarqube", database "sonarqube", no encryption
dbms_1 | 2021-12-17 06:36:35.702 UTC [1204] FATAL: no pg_hba.conf entry for host "172.19.0.14", user "redmine", database "redmine", no encryption
pg_hba.conf
のところでエラーが発生した
docker-compose exec dbms /bin/bash
でコンテナに入り /var/lib/postgresql/data/pg_hba.conf
に以下の行を追加することで解決した
host all all all trust
セキュリティ的にはあまりよくないかも?
Docker Volume をコピーする必要がある
以下の便利スクリプトでコピーできる