PostgreSQL 10 から PostgreSQL 13 へのアップデートが失敗する

PostgreSQL 13 アップデート の議論に続きます:

私は 2 コンテナ構成(データコンテナには postgres.10redis のテンプレートのみ)のマルチサイト環境にいます。現在の PostgreSQL のバージョンは 10 で、13 にアップデートしたいと考えています。data コンテナを再構築した際に発生するエラーは以下の通りです:

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/13/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Hit:2 http://deb.debian.org/debian buster InRelease
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://apt.postgresql.org/pub/repos/apt buster-pgdg InRelease [104 kB]
Get:5 http://security.debian.org/debian-security buster/updates/main amd64 Packages [291 kB]
Get:6 http://apt.postgresql.org/pub/repos/apt buster-pgdg/main amd64 Packages [231 kB]
Hit:7 https://deb.nodesource.com/node_15.x buster InRelease
Fetched 743 kB in 1s (944 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-10
Suggested packages:
  postgresql-doc-10
The following NEW packages will be installed:
  postgresql-10 postgresql-client-10
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 6,441 kB of archives.
After this Operation, 30.6 MB of additional disk space will be used.
Get:1 http://apt.postgresql.org/pub/repos/apt buster-pgdg/main amd64 postgresql-client-10 amd64 10.17-1.pgdg100+1 [1,439 kB]
Get:2 http://apt.postgresql.org/pub/repos/apt buster-pgdg/main amd64 postgresql-10 amd64 10.17-1.pgdg100+1 [5,002 kB]
Fetched 6,441 kB in 0s (34.9 MB/s)
Selecting previously unselected package postgresql-client-10.
(Reading database ... 43021 files and directories currently installed.)
Preparing to unpack .../postgresql-client-10_10.17-1.pgdg100+1_amd64.deb ...
Unpacking postgresql-client-10 (10.17-1.pgdg100+1) ...
Selecting previously unselected package postgresql-10.
Preparing to unpack .../postgresql-10_10.17-1.pgdg100+1_amd64.deb ...
Unpacking postgresql-10 (10.17-1.pgdg100+1) ...
Setting up postgresql-client-10 (10.17-1.pgdg100+1) ...
update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/13/man/man1/psql.1.gz because link group psql.1.gz is broken
Setting up postgresql-10 (10.17-1.pgdg100+1) ...
Creating new PostgreSQL cluster 10/main ...
/usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/10/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 10 main start

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5433 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/13/man/man1/postmaster.1.gz because link group postmaster.1.gz is broken
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for postgresql-common (226.pgdg100+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 10 database server: main.
Stopping PostgreSQL 13 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok

The source cluster was not shut down cleanly.
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.

You can run ./launcher start app to restart your app in the meanwhile



FAILED
--------------------
Pups::ExecError: /root/upgrade_postgres failed with return #<Process::Status: pid 49 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params "/root/upgrade_postgres"
1f253827e5700e1861c4e586213aaffa8994e452e43b9336301dcd02072e00f4
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

postgres.10 テンプレートを再度設定すれば、すべて正常に動作します。
Postgres 13 へのアップグレードを行うにはどうすればよいでしょうか?

PS: Postgres 12 へのアップグレードも失敗しています

「いいね!」 2

データコンテナを停止する必要があると以前見たことがあります:

2 つのコンテナを停止した後、tail -f shared/data/log/var-log/postgres/current を実行すると以下のような出力が得られます:

2021-06-06 16:38:37.411 UTC [113] HINT:  The server must be started by the user that owns the data directory.
2021-06-06 16:38:38.424 GMT [114] LOG:  skipping missing configuration file "/shared/postgres_data/postgresql.auto.conf"
2021-06-06 16:38:38.424 UTC [114] FATAL:  data directory "/shared/postgres_data" has wrong ownership
2021-06-06 16:38:38.424 UTC [114] HINT:  The server must be started by the user that owns the data directory.
2021-06-06 16:38:39.439 GMT [115] LOG:  skipping missing configuration file "/shared/postgres_data/postgresql.auto.conf"
2021-06-06 16:38:39.439 UTC [115] FATAL:  data directory "/shared/postgres_data" has wrong ownership
2021-06-06 16:38:39.439 UTC [115] HINT:  The server must be started by the user that owns the data directory.
2021-06-06 16:38:40.461 GMT [116] LOG:  skipping missing configuration file "/shared/postgres_data/postgresql.auto.conf"
2021-06-06 16:38:40.461 UTC [116] FATAL:  data directory "/shared/postgres_data" has wrong ownership
2021-06-06 16:38:40.461 UTC [116] HINT:  The server must be started by the user that owns the data directory.

おそらくこれが問題の原因でしょう。これをどうすれば修正できますか?

「いいね!」 3

気になったのですが、あなたの postgres_data ディレクトリの所有者は何ですか?

「いいね!」 2

こちらです

root@forum:/var/discourse/shared/data# ls -al
total 32
drwxr-xr-x  8 root root   4096 Jun  6 16:56 .
drwxr-xr-x  4 root root   4096 Mar  3  2019 ..
drwxr-xr-x  3 root root   4096 Jul  8  2018 log
drwxr-xr-x  2 _apt netdev 4096 Jul  7  2018 postgres_backup
drwx------ 20 _apt netdev 4096 Jun  6 17:29 postgres_data
drwx------ 19 _apt netdev 4096 Jun  6 16:56 postgres_data_new
drwxrwsr-x  5 _apt netdev 4096 Jun  6 17:29 postgres_run
drwxr-xr-x  2 lxd  lxd    4096 Jun  6 17:34 redis_data

問題ありませんか?

「いいね!」 1

私の環境(2つのコンテナ、PostgreSQL 13)では、postgres_* のグループは netdev ではなく render であり、postgres_run グループの右側は setgid ではなく x です。しかし、これが何を意味するのかはよくわかりません:sweat_smile

追伸:redis_data は uuidd や syslog です。

「いいね!」 2

ありがとうございます、私にもわかりません :slight_smile:
誰かお手伝いしてくれるといいですね!

「いいね!」 1

同じコマンドを ls -lan で実行していただけますか?これにより、所有権の特定に役立ちます(-n はユーザー名を UID に、グループ名を GID に変換します)。以下は、私自身のサイト(2 つのコンテナ構成)の例です:

[root@/var/discourse/shared/data]$ ls -lan
total 28
drwxr-xr-x.  7   0   0 4096 Jun  7 22:15 .
drwxr-xr-x.  5   0   0 4096 Jun  7 22:28 ..
drwxr-xr-x.  3   0   0 4096 Jun  7 22:15 log
drwxr-xr-x.  2 105 109 4096 Jun  7 22:15 postgres_backup
drwx------. 19 105 109 4096 Jun  7 22:27 postgres_data
drwxrwxr-x.  3 105 109 4096 Jun  7 22:27 postgres_run
drwxr-xr-x.  2 106 110 4096 Jun  8 00:17 redis_data
「いいね!」 1

もちろん!こちらです:

root@forum:/var/discourse/shared/data# ls -lan
total 32
drwxr-xr-x  8   0   0 4096 Jun  6 16:56 .
drwxr-xr-x  4   0   0 4096 Mar  3  2019 ..
drwxr-xr-x  3   0   0 4096 Jul  8  2018 log
drwxr-xr-x  2 105 109 4096 Jul  7  2018 postgres_backup
drwx------ 20 105 109 4096 Jun  6 17:29 postgres_data
drwx------ 19 105 109 4096 Jun  6 16:56 postgres_data_new
drwxrwsr-x  5 105 109 4096 Jun  6 17:29 postgres_run
drwxr-xr-x  2 106 110 4096 Jun  9 14:10 redis_data

こんにちは、

私たちも同様の状況にありますが、スタンドアロン環境です。shared/standalone/log/var-log/ にはファイルが一切表示されませんが、コンテナ内に进入すると同じ結果が確認できます。

root@pulp-discourse-iptools:/var/www/discourse# tail -n 3 /var/log/postgres/current
2021-10-13 18:33:04.027 GMT [917] LOG:  skipping missing configuration file "/shared/postgres_data/postgresql.auto.conf"
2021-10-13 18:33:04.028 UTC [917] FATAL:  data directory "/shared/postgres_data" has wrong ownership
2021-10-13 18:33:04.028 UTC [917] HINT:  The server must be started by the user that owns the data directory.
root@pulp-discourse-iptools:/var/www/discourse# ls -lan /shared
total 8
drwxr-xr-x 12    0   0  178 Oct 13 18:01 .
drwxr-xr-x 56    0   0  167 May 10  2020 ..
drwxr-xr-x  3 1000  33   21 Apr  3  2019 backups
drwxr-xr-x  4    0   0   34 Apr  3  2019 log
drwxr-xr-x  2  106 110    6 Apr  3  2019 postgres_backup
drwx------ 20  105 109 4096 Oct 13 17:57 postgres_data
drwx------ 19  105 109 4096 Oct 13 18:02 postgres_data_new
drwxrwsr-x  4  105 109   60 Oct 13 17:56 postgres_run
drwxr-xr-x  2  108 111   41 Oct 13 18:26 redis_data
drwxr-xr-x  4    0   0   44 Apr  3  2019 state
drwxr-xr-x  4 1000  33   37 Oct 13 18:26 tmp
drwxr-xr-x  4 1000  33   38 Apr  3  2019 uploads

ただし、それでも少し不自然に感じられます。

root@pulp-discourse-iptools:/var/www/discourse# ls -alF /shared | grep postgres_
drwxr-xr-x  2 postgres    postgres    6 Apr  3  2019 postgres_backup/
drwx------ 20 Debian-exim ssh      4096 Oct 13 18:53 postgres_data/
drwx------ 19 Debian-exim ssh      4096 Oct 13 18:02 postgres_data_new/
drwxrwsr-x  4 Debian-exim ssh        60 Oct 13 17:56 postgres_run/

念のため、app.yml 内で \"templates/postgres.10.template.yml\" に戻し、現在は何としても古いインスタンスを起動することを目指しています。

なお、https://github.com/discourse/discourse_docker.git の最新コミットに切り替えた後、main ブランチに移行していることを共有しておきます。ただし、リビルドが成功しなかったため、以前のイメージを起動する際には影響はないはずです。

この状況を解決する方法をご存知の方がいらっしゃれば、非常に助かります。もし解決策が見つからない場合は、さらに詳しい報告をさせていただきます。

よろしくお願いいたします。
Andreas

こんにちは、再びお会いできて嬉しいです。

@noezDE さんのアドバイス(https://meta.discourse.org/t/update-failed-postgresql/153713/8、本当にありがとうございます!)に従い、この状況から回復することができました。

現在、サイトは再び稼働しており、再度アップグレードを検討しています。

よろしくお願いいたします、
Andreas.


復旧手順

まず、以下のコマンドを実行して進捗を得ました。

chown -R postgres /shared/postgres_data
sv restart postgres

その後、ログには以下が表示されました。

2021-10-13 18:52:12.437 UTC [3357] FATAL:  ロックファイル "/var/run/postgresql/.s.PGSQL.5432.lock" を作成できませんでした: 権限がありません

そのため、全面的に対処し、以下のコマンドを実行しました。

chown -R postgres:postgres /shared/postgres_*
sv restart postgres

これで完了です。

「いいね!」 5

もう一度試してみました。"templates/postgres.template.yml" を使用して、すべてが非常にスムーズに進み、PostgreSQL 10 から PostgreSQL 13 へのアップグレードが正常に完了しました。このソフトウェアの素晴らしい取り組みに対して、Discourse チーム全体に改めて感謝申し上げます。

「いいね!」 5