could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?での対応

![スクリーンショット 2022-01-26 20.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513488/b714bb36-25c0-be46-03df-7e57e56d44b2.png)
久しぶりにRailsアプリを起動したらエラーが起きたので原因を探っていく
![最初のエラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513488/d78a44f7-427a-5f41-65cb-53bf63d9262d.png)

deeplで翻訳してくれた
> サーバに接続できませんでした: そのようなファイルまたはディレクトリはありません。サーバーはローカルで動作し、Unixドメインソケット「/tmp/.s.PGSQL.5432」での接続を受け入れているか？

### 問題を解く

1. サーバに接続できない
1. ファイル、ディレクトリがない
1. サーバがローカルで動作しているか、そのドメインは/tmp/.s.PGSQL.5432なのか

エンジニアとしては初心者なのでこの順序で解いていく

### １を解く
サーバに接続できない => サーバ起動しているか
サーバーの状態確認は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
```

こちらの記事
> [Homebrew Servicesを使ってサービスを管理する](https://rcmdnk.com/blog/2016/04/25/computer-mac-homebrew/)

で `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` としてもう一度ブラウザを確認
![スクリーンショット 2022-01-26 20.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513488/26b61772-51e5-86bb-73bf-d99b236e6976.png)

データベースがないことでエラーが起きているようです。
`rails db:create` と `rails db:migrate` を実行

railsサーバーにはエラーなく入ることは出来たのですが以前のテーブルデータがございません。大丈夫か？

### これが正しい答えなのでは？
さらに記事を引用します。
>[Homebrewでインストールしたpostgresqlが起動しないのを調べた](https://blog.n-z.jp/blog/2020-01-08-homebrew-postgresql.html)

というか以前も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 が便利](https://qiita.com/yasulab/items/237c3f9634055d665745)
こちらから、リネームでもよさそうなので一旦リネームして

再度`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
```
ログを省略しましたが、無事データ移行ができたようです。


リネームしたファイルは残っています。

```:/usr/local/var/
% ls
cache           log             postgres        postgres_re.old postgresql@13
homebrew        mysql           postgres.old    postgresql@12
```