CentOS-Linux-7にPostgreSQL 11をインストールしてみた

- 関連記事
    - [CentOS-Linux-7にPostgreSQL 10をインストールしてみた](/items/9204027e4c356830f91d)

#環境
```shell-session
# cat /etc/redhat-release; arch; locale | head -n1; users
CentOS Linux release 7.6.1810 (Core) 
x86_64
LANG=ja_JP.utf8
root root
```
#段取り
`root`ユーザアカウントで**[インストール](#インストール)**を行い、それによって自動生成される`postgres`ユーザアカウントで**[設定と動作テスト](#設定と動作テスト)**を行う。

- [18.1. The PostgreSQL User Account](https://www.postgresql.org/docs/11/postgres-user.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/postgres-user.html): JPUG

#インストール
##インストール済みのPostgreSQLがあれば削除
```shell-session
# yum list installed | grep postgres
# yum remove postgresql postgresql-libs postgresql-server
# userdel -r postgres
```
##`yum`リポジトリ設定をインストール
```shell-session
# rpm -ivh https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
```
- [PostgreSQL RPM Repository (with Yum)](https://yum.postgresql.org/repopackages.php)（英語）

##PostgreSQL11をインストール
```shell-session
# yum install postgresql11 postgresql11-libs postgresql11-server
...
完了しました!
# psql --version
psql (PostgreSQL) 11.1
```
- [psql](https://www.postgresql.org/docs/11/app-psql.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/app-psql.html): JPUG

#設定と動作テスト
##データベースサーバ自動起動設定
```shell-session
# systemctl enable postgresql-11.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.
# systemctl list-unit-files -t service | grep postgres
postgresql-11.service                         enabled
```
##`postgres`ユーザアカウントが登録済みか確認
```shell-session
# cut -d: -f1 /etc/passwd | grep postgres
postgres
```
##`postgres`ユーザアカウントにログイン
```shell-session
# su - postgres
```
##環境変数
```shell-session
$ vim -c 'start|:set number|:2' ~/.bash_profile
```
```diff:~/.bash_profile
- PGDATA=/var/lib/pgsql/11/data
+ PGCLUSTER=11/data
+ PGHOME=/usr/pgsql-${PGCLUSTER%%\/*}
+ export PATH=$PGHOME/bin:$PATH
+ export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
+ export MANPATH=$PGHOME/share/man:$MANPATH
+ PGDATA=/var/lib/pgsql/$PGCLUSTER
```
`-`（2行目）を`+`に置き換え、[ESC]キー→`:wq`で保存・終了。

- [16.5. Post-Installation Setup](https://www.postgresql.org/docs/11/install-post.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/install-post.html): JPUG

##設定を反映
```shell-session
$ . ~/.bash_profile
$ printenv PGDATA
/var/lib/pgsql/11/data
```
##データベースクラスタを初期化
```shell-session
$ initdb --no-locale -D "$PGDATA"
```
- `--no-locale`オプション: ロケールを使用しない（推奨）
- [18.2. Creating a Database Cluster](https://www.postgresql.org/docs/11/creating-cluster.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/creating-cluster.html): JPUG
    - [initdb](https://www.postgresql.org/docs/11/app-initdb.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/app-initdb.html): JPUG

##データベースサーバを起動し、現行のデータベースクラスタを確認
```shell-session
$ pg_ctl start
...
サーバ起動完了
$ psql -l
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |     アクセス権限      
-----------+----------+------------------+----------+-------------------+-----------------------
 postgres  | postgres | SQL_ASCII        | C        | C                 | 
 template0 | postgres | SQL_ASCII        | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII        | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(3 行)

$ ls "$PGDATA"
PG_VERSION        pg_commit_ts   pg_multixact  pg_stat      pg_wal                postmaster.pid
base              pg_dynshmem    pg_notify     pg_stat_tmp  pg_xact
current_logfiles  pg_hba.conf    pg_replslot   pg_subtrans  postgresql.auto.conf
global            pg_ident.conf  pg_serial     pg_tblspc    postgresql.conf
log               pg_logical     pg_snapshots  pg_twophase  postmaster.opts
```
- [18.3. Starting the Database Server](https://www.postgresql.org/docs/11/server-start.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/server-start.html): JPUG
    - [pg_ctl](https://www.postgresql.org/docs/11/app-pg-ctl.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/app-pg-ctl.html): JPUG
- [22.3. Template Databases](https://www.postgresql.org/docs/11/manage-ag-templatedbs.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/manage-ag-templatedbs.html): JPUG
- [68.1. Database File Layout](https://www.postgresql.org/docs/11/storage-file-layout.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/storage-file-layout.html): JPUG

##Hello, World! 印字テスト
###スクリプトなし
```shell-session
$ psql -t -A -c "SELECT 'Hello, World! '"
Hello, World!
```
###スクリプトあり
```shell-session
$ vim -c 'start|:set number' ~/hello.sql
```
```sql:~/hello.sql
-- -*- mode: sql; sql-product: postgres; -*-
SELECT 'Hello, World!';
```
上記の通り入力し、[ESC]キー→`:wq`で保存・終了。
####パターン1
```shell-session
$ psql -t -A < ~/hello.sql
Hello, World!
```
####パターン2
```shell-session
$ psql -t -A -f ~/hello.sql
Hello, World!
```
- [Chapter 2. The SQL Language](https://www.postgresql.org/docs/11/tutorial-sql.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/tutorial-sql.html): JPUG
    - [SELECT](https://www.postgresql.org/docs/11/sql-select.html): ポスグレ本家（英語）｜[旧版の和訳](https://www.postgresql.jp/document/10/html/sql-select.html): JPUG

##ログアウト
```shell-session
$ logout
```
#参考
- [PostgreSQL 本家](https://www.postgresql.org/)（英語）
    - [PostgreSQL 11.1 Documentation](https://www.postgresql.org/docs/11/): ポスグレ本家（英語）
- [日本PostgreSQLユーザ会（JPUG）](https://www.postgresql.jp/)
    - [PostgreSQL 10.5文書](https://www.postgresql.jp/document/10/html/): JPUG