行き当たりばったり学習 ～PostgreSQL構築編(RHEL8)～

皆さんこんにちは！

医療業界から IT にチャレンジして2年目のharuです。

1年目は Oracle Database に関する業務を行っていたため、
恥ずかしながら PostgreSQL は触れたことありませんでした。
という訳で、今回は PostgreSQL の学習環境構築フローを共有します。

インストールするサーバーの OS は RHEL8 です。
ちなみに RHEL のバージョンを確認するには、cat コマンドか uname -a で
確認することができます。

[参考]
▼Linuxのバージョンの確認方法
  https://qiita.com/bezeklik/items/5edb638becd8858abb80

```
[root@postgreSQL ~]# cat /proc/version
Linux version 4.18.0-372.9.1.el8.x86_64 (****) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)) #1 SMP Fri Apr 15 22:12:19 EDT 2022
[root@postgreSQL ~]# uname -a
Linux postgreSQL 4.18.0-372.9.1.el8.x86_64 #1 SMP Fri Apr 15 22:12:19 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
```

### 事前準備

構築の前に PostgreSQL についてものすごく簡単に学習します。

**ざっくり概要**
    すべてのソースが公開されているオープンソースのデータベースであり、
    独自の機能の追加や改良を行っても公開義務は生じません。
    そのため、近年ではコスト削減を目的に数多くのシステム開発に用いられています。
    現在、世界シェア4位です。

**ざっくり歴史**
    1986年:  Ingresの後継としてカリフォルニア大学バークレー校で
                  マイケル・ストーンブレイクが中心となり POSTGRES が開発される。
    1995年: カリフォルニア大学での開発が終了した後、アンドリュー・ユーと
                  ジョリー・チェンによって改良が行われ SQL が使用可能になり、
                  Postgres95 という名称で公開された。
    1996年:  Postgres95という名称からPostgreSQLに名称を変更。 
 
**ざっくりサポート**
    ユーザーコミュニティ主体のサポートのため、他のRDBMSと比べると
    障害発生時の開発元対応が期待できない。
    しかしながら、商用のサポートを提供している企業もあるため、
    そちらを使用することも可能。
 
**ざっくり価格**
    無償
 
**ざっくりプラットフォーム**
    幅広い
 
**ざっくり機能特徴**
    MySQLとは異なり、複雑で大量なデータ操作や管理を得意としている。
    テーブルとカラムの情報を扱う以外に、データ型やインデックス型、関数の定義ができ、
    複数処理の同時実行性に優れている。
    また、MySQLと比べて膨大なデータのソートを得意としており、
    PostgreSQLの方がよりソートのアルゴリズムが優れている。

[参考]
▼Wikipedia
  https://ja.wikipedia.org/wiki/PostgreSQL

▼DB-Engines Ranking - Trend Popularity
  https://db-engines.com/en/ranking_trend

それでは構築に参ります。

### 1.PostgreSQL パッケージをダウンロード

PostgreSQL パッケージを web サイトからダウンロードします。

[参考]
▼本PostgreSQLユーザ会
  https://www.postgresql.jp/download


```
[root@postgreSQL tmp]# ll
合計 36
・・・
-rw-r--r--. 1 root     root     13168 10月 14 03:04 pgdg-redhat-repo-latest.noarch.rpm
・・・
```

### 2.rpmコマンドでパッケージをインストール

次にダウンロードしたパッケージを rpm コマンドを使用してインストールします。

```
[root@postgreSQL tmp]# rpm -ivh pgdg-redhat-repo-latest.noarch.rpm
警告: pgdg-redhat-repo-latest.noarch.rpm: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 442df0f8: NOKEY
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
        パッケージ pgdg-redhat-repo-42.0-27.noarch は既にインストールされています。

-pgdg～ ファイルが /etc/yum.repo.d/ 配下にインストールされたか確認
[root@postgreSQL etc]# cd yum.repos.d
[root@postgreSQL yum.repos.d]# ll
合計 16
-rw-r--r--. 1 root root 11419  9月 29 10:22 pgdg-redhat-all.repo
-rw-r--r--. 1 root root   358 10月 14 02:31 redhat.repo

[root@postgreSQL yum.repos.d]# pwd
/etc/yum.repos.d
```

### 3.インストールするPostgreSQLを検索

インストールするパッケージ名を調べます。

```
[root@postgreSQL yum.repos.d]# yum search postgresql
サブスクリプション管理リポジトリーを更新しています。
コンシューマー識別子を読み込めません

このシステムは、エンタイトルメントサーバーに登録されていません。subscription-manager で登録できます。

メタデータの期限切れの最終確認: 0:24:39 時間前の 2022年10月14日 03時14分03秒 に実施しました。
====================================== 名前 & 概要 一致: postgresql ======================================
postgresql-unit10.x86_64 : SI Units for PostgreSQL
postgresql-unit11.x86_64 : SI Units for PostgreSQL
postgresql-unit12.x86_64 : SI Units for PostgreSQL
postgresql-unit13.x86_64 : SI Units for PostgreSQL
・
・
・
postgresql15-pltcl.x86_64 : The Tcl procedural language for PostgreSQL
postgresql15-server.x86_64 : The programs needed to create and run a PostgreSQL server /*今回はこれをインストールします。*/
postgresql15-tcl.x86_64 : A Tcl client library for PostgreSQL
postgresql15-test.x86_64 : The test suite distributed with PostgreSQL
```

### 4.postgresql15-server.x86_64 をインストール

3 で見つけた postgresql15-server.x86_64 を yum を使ってインストールしていきます。

```
[root@postgreSQL yum.repos.d]# yum install postgresql15-server.x86_64
サブスクリプション管理リポジトリーを更新しています。
コンシューマー識別子を読み込めません

このシステムは、エンタイトルメントサーバーに登録されていません。subscription-manager で登録できます。

PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                        111  B/s | 195  B     00:01
PostgreSQL 15 for RHEL / Rocky 8 - x86_64                                  94  B/s | 195  B     00:02
PostgreSQL 14 for RHEL / Rocky 8 - x86_64                                  87  B/s | 195  B     00:02
PostgreSQL 13 for RHEL / Rocky 8 - x86_64                                  89  B/s | 195  B     00:02
PostgreSQL 12 for RHEL / Rocky 8 - x86_64                                 112  B/s | 195  B     00:01
PostgreSQL 11 for RHEL / Rocky 8 - x86_64                                  89  B/s | 195  B     00:02
PostgreSQL 10 for RHEL / Rocky 8 - x86_64                                  84  B/s | 195  B     00:02
依存関係が解決しました。
==========================================================================================================
 パッケージ                      アーキテクチャー   バージョン                   リポジトリー       サイズ
==========================================================================================================
インストール:
 postgresql15-server             x86_64             15.0-1PGDG.rhel8             pgdg15             5.8 M
依存関係のインストール:
 postgresql15                    x86_64             15.0-1PGDG.rhel8             pgdg15             1.6 M
 postgresql15-libs               x86_64             15.0-1PGDG.rhel8             pgdg15             287 k

トランザクションの概要
==========================================================================================================
インストール  3 パッケージ

ダウンロードサイズの合計: 7.7 M
インストール後のサイズ: 32 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/3): postgresql15-libs-15.0-1PGDG.rhel8.x86_64.rpm                      139 kB/s | 287 kB     00:02
(2/3): postgresql15-15.0-1PGDG.rhel8.x86_64.rpm                           628 kB/s | 1.6 MB     00:02
(3/3): postgresql15-server-15.0-1PGDG.rhel8.x86_64.rpm                    1.5 MB/s | 5.8 MB     00:03
----------------------------------------------------------------------------------------------------------
合計                                                                      2.0 MB/s | 7.7 MB     00:03
PostgreSQL 15 for RHEL / Rocky 8 - x86_64                                 1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
これでよろしいですか? [y/N]: y
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                  1/1
  インストール中   : postgresql15-libs-15.0-1PGDG.rhel8.x86_64                                        1/3
  scriptletの実行中: postgresql15-libs-15.0-1PGDG.rhel8.x86_64                                        1/3
  インストール中   : postgresql15-15.0-1PGDG.rhel8.x86_64                                             2/3
  scriptletの実行中: postgresql15-15.0-1PGDG.rhel8.x86_64                                             2/3
  scriptletの実行中: postgresql15-server-15.0-1PGDG.rhel8.x86_64                                      3/3
  インストール中   : postgresql15-server-15.0-1PGDG.rhel8.x86_64                                      3/3
  scriptletの実行中: postgresql15-server-15.0-1PGDG.rhel8.x86_64                                      3/3
  検証             : postgresql15-15.0-1PGDG.rhel8.x86_64                                             1/3
  検証             : postgresql15-libs-15.0-1PGDG.rhel8.x86_64                                        2/3
  検証             : postgresql15-server-15.0-1PGDG.rhel8.x86_64                                      3/3
インストール済みの製品が更新されています。

インストール済み:
  postgresql15-15.0-1PGDG.rhel8.x86_64                 postgresql15-libs-15.0-1PGDG.rhel8.x86_64
  postgresql15-server-15.0-1PGDG.rhel8.x86_64

完了しました!
```

念のため確認します。

```
[root@postgreSQL yum.repos.d]# rpm -qa | grep postgres
postgresql15-server-15.0-1PGDG.rhel8.x86_64
postgresql15-libs-15.0-1PGDG.rhel8.x86_64
postgresql15-15.0-1PGDG.rhel8.x86_64
```

インストールできたみたいですね！

で、、、インストールしたは良いが、このあとどうすればいいんだ。

### 5.PostgreSQLを起動

起動したいがコマンドが通らん。

```
[root@postgreSQL yum.repos.d]# sudo postgresql-setup initdb
sudo: postgresql-setup: コマンドが見つかりません
[root@postgreSQL init.d]# service start initdb
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
[root@postgreSQL init.d]# systemctl start initdb
Failed to start initdb.service: Unit initdb.service not found.


/*インストール失敗してる ??*/
/*でも、以下の通り postgres ユーザーは存在しているので、インストール失敗っていう訳ではなさそう。*/

[root@postgreSQL ~]# id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres)
```

ここで師匠に相談したところ以下のアドバイスを頂きました。

「Oracleでもそうだったと思うけど、コマンドは bin を指定してあげないと通らないよ」
「インストール後にも必要な設定(環境変数など)があるからその点も注目すると良いかも」

とても基本的なことが抜けていて恥ずかしかったですが、その通りですね。。ありがたい。。
環境変数設定します。。

[参考]
▼PostgreSQL導入から接続まで
  https://atmarkit.itmedia.co.jp/ait/articles/0806/10/news144_2.html

```
[postgres@postgreSQL data]$ export PATH=$PATH:/usr/pgsql-15/bin
[postgres@postgreSQL data]$ export MANPATH=$MANPATH:/usr/pgsql-15/share/man
[postgres@postgreSQL data]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/pgsql-15/lib
[postgres@postgreSQL data]$ export PGDATA=/var/lib/pgsql/15/data
[postgres@postgreSQL data]$
[postgres@postgreSQL data]$ initdb --encoding=UTF8 --no-locale
データベースシステム内のファイルの所有者はユーザー"postgres"となります。
このユーザーをサーバープロセスの所有者とする必要があります。

データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索構成は english に設定されます。

データベージのチェックサムは無効です。

ディレクトリ/var/lib/pgsql/15/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
動的共有メモリの実装を選択しています ... posix
デフォルトのmax_connectionsを選択しています ... 100
デフォルトのshared_buffersを選択しています ... 128MB
デフォルトの時間帯を選択しています ... America/New_York
設定ファイルを作成しています ... ok
ブートストラップスクリプトを実行しています ... ok
ブートストラップ後の初期化を実行しています ... ok
データをディスクに同期しています ... ok

initdb: 警告: ローカル接続に対して"trust"認証を有効にします
initdb: ヒント: pg_hba.confを編集する、もしくは、次回initdbを実行する時に -A オプション、
        あるいは --auth-local および --auth-host オプションを使用することで変更できます。

成功しました。以下のようにしてデータベースサーバーを起動できます: /*来た来た！*/

    pg_ctl -D /var/lib/pgsql/15/data -l ログファイル start 
```

次にいよいよ PostgreSQLを起動します。

```
/*起動*/
[postgres@postgreSQL data]$ pg_ctl -w start
サーバーの起動完了を待っています....2022-10-17 02:10:44.595 EDT [167739] LOG:  redirecting log output to logging collector process
2022-10-17 02:10:44.595 EDT [167739] HINT:  Future log output will appear in directory "log".
完了
サーバー起動完了

/*停止*/
[postgres@postgreSQL data]$ pg_ctl stop
サーバー停止処理の完了を待っています....完了
サーバーは停止しました
```

基本的な環境変数を忘れてしまいメンタルブレイクしたので、
今回はこの辺で終わります。

ではまた。