PostgreSQLをArch Linuxに再インストールした後も、まだ起動しません。

PostgreSQLをArch Linuxに再インストールした後も、まだ起動しません。

Arch LinuxデスクトップでPostgreSQLを最後に使用してから数ヶ月が経過しましたが、いくつかのアップデート後に何か問題が発生したようです。私が受け取ったサービスのステータスを尋ねる場合(systemctl status postgresql):

× postgresql.service - PostgreSQL database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Wed 2024-02-21 16:00:22 -03; 1h 28min ago
        CPU: 54ms

fev 21 16:00:22 phili systemd[1]: Starting PostgreSQL database server...
fev 21 16:00:22 phili postgres[11667]: An old version of the database format was found.
fev 21 16:00:22 phili postgres[11667]: See https://wiki.archlinux.org/index.php/PostgreSQL#>
fev 21 16:00:22 phili systemd[1]: postgresql.service: Control process exited, code=exited, >
fev 21 16:00:22 phili systemd[1]: postgresql.service: Failed with result 'exit-code'.
fev 21 16:00:22 phili systemd[1]: Failed to start PostgreSQL database server.

さまざまな方法で再インストールしようとしました。しかし重要なことはこれである:

pacman -Rsn postgresql
rm -rf /var/lib/postgres
pacman -Syu postgresql  

私がインストールするバージョンは最新の16ですが、14で使いました。はい、コンピュータを何度も再起動してみました。

答え1

PostgreSQLデータベースを初期化すると、データベースデータはPostgreSQLのメジャーバージョンにロックされます。

PostgreSQLのメジャーバージョンをアップグレードする場合は、データベースデータが新しいバージョンと互換性があることを確認する必要があります。

Arch Linuxは以下を提供しますWikiエントリはこの状況に関するものです。、ステップは次のように要約されます。

  1. データベースデータのバックアップ
  2. initdb初期データベースの作成に使用されたパラメーターを検索してみてください。
  3. 止めるpostgresql.service
  4. すべてのPostgreSQLパッケージのアップグレード
  5. 古いデータベースのアップグレードから既存のデータを削除します。
  6. データベースデータを一時的な場所に移動し、アップグレードされたデータベースを保存するための新しいディレクトリを作成します。
  7. initdbソースデータベースと同じパラメータを使用して新しいデータベースを初期化します。
  8. 以前のデータベースのアップグレードpg_upgrade
  9. スタートpostgresql.service

エラーがない場合は、PostgreSQLデータベースサーバーがアップグレードされたデータベースとして実行されているはずです。必要に応じて、以前のデータと一時ディレクトリをクリーンアップできます。

答え2

@GracefulRestartのいくつかのコメントによると、ついに私に役立った一部ステップ8.1pg_upgrade部分:

  1. インストールpostgresql-old-upgrade
  2. 古いクラスタディレクトリの名前を変更し、新しいクラスタと一時作業ディレクトリを作成します。
    mv /var/lib/postgres/data /var/lib/postgres/olddata
    mkdir /var/lib/postgres/data /var/lib/postgres/tmp
    chown postgres:postgres /var/lib/postgres/data /var/lib/postgres/tmp
    
  3. 古いクラスターと同じinitdbパラメーターを使用して新しいクラスターを初期化します。
    [postgres]$ initdb -D /var/lib/postgres/data --locale=C.UTF-8 --encoding=UTF8 --data-checksums
    

関連情報