Cent OS 8にPostgreSQL12.xの最新版をソースからインストール

#はじめに
CentOS-8.1.1911-x86_64を「最低限のインストール」でインストールした環境にPostgreSQL12.xの最新版をソースからインストールします。

#OS全体のupdate
```Bash:
dnf -y update
```

#必要なソフトのインストール
```Bash:
dnf -y install gcc gcc-c++ make wget tar zlib-devel readline-devel
```

#PostgreSQLのインストール
root権限で行って下さい。

##ユーザー作成
PostgreSQL のコンパイルや実行に使用するユーザ postgres を作成します。

```Bash:
useradd postgres
passwd postgres
```

##ソースコードのダウンロード
```Bash:
cd /usr/local/src/
wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz
```

##展開

```Bash:
tar xzf postgresql-12.2.tar.gz
```

##オーナーを変える

```Bash:
chown -R postgres /usr/local/src/postgresql-12.2
```

#インストール先ディレクトリを作成(オーナーも行う)

```Bash:
mkdir /usr/local/pgsql12.2
chown postgres /usr/local/pgsql12.2
```

##シンボリックリンク作成

```Bash:
ln -s /usr/local/pgsql12.2 /usr/local/pgsql
```

解除方法はこちら

```Bash:
unlink /usr/local/pgsql
```
##スイッチユーザーしてディレクトリを移動

```Bash:
su - postgres
cd /usr/local/src/postgresql-12.2
```

##Makefile生成
インストール先を指定しています。

```Bash:
./configure --prefix=/usr/local/pgsql
```

##コンパイル＆インストール

```Bash:
make
make install
```

##環境変数の設定

```Bash:
vi ~/.bash_profile
```

以下の内容を最下部に書いて保存します。

```:.bash_profile
export PATH="$PATH":/usr/local/pgsql/bin 
export POSTGRES_HOME=/usr/local/pgsql 
export PGLIB=$POSTGRES_HOME/lib 
export PGDATA=$POSTGRES_HOME/data 
export MANPATH="$MANPATH":$POSTGRES_HOME/man 
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
```

##環境変数の反映

```Bash:
. ~/.bash_profile
```

##DBを初期化する

```Bash:
initdb --no-locale
```

##設定ファイルの編集
###postgresql.conf

```Bash:
vi /usr/local/pgsql/data/postgresql.conf
```

```
リモートアクセス可能にする。
#listen_addresses = 'localhost'
↓
listen_addresses = '*'

明示的にポートを指定する。
#port = 5432
↓
port = 5432

ログを有効にする。
#logging_collector = off
↓
logging_collector = on

ログのファイル名を変更する。
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
↓
log_filename = 'postgresql-%d.log'

#log_line_prefix = ''
↓
log_line_prefix = '%t [%p] '
```

###pg_hba.conf

```Bash:
vi /usr/local/pgsql/data/pg_hba.conf
```
listen_addressesの範囲を指定します。
下記は1例です。ご自分の環境に合わせて下さい。

```
host    all             all             127.0.0.1/32            trust
↓
host    all             all             192.168.1.0/24          trust
```

##起動

```Bash:
pg_ctl start -w
```

##DBの管理ユーザ作成

```Bash:
createuser -s -d -r -P pgsa
```

##作成したユーザの確認

```Bash:
psql -U postgres
\du
```

```:実行例
[postgres@localhost postgresql-12.2]$ psql -U postgres
psql (12.2)
Type "help" for help.

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 pgsa      | Superuser, Create role, Create DB                          | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```
\qで終了

#ファイヤーウォールの設定
root権限で設定して下さい。

```Bash:
su -
```
```Bash:
firewall-cmd --add-service=postgresql --zone=public --permanent
systemctl restart firewalld
```

#SELinuxの設定

```Bash:
setsebool -P postgresql_can_rsync on
setsebool -P postgresql_selinux_transmit_client_label on
setsebool -P selinuxuser_postgresql_connect_enabled on
```

確認

```Bash:
getsebool -a | grep postgresql
```

```Bash:出力例
postgresql_can_rsync --> on
postgresql_selinux_transmit_client_label --> on
postgresql_selinux_unconfined_dbadm --> on
postgresql_selinux_users_ddl --> on
selinuxuser_postgresql_connect_enabled --> on
```

#自動起動設定
サービス定義ファイルを作成します。

```Bash:
vi /usr/lib/systemd/system/postgresql.service
```
```:postgresql.service
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades.  If you want to customize, the
# best way is to create a file "/etc/systemd/system/postgresql.service",
# containing
#   .include /lib/systemd/system/postgresql.service
#   ...make your changes here...
# For more info about custom unit files, see
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F

# For example, if you want to change the server's port number to 5433,
# create a file named "/etc/systemd/system/postgresql.service" containing:
#   .include /lib/systemd/system/postgresql.service
#   [Service]
#   Environment=PGPORT=5433
# This will override the setting appearing below.

# Note: changing PGPORT or PGDATA will typically require adjusting SELinux
# configuration as well; see /usr/share/doc/postgresql-*/README.rpm-dist.

# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-setup.

# Note: in F-17 and beyond, /usr/lib/... is recommended in the .include line
# though /lib/... will still work.

[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

# Port number for server to listen on
Environment=PGPORT=5432

# Location of database directory
Environment=PGDATA=/usr/local/pgsql/data

# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog

# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000

#ExecStartPre=/usr/local/pgsql/bin/postgresql-check-db-dir ${PGDATA} <=このモジュールは存在しないのでコメント
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

[Install]
WantedBy=multi-user.target
```

##自動起動実行

```Bash:
systemctl daemon-reload
systemctl enable postgresql
```

#動作確認

```Bash:
systemctl status postgresql
```

```:実行例
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2020-05-09 07:45:17 EDT; 28s ago
  Process: 1103 ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, sta>
 Main PID: 1144 (postgres)
    Tasks: 8 (limit: 23922)
   Memory: 19.9M
   CGroup: /system.slice/postgresql.service
           ├─1144 /usr/local/pgsql12.2/bin/postgres -D /usr/local/pgsql/data -p 5432
           ├─1422 postgres: logger
           ├─1483 postgres: checkpointer
           ├─1484 postgres: background writer
           ├─1485 postgres: walwriter
           ├─1486 postgres: autovacuum launcher
           ├─1487 postgres: stats collector
           └─1488 postgres: logical replication launcher
```

#参考/出展

https://qiita.com/shadowhat/items/0225dfc4347aa6d260f3