CentOSにPostgreSQL9.5をインストールおよびテスト

利用するアプリケーションの都合でPostgreSQLが必要だったのでインストールしました．
バージョンが違うだけで，ほとんど以下の記事と同じです．
[CentOS 7にPostgreSQL最新版をインストール](http://www.hack-log.net/entry/2015/04/26/100000)


CentOSのバージョン

```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

# PostgreSQLのインストール
## PostgreSQLのインストール
PostgreSQLのRPMパッケージをダウンロード

```
$ wget yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm
```

ここからは管理者で実行，RPMパッケージをインストール

```
$ su
# rpm -ivh pgdg-centos95-9.5-2.noarch.rpm
```

yumでパッケージをインストール

```
# yum -y install postgresql95-server postgresql95-devel postgresql95-contrib
```

PostgreSQL初期化

```
# systemctl start postgresql-9.5
Job for postgresql-9.5.service failed because the control process exited with error code. See "systemctl status postgresql-9.5.service" and "journalctl -xe" for details.
```

エラーを吐くので指定通りに確認を行う．
すると，PostgreSQLのデータベースクラスタの作成を求められます．
initdbについてはこちらのページに書かれています．
[initdb](https://www.postgresql.jp/document/9.2/html/app-initdb.html)

```
# systemctl status postgresql-9.5.service
● postgresql-9.5.service - PostgreSQL 9.5 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-9.5.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 土 2016-01-09 15:42:19 JST; 24s ago
  Process: 14696 ExecStartPre=/usr/pgsql-9.5/bin/postgresql95-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)

 1月 09 15:42:19 local systemd[1]: Starting PostgreSQL 9.5 database server...
 1月 09 15:42:19 local systemd[1]: postgresql-9.5.service: control process exited, code=exited status=1
 1月 09 15:42:19 local systemd[1]: Failed to start PostgreSQL 9.5 database server.
 1月 09 15:42:19 local systemd[1]: Unit postgresql-9.5.service entered failed state.
 1月 09 15:42:19 local systemd[1]: postgresql-9.5.service failed.
# /usr/pgsql-9.5/bin/postgresql95-setup initdb
Initializing database ... OK
```

再度起動し，自動起動設定

```
# systemctl start postgresql-9.5
# systemctl enable postgresql-9.5
```

systemctlコマンドについては，こちらの記事に書かれています．
（最後まで読むにはログインが必要）
[Red Hat Enterprise Linux 7がやってきた](http://itpro.nikkeibp.co.jp/article/COLUMN/20140707/569450/)

接続確認

```
# su - postgres
最終ログイン: 2016/01/09 (土) 17:11:00 JST日時 pts/0
-bash-4.2$ psql
psql (9.5.0)
"help" でヘルプを表示します.

postgres-# \q
-bash-4.2$ exit
ログアウト
```


## 初期設定
PostgresSQLの設定ファイルを変更

### postgresql.conf
```
# vi /var/lib/pgsql/9.5/data/postgresql.conf
```

```/var/lib/pgsql/9.5/data/postgresql.conf
# 59行目
# listen_addresses = 'localhost' 

# 419行目
log_line_prefix = '<%m>'
```

以下のように変更
（viならetcを押した後に `:59` か `/listen_addresses` で飛びたい行に移れる）

```
# 他のホストからのアクセスを受け取る
listen_addresses = '*'

# ログの受け取り形式
# 420行目以降にログの出力形式の一覧がコメントアウトされて載っている
# 今回は　'日時　ユーザ　データベース'　の形式
log_line_prefix = '<%t %u %d>'
```

###  pg_hba.conf
```
# vi /var/lib/pgsql/9.5/data/pg_hba.conf
```

```/var/lib/pgsql/9.5/data/pg_hba.conf
# 80行目
# "local" is for Unix domain socket connections only
local   all             all                                     peer
```

以下のように変更

```
# DB名とユーザ名が一致しなくても認証できるようにする
# "local" is for Unix domain socket connections only
local   all             all                                     md5
```

システムを再起動

```
# systemctl restart postgresql-9.5
```

## ユーザ設定
スーパーユーザにパスワードを設定
（2017/01/11：この方法でパスワードが設定できなかった場合の対処を追記）

```
# su - postgres
最終ログイン: 2016/01/09 (土) 18:07:04 JST日時 pts/0
-bash-4.2$ psql
psql (9.5.0)
"help" でヘルプを表示します.

postgres=# \du
                                               ロール一覧
 ロール名 |                                       属性                                       | メンバー
----------+----------------------------------------------------------------------------------+----------
 postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション, Bypass RLS | {}

postgres=# \password postgres
新しいパスワード:
もう一度入力してください：
postgres=# \q
```

## postgresユーザのパスワード設定ができなかった場合
### 対処1

以下のコマンドでパスワードを設定

```
# passwd postgres
ユーザー postgres のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
```

ログインできるか確認

```
# psql -U postgres
ユーザ postgres のパスワード:
```



### 対処2
上記の方法でパスワードが変更できなかった場合は、一度パスワード認証をしなくても PostgreSQL が使える状態にしてから、SQLでパスワードを設定します。

```
# vi /var/lib/pgsql/9.5/data/pg_hba.conf
```

```/var/lib/pgsql/9.5/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     ident
```

システムを再起動

```
# systemctl restart postgresql-9.5
```

SQL でパスワードを変更

```
# su - postgres
最終ログイン: 2017/01/11 (水) 13:41:15 JST日時 pts/0
-bash-4.2$ psql
psql (9.5.5)
Type "help" for help.

postgres=# ALTER USER postgres PASSWORD 'new_password';
ALTER ROLE
postgres=# \q
-bash-4.2$ exit
logout
```

pg_hba.conf の設定をもとに戻す

```
# vi /var/lib/pgsql/9.5/data/pg_hba.conf
```

```/var/lib/pgsql/9.5/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     md5
```

システムを再起動

```
# systemctl restart postgresql-9.5
```

ログインできるか確認

```
# psql -U postgres
ユーザ postgres のパスワード:
```


# テーブル作成とアクセス権限付与のテスト
## テスト用のユーザを作成
piyoというユーザを作成

```
-bash-4.2$ createuser -P piyo
新しいロールのためのパスワード:
もう一度入力してください：
-bash-4.2$ psql
psql (9.5.0)
"help" でヘルプを表示します.

postgres=# \du
                                               ロール一覧
 ロール名 |                                       属性                                       | メンバー
----------+----------------------------------------------------------------------------------+----------
 postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション, Bypass RLS | {}
 piyo     |                                                                                  | {}

postgres=#\q
```


## DBとテーブルの作成

### DBの作成
DBの一覧を確認

```
-bash-4.2$ psql
psql (9.5.0)
"help" でヘルプを表示します.

postgres=# \dp
                            アクセス権
 スキーマ | 名前 | 型 | アクセス権 | Column privileges | Policies
----------+------+----+------------+-------------------+----------
(0 行)

```

バージョンを確認

```
postgres=# select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 9.5.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit
(1 行)

```

hogeというDBを作成

```
postgres=# create database hoge;
CREATE DATABASE
postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 hoge      | 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
(4 行)
```

### テーブルの作成
先ほど作ったDBのhogeに接続し，fugaというテーブルを作成

```
postgres=# \connect hoge
データベース "fuga" にユーザ"postgres"として接続しました。
hoge=# CREATE TABLE fuga
hoge-# (id int, nick_name character varying(5), full_name text);
CREATE TABLE
hoge=# \dt
          リレーションの一覧
 スキーマ |  名前 |    型    |  所有者
----------+------+----------+----------
 public   | fuga | テーブル | postgres
(1 行)

hoge=# \d fuga
 テーブル "public.fuga"
     列     |         型           | 修飾語
------------+----------------------+--------
 id         | integer              |
 nick_name  | character varying(5) |
 full_name  | text                 |

hoge=#\q
```

アクセス権限の付与

```
hoge=# GRANT SELECT, INSERT, UPDATE, DELETE ON fuga TO piyo;
GRANT                                                                               | {}

qgis=# \dp
                                                アクセス権
 スキーマ | 名前 |    型    |        アクセス権         | Column privileges | Policies
----------+-------------------------+----------+---------------------------+-------------------+----------
 public   | fuga | テーブル | postgres=arwdDxt/postgres+|                   |
          |      |          | piyo=arwd/postgres        |                   |
(1 行)
```

### 作成したユーザからアクセスしてSQLを実行
DBへアクセス

```
$ psql postgres piyo
ユーザ piyo のパスワード:
psql (9.5.0)
"help" でヘルプを表示します.

postgres=> \connect hoge
データベース "hoge" にユーザ"piyo"として接続しました。
```

SELECT命令

```
hoge=> select * from fuga;
 id | nick_name | full_name
----+-----------+-----------
(0 行)
```

INSERT命令

```
hoge=> INSERT INTO  fuga (id, nick_name, full_name) VALUES (1, 'NOBU', 'ODA NOBUNAGA');
INSERT 0 1
hoge=> select * from fuga;
 id | nick_name | full_name
----+-----------+--------------
  1 |      NOBU | ODA NOBUNAGA
(1 行)
```

UPDATE命令

```
hoge=> UPDATE fuga SET nick_name='NAGA';
UPDATE 1
hoge=> select * from fuga;
 id | nick_name | full_name
----+-----------+--------------
  1 |      NAGA | ODA NOBUNAGA
(1 行)
```

DELETE命令

```
hoge=> DELETE FROM fuga WHERE id=1;
DELETE 1
hoge=> select * from fuga;
 id | nick_name | full_name
----+-----------+-----------
(0 行)
```

#参考
[CentOS 7にPostgreSQL最新版をインストール](http://www.hack-log.net/entry/2015/04/26/100000)
[CentOS7.0（Vagrant）にPostgreSQL 9.4インストール](http://tigertaizo.hatenablog.com/entry/2015/02/11/155036)
[Red Hat Enterprise Linux 7がやってきた](http://itpro.nikkeibp.co.jp/article/COLUMN/20140707/569450/)
[PostgreSQLのユーザ管理](http://www.nslabs.jp/postgresql-user-management.rhtml)
[pg_hba.confファイル](https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html)
[initdb](https://www.postgresql.jp/document/9.2/html/app-initdb.html)
[ubuntu - Postgresql: password authentication failed for user "postgres" - Stack Overflow](http://stackoverflow.com/questions/7695962/postgresql-password-authentication-failed-for-user-postgres)