Open13

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.
[
たまぬぎたまぬぎ

下記コマンドで行けそう

$ 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 をつけてあげる。

https://github.com/compose-spec/compose-spec/blob/master/spec.md#external-1

たまぬぎたまぬぎ

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

セキュリティ的にはあまりよくないかも?

たまぬぎたまぬぎ

https://www.postgresql.jp/document/9.1/html/auth-pg-hba-conf.html

trust
接続を無条件で許可します。 この方式は、PostgreSQLデータベースサーバに接続できる全てのユーザが、任意のPostgreSQLユーザとしてパスワードや他の認証なしでログインすることを許可します。 詳細は項19.3.1を参照してください。

よくなさそうなので、ちゃんとした設定方法を調査する

たまぬぎたまぬぎ

pg_upgradepg_hba.conf を持っていてくれないみたいなので、以前使っていた pg_hba.conf を自前で持っていく必要がある