AlmaLinux 8

AlmaLinux 8.5 セットアップメモ

Section 3.1 データベースサーバー構築編(PostgreSQL)

About

MySQLやmariadbに比べて、引っかかることが多いので、PostgreSQLのインストールと設定手順を残しています。

環境は、Section 1.1Section 1.2 を行った直後の状態からとなりますが、Section 2.1Section 2.2で作成した環境で実行しています。

なお、この手順では、OS側で管理しているパッケージを使った構築手順となります。いろいろ付随するものを入れる場合、dnf管理されていないこともあるので、拡張機能を入れる場合は、Section3.2のPostgreSQL公式パッケージからのインストール手順を使ってください。

AppStreamのバージョン等を調べる

RHEL 8 から、OSのライフサイクル(リリースから10年)にすべて縛られると更新が早いモノは、大変面倒なことになるので2~5年程度で更新されるようにするAppStreamというものができました。

PostgreSQLも、おおよそ1年に一回アップデートされていくので、RHEL 7の頃は公式リポジトリから持ってきてインストールするのが常でした。今回はその呪縛から逃れられそうなので、dnfを用いてAppStreamから入れていきたいと思います。

まずは、使うことができるバージョン情報から確認します。

[root@localhost ~]# dnf module list postgresql
AlmaLinux 8 - AppStream
Name         Stream   Profiles             Summary
postgresql   9.6      client, server [d]   PostgreSQL server and client module
postgresql   10 [d]   client, server [d]   PostgreSQL server and client module
postgresql   12       client, server [d]   PostgreSQL server and client module
postgresql   13       client, server [d]   PostgreSQL server and client module

Extra Packages for Enterprise Linux Modular 8 - x86_64
Name         Stream   Profiles             Summary
postgresql   11       client, server       PostgreSQL module

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled

PostgreSQL 10 がデフォルトらしく、13まであるという事がわかりました。

バージョンの切り替え

デフォルト以外のバージョンが必要な場合は、パッケージをインストールする前に、対象バージョンを使うように設定する必要があります。

今回は最新に合わせようという事で、13 を選択します。

[root@localhost ~]# dnf module enable postgresql:13
依存関係が解決しました。
================================================================================
 パッケージ        アーキテクチャー バージョン          リポジトリー      サイズ
================================================================================
モジュールストリームの有効化中:
 postgresql                         13

トランザクションの概要
================================================================================

これでよろしいですか? [y/N]: y
完了しました!
[root@localhost ~]# dnf module list postgresql
AlmaLinux 8 - AppStream
Name         Stream   Profiles             Summary
postgresql   9.6      client, server [d]   PostgreSQL server and client module
postgresql   10 [d]   client, server [d]   PostgreSQL server and client module
postgresql   12       client, server [d]   PostgreSQL server and client module
postgresql   13 [e]   client, server [d]   PostgreSQL server and client module

Extra Packages for Enterprise Linux Modular 8 - x86_64
Name         Stream   Profiles             Summary
postgresql   11       client, server       PostgreSQL module

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
[root@localhost ~]# 

これで、13 に [e] が付いたので有効化されました。

インストール

対象バージョンが有効になったので普通に指定してインストールしていきましょう。

[root@localhost ~]# dnf install postgresql postgresql-server
依存関係が解決しました。
================================================================================
 パッケージ        Arch   バージョン                            Repo      サイズ
================================================================================
インストール:
 postgresql        x86_64 13.5-1.module_el8.5.0+2607+8c0fd184   appstream 1.5 M
 postgresql-server x86_64 13.5-1.module_el8.5.0+2607+8c0fd184   appstream 5.6 M
依存関係のインストール:
 libicu            x86_64 60.3-2.el8_1                          baseos    8.8 M
 libpq             x86_64 13.3-1.el8_4                          appstream 196 k

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

ダウンロードサイズの合計: 16 M
インストール後のサイズ: 61 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(中略)
完了しました!
[root@localhost ~]#

インストールが終わりましたが、まだ使えません。

データの保存場所について

Databaseに記録された情報がディスク内のどこに保存されるか?その場所は変更できるのか?という事に対する対応方法。

特に変更しない場合、データは、/var/lib/pgsql/data/ に保存されます。

変更する場合は、systemd のserviceファイルを書き換えます。

[root@localhost ~]# vi /usr/lib/syst//system/postgresql.service
Environment=PG_OOM_ADJUST_VALUE=0

Environment=PGDATA=/var/lib/pgsql/data

ExecStartPre=/usr/libexec/postgresql-check-db-dir %N

PGDATA が保存先になっているので、保存先を作成した後に書き換えてください。

データベースの初期化

DBの実体を保存する場所や設定なども無いので、それらもまとめて初期化します。

[root@localhost ~]# /usr/bin/postgresql-setup initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
[root@localhost ~]$ 

これで初期化できたので、サービスを起動していきます。

サービス

systemd を通じてサービスの有効化を行い、起動します。

[root@localhost ~]# systemctl enable postgresql
Created symlink /etc/syst//system/multi-user.target.wants/postgresql.service →
 /usr/lib/syst//system/postgresql.service.
[root@localhost ~]# systemctl start postgresql
[root@localhost ~]# 

別のサーバーからアクセスさせる場合の設定

初期設定では、外部からのアクセスが完全に禁止されています。 そのため許可するように設定を変更してみましょう。

[root@localhost ~]# cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.org
[root@localhost ~]# vi /var/lib/pgsql/data/postgresql.conf
*** /var/lib/pgsql/data/postgresql.conf.org YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /var/lib/pgsql/data/postgresql.conf     YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 57,62 ****
--- 57,63 ----

        # - Connection Settings -

+       listen_addresses = '*'
        #listen_addresses = 'localhost'         # what IP address(es) to listenon;
                                                # comma-separated list of addresses;
                                                # defaults to 'localhost'; use '*' for all

listen_adresses を書き換えることになりますが、* はすべてを許可になるため、接続元がわかっている場合は制限を掛けるなどしても良いでしょう。

次に接続するユーザーの認証方式などを変更します。local接続がpeerだと不便だったりあまりよくないこともあるのですがとりあえず……

[root@localhost ~]# cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
[root@localhost ~]# vi /var/lib/pgsql/data/pg_hba.conf
*** /var/lib/pgsql/data/pg_hba.conf.org YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /var/lib/pgsql/data/pg_hba.conf     YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 83,93 ****
        # "local" is for Unix domain socket connections only
        local   all             all                                     peer
        # IPv4 local connections:
!       host    all             all             127.0.0.1/32            ident
        # IPv6 local connections:
!       host    all             all             ::1/128                 ident
        # Allow replication connections from localhost, by a user with the
        # replication privilege.
        local   replication     all                                     peer
!       host    replication     all             127.0.0.1/32            ident
!       host    replication     all             ::1/128                 ident
--- 83,93 ----
        # "local" is for Unix domain socket connections only
        local   all             all                                     peer
        # IPv4 local connections:
!       host    all             all             all                     scram-sha-256
        # IPv6 local connections:
!       host    all             all             ::1/128                 scram-sha-256
        # Allow replication connections from localhost, by a user with the
        # replication privilege.
        local   replication     all                                     peer
!       host    replication     all             all                     scram-sha-256
!       host    replication     all             ::1/128                 scram-sha-256

設定を変えたらサービスを再起動しましょう。

[root@localhost ~]# systemctl restart postgresql
[root@localhost ~]# 

ロールとデータベースを作成する

データベースにアクセスするためのユーザーと権限(ロール)とデータベースを作成します。

vagrant ユーザーがいるのでそのユーザー用のロールとを作成します。オプションは下記の通り。

オプション 内容
-S posgtresロールと同じ権限を持つスーパーユーザーではない
-R ロールは別のロールを作成不可
-d ロールは新しいデータベースを作成可
-P 新しいロールにパスワードを割り当てる

データベースも作れないようにするのが正解ではあるけれど、何かと面倒なので作成可能にしています。

[root@localhost ~]# su - postgres -c "createuser -S -R -d -P vagrant"
新しいロールのためのパスワード:
もう一度入力してください:
[root@localhost ~]# 

データベースを作成します。

[root@localhost ~]# su - postgres -c "createdb -O vagrant -E UTF-8 vagrant"
[root@localhost ~]# 

接続確認

psqlコマンドを使ってアクセスします。

[vagrant@localhost ~]$ psql
psql (13.5)
"help"でヘルプを表示します。

vagrant=> \q
[vagrant@localhost ~]$