connections on Unix domain socket "/tmp/.s.PGSQL.5432"? を解決する
PostgreSQLをMacで使おうとした時に以下のエラーが出た時の対処法
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 行)
参考
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は全てのケーパビリティを持っている状態、つまりなんできる状態です。
ファイルアクセスのケーパビリティ 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 … 技術評論社