環境
- Vagrant 2.2.2
- Ubuntu 18.04.3 LTS (Bionic Beaver)
- PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)
- Mac OS X 10.14.6
問題
vagrantにログインし、該当ディレクトリへ移動。 次のコマンドを叩く。
- ユーザー: postgres
- dbname: memo_app
- 実行ファイル名: memos.sql
psql -U postgres -d memo_app -f memos.sql
次のエラーが返る。
psql: FATAL: Peer authentication failed for user "postgres"
なんじゃこりゃ。 調べてみると、次のことがわかった。
- postgreSQLはhbaという機能が動いている
- host base authentication
- postgreSQLはデフォルトでpeer認証がオンになっている
- peer認証では、postgreSQLのユーザー名と、Unix(ここではUbuntu)側のユーザー名が一致していないとエラーになって実行できない
- つまり、peer認証を使わない設定にすればいい
解決
postgreSQLの認証設定を変更することで解決した。
前準備
vagrantにログインし、postgresユーザーとして、sudo権限でログインする。 ※初期設定で出来るようになっているはず。
sudo su - postgres
PostgreSQLのフロントエンドを起動。
psql
postgresユーザーのパスワードを変更。
alter role postgres with password 'パスワード';
※自分なりのパスワードで。
これが出たら成功。
ALTER ROLE
peer認証を変更する
- 使用:PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)
以下のファイルを見てみる。
sudo cat /etc/postgresql/10/main/pg_hba.conf
※私はPostgreSQL10を使用しているため上記のファイルパスになっているが、もしPostgreSQL9.6を使用しているなら、次のようなパスになる。
/etc/postgresql/9.6/main/pg_hba.conf
するとこんなのが表示される。
# DO NOT DISABLE! # If you change this first entry you will need to make sure that the # database superuser can access the database using some other method. # Noninteractive access to all databases is required during automatic # maintenance (custom daily cronjobs, replication, and similar tasks). # # Database administrative login by Unix domain socket local all postgres peer # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 md5 host replication all ::1/128 md5
開いていたファイルを閉じて、sudo権限で編集する。vimを使用。
sudo vim /etc/postgresql/10/main/pg_hba.conf
2箇所を変更
変更箇所は2つ。
# Database administrative login by Unix domain socket local all postgres peer
これを次のように変更。
# Database administrative login by Unix domain socket # local all postgres peer local all postgres md5
※もともとあったpeer認証の部分をコメントアウトし、md5という認証に変更している。
同様に、以下の箇所を見つけて。
# "local" is for Unix domain socket connections only local all all peer
このように変更する。
# "local" is for Unix domain socket connections only # local all all peer local all all md5
変更前と変更後でスペースに違いがあるが気にしなくていい。 もちろん、気になるならもともとの設定みたいにスペースを合わせてもいい。
postgreSQLを再起動
restartする。
sudo service postgresql restart
最初にやりたかったコマンドを叩く。
psql -U postgres -d memo_app -f memos.sql
エラーは返らず、成功する。
postgreSQLログイン後にSQLファイルを実行する方法
psql
でログインすると、以下のコマンドでヘルプが見れる。
\?
するとこれが見つかる。
\i FILE execute commands from file
参照
- peer認証の関係でpsqlログインできない時の対処法 - Qiita
- ubuntu - Postgresql: password authentication failed for user "postgres" - Stack Overflow
- RailsでPostgresを使おうとしてはまった|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- ファイルから SQL を読み込む (MySQL, PostgreSQL, SQLite3) - CUBE SUGAR CONTAINER
- PostgreSQLでコマンドラインからSQLファイルを実行する - ジムには乗りたい
- psqlがPeer authentication failedというエラーで起動できない - QA@IT
- psql: FATAL: Peer authentication failed for user **** というPostgresSQLのエラーへの対応 | command-f
- PostgreSQL備忘録 - Qiita