久しぶりにRailsアプリを起動したらエラーが起きたので原因を探っていく
deeplで翻訳してくれた
サーバに接続できませんでした: そのようなファイルまたはディレクトリはありません。サーバーはローカルで動作し、Unixドメインソケット「/tmp/.s.PGSQL.5432」での接続を受け入れているか?
問題を解く
- サーバに接続できない
- ファイル、ディレクトリがない
- サーバがローカルで動作しているか、そのドメインは/tmp/.s.PGSQL.5432なのか
エンジニアとしては初心者なのでこの順序で解いていく
1を解く
サーバに接続できない => サーバ起動しているか
サーバーの状態確認はsystemctlなどのコマンドもあるようですが、現段階の自分のMacでは使えません
homebrewでダウンロードしていたPostgreSQLでしたのでDBサーバの起動状態の確認は
% brew services list
Name Status User File
emacs none
mysql@5.7 none
postgresql error 256 hogehoge ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
postgresql@12 none
postgresql@13 none
unbound none
こちらの記事
で brew services
についてかいてあったので引用
ここで、Plistの欄がありますが、services startすると、 plistがLaunchAgentsディレクトリ等にコピーされ、以後、 自動で起動時などに読み込まれてコマンドを起動したりする様になります。
エラーになっているので停止
brew services stop postgresql
psqlコマンドを打って
postgresql
はpsql -V
からpsql (PostgreSQL) 14.1
とわかりました
そもそも洒落っ気を出してiterm2なるターミナルに代わる使い勝手よさそうなものを導入しようとしてhomebrewをUpdateしたあたりからおかしいと思いました。Posgreの14て新しくね?
brew services start postgresql@13
としてもう一度ブラウザを確認
データベースがないことでエラーが起きているようです。
rails db:create
と rails db:migrate
を実行
railsサーバーにはエラーなく入ることは出来たのですが以前のテーブルデータがございません。大丈夫か?
これが正しい答えなのでは?
さらに記事を引用します。
というか以前もpostgreをアップグレードしたときにお世話になった記事のようです。
まずは brew info postgresql
% brew info postgresql
postgresql: stable 14.1 (bottled), HEAD
Object-relational database system
https://www.postgresql.org/
/usr/local/Cellar/postgresql/14.1_1 (3,304 files, 45MB) *
Poured from bottle on 2022-01-24 at 23:50:17
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/postgresql.rb
License: PostgreSQL
==> Dependencies
Build: pkg-config ✔
Required: icu4c ✔, krb5 ✔, openssl@1.1 ✔, readline ✔
==> Options
--HEAD
Install HEAD version
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
brew postgresql-upgrade-database
This formula has created a default database cluster with:
initdb --locale=C -E UTF-8 /usr/local/var/postgres
For more details, read:
https://www.postgresql.org/docs/14/app-initdb.html
To restart postgresql after an upgrade:
brew services restart postgresql
Or, if you don't want/need a background service you can just run:
/usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres
==> Analytics
install: 90,012 (30 days), 351,492 (90 days), 1,536,916 (365 days)
install-on-request: 86,592 (30 days), 338,228 (90 days), 1,470,528 (365 days)
build-error: 38 (30 days)
ここに重要なことが書いてありますね。
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
brew postgresql-upgrade-database
以前のメジャーバージョンのPostgreSQLから既存のデータを移行するには、以下を実行します。
brew postgresql-upgrade-database
データ移行がこれでできるのでは?先ほどテーブルがなかったことが解決できることに期待
その前に起動中のpostgresql@13でもinfoをかける
% brew info postgresql@13
postgresql@13: stable 13.5 (bottled) [keg-only]
Object-relational database system
https://www.postgresql.org/
/usr/local/Cellar/postgresql@13/13.5_1 (3,233 files, 42.8MB)
Poured from bottle on 2022-01-26 at 08:06:31
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/postgresql@13.rb
License: PostgreSQL
==> Dependencies
Build: pkg-config ✔
Required: icu4c ✔, krb5 ✔, openssl@1.1 ✔, readline ✔
==> Caveats
Previous versions of this formula used the same data directory as
the regular PostgreSQL formula. This causes a conflict if you
try to use both at the same time.
In order to avoid this conflict, you should make sure that the
postgresql@13 data directory is located at:
/usr/local/var/postgresql@13
This formula has created a default database cluster with:
initdb --locale=C -E UTF-8 /usr/local/var/postgresql@13
For more details, read:
https://www.postgresql.org/docs/13/app-initdb.html
postgresql@13 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.
If you need to have postgresql@13 first in your PATH, run:
echo 'export PATH="/usr/local/opt/postgresql@13/bin:$PATH"' >> ~/.zshrc
For compilers to find postgresql@13 you may need to set:
export LDFLAGS="-L/usr/local/opt/postgresql@13/lib"
export CPPFLAGS="-I/usr/local/opt/postgresql@13/include"
For pkg-config to find postgresql@13 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/postgresql@13/lib/pkgconfig"
To restart postgresql@13 after an upgrade:
brew services restart postgresql@13
Or, if you don't want/need a background service you can just run:
/usr/local/opt/postgresql@13/bin/postgres -D /usr/local/var/postgresql@13
==> Analytics
install: 8,844 (30 days), 36,310 (90 days), 50,579 (365 days)
install-on-request: 8,821 (30 days), 36,261 (90 days), 50,507 (365 days)
build-error: 1 (30 days)
postgresql@13で起動していましたが、現在Pathの通ってる14.1でもう一度チャレンジしてみようと思います。
一度、brew services stop postgresql@13
で停止するとrailsのアプリでは最初のスクショの状態です。
brew postgresql-upgrade-database
をうちます
% brew postgresql-upgrade-database
Error: /usr/local/var/postgres.old already exists!
Remove it if you want to upgrade data automatically.
エラーになりました。postgres.oldを削除したほうがよさそうですが、
参考記事:PostgreSQL DB のアップグレードは brew postgresql-upgrade-database が便利
こちらから、リネームでもよさそうなので一旦リネームして
再度brew postgresql-upgrade-database
を実行
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
ログを省略しましたが、無事データ移行ができたようです。
リネームしたファイルは残っています。
% ls
cache log postgres postgres_re.old postgresql@13
homebrew mysql postgres.old postgresql@12