CentOSにpostgresql-9.6をyum経由でインストールする方法

# 目的と背景

インストール手順が点在しているため、ひと塊になった手順書が欲しかった

# 本ドキュメントの対象

- CentOS 7.5 (systemd)
- Postgresql 9.6 (CentOS公式は9.2)

# インストール

## yum リポジトリを登録する

https://yum.postgresql.org/repopackages.php から適切なリポジトリを選択し、`yum install <選択したRPMのURL>`を行う

``` sh
$ sudo yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
(中略)
================================================================================
 Package           Arch       Version     Repository                       Size
================================================================================
Installing:
 pgdg-centos96     noarch     9.6-3       /pgdg-centos96-9.6-3.noarch     2.7 k

Transaction Summary
================================================================================
Install  1 Package

Total size: 2.7 k
Installed size: 2.7 k
Is this ok [y/d/N]: y
(中略)
Installed:
  pgdg-centos96.noarch 0:9.6-3                                                  

Complete!
```


## 対象のパッケージをインストール

``` sh
$ sudo yum install postgresql96-server
(中略)
================================================================================
 Package                  Arch        Version                 Repository   Size
================================================================================
Installing:
 postgresql96-server      x86_64      9.6.9-1PGDG.rhel7       pgdg96      4.3 M
Installing for dependencies:
 postgresql96             x86_64      9.6.9-1PGDG.rhel7       pgdg96      1.4 M
 postgresql96-libs        x86_64      9.6.9-1PGDG.rhel7       pgdg96      315 k

Transaction Summary
================================================================================
Install  1 Package (+2 Dependent packages)

Total download size: 6.0 M
Installed size: 26 M
Is this ok [y/d/N]: y
(中略)
Installed:
  postgresql96-server.x86_64 0:9.6.9-1PGDG.rhel7                                

Dependency Installed:
  postgresql96.x86_64 0:9.6.9-1PGDG.rhel7                                       
  postgresql96-libs.x86_64 0:9.6.9-1PGDG.rhel7                                  

Complete!
```

# 初期設定を行う

## dbの初期化を行う
``` sh
$ sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK
```

## ポートを開放する(optional)

postgresqlのポートへ外部からアクセスさせたい場合、この手順を実施してください。

### Listenアドレスの設定

すべてのIPアドレスに対しての受信を行うようにします。

``` sh
$ sudo vi /var/lib/pgsql/9.6/data/postgresql.conf
```

上記のように設定ファイルを開いて、```listen_addresses = '*'```を追記してください。

``` patch
 # - Connection Settings -
 
+listen_addresses = '*'
 #listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                         # comma-separated list of addresses;
                                         # defaults to 'localhost'; use '*' for all
                                         # (change requires restart)
 #port = 5432                            # (change requires restart)
```

### 受信許可アドレスの設定

``` sh
$ sudo vi /var/lib/pgsql/9.6/data/pg_hba.conf
```

以下のように、すべてのIPアドレス(v4)からの接続を許容します。

``` patch
 # IPv4 local connections:
-host    all             all             127.0.0.1/32            ident
+#host    all             all             127.0.0.1/32            ident
+host    all             all             0.0.0.0/0               md5
 # IPv6 local connections:
```


## firewallのポートを開ける

postgresqlのポート設定がデフォルトの場合は以下のコマンドでポートを開ける。

``` sh
$ sudo firewall-cmd --add-service=postgresql --zone=public --permanent
success
$ sudo firewall-cmd --reload
success
```


# サービス起動

## systemdへ登録を行う

準備が完了したのでとりあえず、postgresqlを有効な状態にする。

~~~
$ sudo systemctl daemon-reload
$ sudo systemctl enable postgresql-9.6.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-9.6.service to /usr/lib/systemd/system/postgresql-9.6.service.
~~~

## サービスを開始する

``` sh
$ sudo systemctl start postgresql-9.6
[da@centos2 ~]$ sudo systemctl status postgresql-9.6
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-9.6.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-07-17 12:35:35 EDT; 5s ago
(中略)
Jul 17 12:35:35 centos2 systemd[1]: Started PostgreSQL 9.6 database server.
Hint: Some lines were ellipsized, use -l to show in full
```

# ログイン

## ログイン設定を行う

postgresユーザーでpsqlからアクセスし、DBの作成及び、アクセス権の設定を行う。

``` sh
$ sudo -u postgres /usr/pgsql-9.6/bin/psql -U postgres
psql (9.6.9)
Type "help" for help.
```
``` sql
postgres=# --ユーザー作成(注意:testというパスワードのため、そのまま使用しないこと)
postgres=# CREATE ROLE test WITH LOGIN PASSWORD 'test';
CREATE ROLE
postgres=# --DBの作成
postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# --DBの所有権を移転
postgres=# ALTER DATABASE test OWNER TO test;
ALTER DATABASE
postgres=# --作業完了
postgres=# \q
```

## ログイン確認を行う（ローカルサーバー上）

``` sh
# 以下の192.168.1.2はサーバーのIPアドレスを指定すること
$ /usr/pgsql-9.6/bin/psql -h 192.168.1.2 -U test
Password for user test: 
psql (9.6.9)
Type "help" for help.
```
``` sql
test=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test      | test     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(4 rows)
```

# トラブルシューティング

## サービスが起動しない

指示の通り、```journalctl -xe```を実行してみてください。
``` "/var/lib/pgsql/9.6/data/" is missing or empty.```と言われた場合は、「dbの初期化を行う」を参照してください。


# 参考文献

- [yumでPostgreSQLをインストールしてみよう](https://lets.postgresql.jp/documents/tutorial/yum/yum)
- [PostgreSQLでユーザー（ロール）を追加してテーブルにアクセスする](https://qiita.com/wb773/items/248e6e083b2fe12e820a)
- [CentOS7でポートを開放する方法](http://senoway.hatenablog.com/entry/2015/02/11/142139)
- yum　でインストールされるドキュメント: /usr/share/doc/postgresql96-9.6.9/README.rpm-dist