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エントリはこの状況に関するものです。、ステップは次のように要約されます。
- データベースデータのバックアップ
initdb
初期データベースの作成に使用されたパラメーターを検索してみてください。- 止める
postgresql.service
- すべてのPostgreSQLパッケージのアップグレード
- 古いデータベースのアップグレードから既存のデータを削除します。
- データベースデータを一時的な場所に移動し、アップグレードされたデータベースを保存するための新しいディレクトリを作成します。
initdb
ソースデータベースと同じパラメータを使用して新しいデータベースを初期化します。- 以前のデータベースのアップグレード
pg_upgrade
- スタート
postgresql.service
エラーがない場合は、PostgreSQLデータベースサーバーがアップグレードされたデータベースとして実行されているはずです。必要に応じて、以前のデータと一時ディレクトリをクリーンアップできます。
答え2
@GracefulRestartのいくつかのコメントによると、ついに私に役立った一部ステップ8.1pg_upgrade
部分:
- インストール
postgresql-old-upgrade
- 古いクラスタディレクトリの名前を変更し、新しいクラスタと一時作業ディレクトリを作成します。
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
- 古いクラスターと同じinitdbパラメーターを使用して新しいクラスターを初期化します。
[postgres]$ initdb -D /var/lib/postgres/data --locale=C.UTF-8 --encoding=UTF8 --data-checksums