解決して喜ぶpostgresql象のイメージなんですが、出だしはエラーから。
また出たエラー
またタイトル通りのpsqlのエラーが出た。
改めて調べたが、多分現時点ではこちらの対応がより良い対応と考えたのでその備忘録。
このエラーが頻発するのは、brew upgradeやbrew updateでpostgresqlはどんどんアップグレードされるわりに、上手くアップデートされない所があるのが理由の様だ。
前回の対応と欠点
前回の対応は下記記事の通り。
この時はバージョン違いが原因との事なので、postgresql14をアンインストールして、postgresql13を入れ直した。
しかし、このタイトルに追記した通り、この方法だと過去に作ったデータベースが消えてしまうと言う重大な難点がある。
それに今から考えると、この方法だといつまで経っても新しいバージョンに更新できない。
今回の方針
今回はもう一つの14(最新)に合わせる方を念頭に進める。
念の為今回もpostgresのログを見ておく。
環境によって場所に微妙な違いはあるだろうが、当方のMACではターミナルから下記のコマンドでlogが開く。
open /usr/local/var/log/postgres.log
見ると、前回同様の記述。
2021-11-25 11:54:30.417 JST [5224] FATAL: database files are incompatible with server 2021-11-25 11:54:30.417 JST [5224] DETAIL: The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 14.1.
う〜ん、PostgreSQL version 13によって、初期化されるデータディレクトリ(data directory)がpsqlのversion14.1 似合ってない、と言う事だから、データディレクトリを消してどちらもバージョン14をインストールし直す、と言うよりは、
PostgreSQLを14に上手く更新できれば良さそう?
探していると下記記事があった。
正に今の状況に合致した記事。共有感謝。
PostgreSQL DB のアップグレードは brew postgresql-upgrade-database が便利
更新手続き
この通り入力すると、更新開始。
% brew postgresql-upgrade-database ==> brew install postgresql@13 ==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/13/manifests/13.5 (中略) Error: Upgrading postgresql data from 13 to 14 failed! ==> Removing empty postgresql initdb database... ==> Moving postgresql data back from /usr/local/var/postgres.old to /usr/local/var/postgres... Error: Failure while executing; `/usr/local/opt/postgresql/bin/pg_upgrade -r -b /usr/local/Cellar/postgresql@13/13.5/bin -B /usr/local/opt/postgresql/bin -d /usr/local/var/postgres.old -D /usr/local/var/postgres -j 8` exited with 1.
しかし、更新途中にエラーで止まってしまった。
むむ、と思ったが参考にした記事とは引用コードの7行目部分が異なり、Errorメッセージの後が
Moving postgresql data back from /usr/local/var/postgres.old to /usr/local/var/postgres…
となっている。
これは自動で処理してくれたっぽい。
と言う事で、もう一度brew postgresql-upgrade-databaseを実行。
% brew postgresql-upgrade-database ==> Upgrading postgresql data from 13 to 14... waiting for server to start....2021-11-25 11:54:34.994 JST [5637] LOG: starting PostgreSQL 13.5 on x86_64-apple-darwin20.6.0, compiled by Apple clang version 13.0.0 (clang-1300.0.29.3), 64-bit (中略) Upgrade Complete ---------------- Optimizer statistics are not transferred by pg_upgrade. Once you start the new server, consider running: /usr/local/opt/postgresql/bin/vacuumdb --all --analyze-in-stages Running this script will delete the old cluster's data files: ./delete_old_cluster.sh ==> Upgraded postgresql data from 13 to 14! ==> Your postgresql 13 data remains at /usr/local/var/postgres.old
ダウンロードは済んでいたので、途中から開始、そして特に問題なく無事に終了!
参考にした記事から1年半経っているので、この辺り改善してくれたのに違いない。psql、brew開発の皆様にも感謝。
過去に作ったデータベースは残っているか?
確認した所、無事psqlが立ち上がった。
作っていたdatabaseもそのまま残っている。
良かった、上手くいった。
% psql postgres psql (14.1) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+-----------+----------+---------+-------+------ testdb | owner | UTF8 | C | C | (この欄省略) mydb | owner | UTF8 | C | C | postgres | owner | UTF8 | C | C | template0 | owner | UTF8 | C | C | template1 | owner | UTF8 | C | C | (5 rows)
ひとまずの結論
Macで「psql: error: connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or directory」が出た時の対応としては、現時点ではこちらの「ターミナルで”brew postgresql-upgrade-database”を実行する」がより良い、と言うかほぼベストの対応と考えます。
公式チュートリアルから
PostgreSQL13.1文書の1.2. 構造的な基本事項を読むと、下記記述が。
PostgreSQLはクライアント/サーバモデルを使用しています。 (中略)
• サーバプロセス。 これは、 データベースファイルを管理し、 クライアントアプリケーションからのデータベースの接続を受け付け、 クライアントに代わってデータベースに対する処理を行います。 データベースサーバプログラムはpostgresと呼ばれています。
• ユーザの、 データベース操作を行うクライアント(フロントエンド)アプリケーション。 クライアントアプリケーションはその性質上非常に多様性があります。 テキスト指向のツール、 グラフィカルなアプリケーション、 データベースにアクセスしWebページを表示するWebサーバ、 あるいはデータベースに特化した保守ツールなどがあります。 いくつかのクライアントアプリケーションがPostgreSQLの配布物に同梱されています
データベースサーバプログラムpostgresが古いバージョン(13)のままだったから起きた問題であり、このデータベースサーバプログラムを更新するコマンドが(postgresql-upgrade-database)、と言う理解と一旦しておく。
皆様の情報共有とプログラム改良に感謝。
「ソフトウェア品質を高める開発者テスト」
興味はあれども、こちらの知識にまるで疎い為購入。
固定レイアウトではなくリフロー型なので、ハイライトしたり、メモしたり、と後からの参照にも使い勝手が良い。
現時点(2021/11/25)でKindle版は1,320円。
中古本が1,739円程度だそうなので、中古本より3割弱お安く買えます。
コメント
[…] psql: error: connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or… […]