connections on Unix domain socket "/tmp/.s.PGSQL.5432"? を解決する

PostgreSQLMacで使おうとした時に以下のエラーが出た時の対処法

psqlコマンドを打つと以下のようなエラーが出ました。

$ psql -l
psql: error: could not connect to server: 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"?

ググったところ、servicesを使ってPostgreSQLを再起動すると解決できる記事を見つけ、再起動を試して見ましたが、変わらず同じエラーが出ています。

ログにヒントがないか確認したところ、データベースのファイルがサーバーと互換性がないと書かれていました。

$ postgres -D /usr/local/var/postgres/
2020-06-02 11:26:49.560 JST [33160] FATAL:  database files are incompatible with server

以下のコマンドでアップグレードしたところ動くようになりました。

$ brew postgresql-upgrade-database
$ psql -l
                                          データベース一覧
   名前    |  所有者   | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限      
-----------+-----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |           |                  |             |                   | postgres=CTc/postgres
 template1 | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |           |                  |             |                   | postgres=CTc/postgres
 家計簿    | user1 l | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
(4 行)

参考

make-from-scratch.com

PostgreSQL DB のアップグレードは brew postgresql-upgrade-database が便利 - Qiita

実行権限のないファイルをrootユーザーでも実行できない理由

試した環境

以下のような権限が何もないシェルスクリプトを作成して、rootで実行してみた所、このような結果になりました。

# hoge.shの中身
echo 'hogeeeeee!!'
root@test~# ls -l 
---------- 1 root root 15 4月 12 00:07 hoge.sh

root@test~# ./hoge.sh
-bash: ./hoge.sh: 許可がありません

rootユーザーってなんでもできる最強のユーザーじゃなかったのかよ?と思いながら挙動について調べてみました。

以下の記事の一番目の回答を訳しつつ、できるだけわかりやすく単語の説明などを加えてまとめました。 unix.stackexchange.com

rootユーザーがなんでもできるとは?ケーパビリティについて

rootユーザってなんでもできるイメージがありました。 そのなんでもできるって具体的にどういった状態なのでしょうか。 Linuxにはrootが持っている絶対的な権限を細かく分け,必要な権限だけを与える仕組みが存在します。 その仕組みをケーパビリティと呼びます。rootは全てのケーパビリティを持っている状態、つまりなんできる状態です。

Man page of CAPABILITIES

ファイルアクセスのケーパビリティ CAP_DAC_OVERRIDE

今回の状況に関係するケーパビリティは CAP_DAC_OVERRIDEです。 CAP_DAC_OVERRIDEはファイルの読みこみ、書き込み、実行の権限チェックをバイパスするケーパビリティです。 ちなみにバイパスとは迂回という意味で、上記の場合だとファイルへのアクセス(読み込み、書き込み、実行)の権限チェックを回避するという意味になります。 権限チェックを回避することでファイルへのアクセスの権限が上書きされ、なんでもできる状態になるのですが、例外もあります。 実行権限のないファイルを実行する際は例外です。このことはファイルに対するアクセスをチェックするgeneric_permission (fs/namei.c)のコメントに書かれています。

読み書きのDAC(訳注:DAC = "discretionary access control"の略で、任意アクセス制御と呼ばれる)は常に上書き可能です。実行のDACは少なくとも1つの実行ビットがセットされているときに上書き可能です。

つまりls -l した時にxが一文字もない場合、rootユーザーであったとしても実行できないのです。 これは通常実行しないような、テキストファイル、画像などを誤って実行しエラーを出さないための仕様だと考えられます。

まとめ

rootユーザーでも実行権限のないファイルは実行できないので、適切な権限を付けて実行しましょう!

ケーパビリティの単語の説明で使わせていただきました。 第42回 Linuxカーネルのケーパビリティ[1]:LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術|gihyo.jp … 技術評論社