Mac+homebrew でPostgreSQL入門

#はじめに
この記事は備忘録として書いています。
悪い点は忌憚なくご指摘いただけると幸いです。

#環境

`Homebrew 2.1.15`
`psql (PostgreSQL) 11.5`

#PostgreSQLのインストールが完了した後


まず以下のコマンドでデータベースの一覧を確認してみる。
`$ psql -l`

```
k$ psql -l

                        List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | k     | UTF8     | C       | C     | 
 template0 | k     | UTF8     | C       | C     | =c/k             +
           |       |          |         |       | k=CTc/k
 template1 | k     | UTF8     | C       | C     | =c/k             +
           |       |          |         |       | k=CTc/k
(3 rows)
```
データベースはデフォルトでこのようになっている。


#PostgreSQLがデフォルトで参照するデータベースクラスタの設定

vimコマンドで~/.bash_profileというファイルへ
`$ vi ~/.bash_profile`
以下を追加する
`export PGDATA=/usr/local/var/postgres`

#データベースの作成

・**psqldb**というデータベースを**psqluser**というロール名で作成する
`$ createdb psqldb -O psqluser`

```
$ psql -l

  List of databases
   Name    |  Owner   | Encoding | Collate | Ctype | Access privileges 
-----------+----------+----------+---------+-------+-------------------
 psqldb    | psqluser | UTF8     | C       | C     | 
 postgres  | k        | UTF8     | C       | C     | 
 template0 | k        | UTF8     | C       | C     | =c/k             +
           |          |          |         |       | k=CTc/k
 template1 | k        | UTF8     | C       | C     | =c/k             +
           |          |          |         |       | k=CTc/k
(3 rows)
```

**psqldb**というデーターベースに**psqluser**というロールをオーナーとして入る
`$ psql -U psqluser psqldb`

```
// psqluser というロール名に postgres というパスワードを設定
psqldb=> alter role psqluser with password 'postgres';
ALTER ROLE

//ロール名の一覧を確認
paqldb=> \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 k         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 psqluser  |                                                            | {}
```
**paqluser**にはなんの権限もない状態なので権限を付与する

```
psqldb=> ALTER ROLE psqluser WITH CREATEDB;
ERROR:  permission denied
```
むむむ、エラーだ
一度**k**というユーザーとして**psqldb**に接続

```
$ psql -U k psqldb


psqldb=# ALTER ROLE psqluser WITH createdb;
ALTER ROLE
psqldb=# ALTER ROLE psqluser WITH createrole;
ALTER ROLE
psqldb=# ALTER ROLE psqluser WITH Superuser;
ALTER ROLE
psqldb=# \du
                                    List of roles
 Role name |                         Attributes                         | Member of  
-----------+------------------------------------------------------------+------------
 k         | Superuser, Create role, Create DB, Replication, Bypass RLS | {psqluser}
 psqluser  | Superuser, Create role, Create DB                          | {}
```
psqluser に無事権限を付与できた

#よくあるエラー
```
 k$ postgres -D /usr/local/var/postgres
2019-10-22 23:04:38.695 JST [14260] FATAL:  lock file "postmaster.pid" already exists
2019-10-22 23:04:38.695 JST [14260] HINT:  Is another postmaster (PID 13895) running in data directory "/usr/local/var/postgres"?
```
正しく停止させないとpid情報が残ってしまう
以下を実行
`rm /usr/local/var/postgres/postmaster.pid`

```
2019-10-22 23:04:57.924 JST [14265] LOG:  listening on IPv6 address "::1", port 5432
2019-10-22 23:04:57.924 JST [14265] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2019-10-22 23:04:57.926 JST [14265] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2019-10-22 23:04:57.950 JST [14266] LOG:  database system was interrupted; last known up at 2019-10-22 22:49:54 JST
2019-10-22 23:04:58.084 JST [14266] LOG:  database system was not properly shut down; automatic recovery in progress
2019-10-22 23:04:58.087 JST [14266] LOG:  redo starts at 0/167D3D0
2019-10-22 23:04:58.087 JST [14266] LOG:  invalid record length at 0/167D4B0: wanted 24, got 0
2019-10-22 23:04:58.087 JST [14266] LOG:  redo done at 0/167D478
2019-10-22 23:04:58.100 JST [14265] LOG:  database system is ready to accept connections
```
`$ postgres -D /usr/local/var/postgres`
もう一度実行
こんなログが出れば完了

#参考文献
https://qiita.com/yh2020/items/8be3087004d100fe752b
http://ponsuke-tarou.hatenablog.com/entry/2018/01/31/232012
https://codenote.net/mac/homebrew/3894.html
https://codenote.net/mac/homebrew/187.html
https://teratail.com/questions/112476
https://qiita.com/sibakenY/items/407b721ad1bd0975bd00
http://db-study.com/archives/121