MacにPostgreSQL10をインストールする2017



## 環境

- Macbook Pro(13-inch, 2016, Four Thunderbolt 3 Ports
- MacOS Sierra 10.12.6
- Homebrew 1.3.8

## 手順

### Homebrew でインストール

```bash
$ brew install postgresql
```

### データベースの初期化

※Linux系だと事前にpostgresユーザーを作成するが、Macの場合は後回し

- 「initdb」コマンドにてデータベースを初期化
    - 日本語を使用する前提のため、「-E utf8（デフォルトのエンコーディングをUTF-8に設定）」オプションを追加
    - 日本語を対象としたデータベースの場合はロケール設定は不要のため、「--no-locale」オプションを追加

```bash
$ initdb /usr/local/var/postgres -E utf8 --no-locale
The files belonging to this database system will be owned by user "username".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /usr/local/var/postgres ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /usr/local/var/postgres -l logfile start
```

### バージョンの確認

```bash
$ postgres --version
postgres (PostgreSQL) 10.1
```

### サーバーの起動

```bash
$ postgres -D /usr/local/var/postgres
2017-11-24 16:13:17.317 JST [28857] LOG:  listening on IPv6 address "::1", port 5432
2017-11-24 16:13:17.318 JST [28857] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2017-11-24 16:13:17.325 JST [28857] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2017-11-24 16:13:17.356 JST [28858] LOG:  database system was shut down at 2017-11-24 16:06:33 JST
2017-11-24 16:13:17.376 JST [28857] LOG:  database system is ready to accept connections

```

### ...ん？

上記サーバーの起動をしても、プロンプトは永遠に帰ってきてくれません。
なので、ctrl + c で終了させます。

### データベース一覧の取得

```bash
$ psql -l
psql: 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"?
```

### ...んん？？

はい出ましたこのエラー。すんなりいってくれません。
このエラーはググると大量に先駆者たちの対処法が出てきますが、自分に有効なのがなかなか見つからなかったりします。

自分は運良く[こちらの記事](https://make-from-scratch.com/error-connections-on-unix-domain-socket-tmp-s-pgsql-5432/)に助けられました。あざます！
どうしたかというと、[HomebrewのServicesというデータベースを手動で制御するソフト](https://rcmdnk.com/blog/2016/04/25/computer-mac-homebrew/)を追加します。

```bash
$ brew tap homebrew/services
Updating Homebrew...
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 0), reused 10 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
Tapped 0 formulae (43 files, 56.0KB)
```

そしてデータベースを起動し、改めて一覧の取得を試みてみます。

```bash
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)

$ psql -l
                                     List of databases
   Name    |    Owner     | Encoding | Collate | Ctype |         Access privileges         
-----------+--------------+----------+---------+-------+-----------------------------------
 postgres  | ko-kamenashi | UTF8     | C       | C     | 
 template0 | ko-kamenashi | UTF8     | C       | C     | =c/"ko-kamenashi"                +
           |              |          |         |       | "ko-kamenashi"=CTc/"ko-kamenashi"
 template1 | ko-kamenashi | UTF8     | C       | C     | =c/"ko-kamenashi"                +
           |              |          |         |       | "ko-kamenashi"=CTc/"ko-kamenashi"
(3 rows)
```

やったー！大成功＼(^o^)／

### データベースの置き場所を環境変数に設定

```vim:~/.bash_profile
# PostgreSQL設定（DBの置き場所）
export PGDATA=/usr/local/var/postgres
```

### ユーザーの作成と確認

環境変数$USER がスーパーユーザとして作成されており、そのまま使うのはあまりよろしくないとのこと。
なので新しくユーザを作成します。

事前にpostgreSQLのサービスが開始されている必要があるため、このタイミングでの実施となります。
ユーザ作成時にパスワードを付与するためには-Pオプションを使用します。

```bash
$ createuser -P postgres
Enter password for new role: 
Enter it again: 
```

ユーザーが作成されているか確認してみます。

```bash
z$ psql -U postgres
psql (10.1)
Type "help" for help.

postgres=> select * from pg_user
postgres-> ;
   usename    | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
--------------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 ko-kamenashi |       10 | t           | t        | t       | t            | ******** |          | 
 postgres     |    16384 | f           | f        | f       | f            | ******** |          | 
(2 rows)
```

### 作成したユーザーでデータベースの作成

```bash
# createdb データベース名 -O ユーザー名
$ createdb sampledb -O postgres
```

### psqlコマンドでデータベースに接続

```bash
# psql -U ユーザー名 データベース名
$ psql -U postgres sampledb
psql (10.1)
Type "help" for help.

sampledb=>
```

### PostgreSQLの自動起動設定

自動起動リストにPostgreSQLを追加し、その追加した設定ファイルを読み込む

```bash
$ cp /usr/local/Cellar/postgresql/10.1/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

## 以上！

ありがとうございました。

## その後の追記：エラー対処法

ある日突然あのエラーに再度遭遇する羽目に、、、

```bash
$ psql -U postgres
psql: 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"?
```

そんなときは[こちらの記事](https://stackoverflow.com/questions/13410686/postgres-could-not-connect-to-server)を参考に、以下を実行してあげると解決します。

```bash
$ rm /usr/local/var/postgres/postmaster.pid
$ psql -U postgres
psql (10.1)
Type "help" for help.

postgres=> 
```