PostgreSQLインストールメモ その2 ~CentOS編①~

PostgreSQLインストール備忘録。今度は仮想環境(VirtualBox)上のCentOS8マシンを対象とした。ネットワーク設定はブリッジアダプターなのでホストOSと同一ネットワークに存在する想定となる。
Windows版でバージョン13をインストールしたため、何となくそれに合わせてここでもバージョン13をインストール。

参考記事
PostgreSQL 13のインストール (CentOS 8編)
CentOs8にPostgreSQL 13をインストールする
PostgreSQL を CentOS にインストールするには
【初心者向け】サーバに構築したPostgreSQLをWindowsからツールで使えるようになるまでを一から説明します。


インストール ​

PostgreSQLの公式サイトからyumリポジトリを取得する。

上記URLにアクセスし、OSおよびディストリビューションを選択するとダウンロードページに遷移する(ちなみにWindowsを選択すると結局EDB社のページに飛ばされた)。

画像1

対象ディストリビューションのyumリポジトリダウンロードページで以下
・バージョン:13
・プラットフォーム:Red Hat Enterprise, Rocky, or Oracle version 8
・アーキテクチャ:X86_64
と指定してやるとインストールに必要なコマンドを出力してくれた。
めちゃくちゃ親切だな!!!!!!

↓こんな感じ。

画像2

画像3
よくわからんけど実行(後でまとめるかもしれない)。

# Install the repository RPM:
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

よくわからんけど実行(後でまとめるかもしれない)。

# Disable the built-in PostgreSQL module:
# dnf -qy module disable postgresql

よくわからんけど実行(後でまとめるかもしれない)。
とりあえずここまででPostgreSQLのインストールは完了した。

# Install PostgreSQL:
# dnf install -y postgresql13-server

初期化コマンドが用意されているようなので実行する。設定ファイルが生成される。

# Optionally initialize the database and enable automatic start:
# /usr/pgsql-13/bin/postgresql-13-setup initdb

# 生成された設定ファイル確認
# ls  /var/lib/pgsql/13/data/

>
PG_VERSION        log           pg_ident.conf  pg_replslot   pg_stat_tmp  pg_wal                postmaster.opts
base              pg_commit_ts  pg_logical     pg_serial     pg_subtrans  pg_xact               postmaster.pid
current_logfiles  pg_dynshmem   pg_multixact   pg_snapshots  pg_tblspc    postgresql.auto.conf
global            pg_hba.conf   pg_notify      pg_stat       pg_twophase  postgresql.conf

マシンが起動した際にサービスが自動で起動するように設定を行う。

# systemctl enable postgresql-13


パスワード設定

PostgreSQLのインストールを実施した時点でOSユーザ「postgres」が作成されるのだが、パスワードが未設定であるためログインするにはrootユーザからsuコマンドを叩くしかない。
したがってまずこのOSユーザに対してパスワードを設定しておく。

# ユーザ「postgres」が存在することの確認
$ cat /etc/passwd | grep postgres

>postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

下記コマンドを実行してパスワード変更。パスワードは例の如く適当(パスワードの内容への怒られが発生したけどまあええやろ)。
OS上のユーザ名:postgres
パスワード:postgres

# passwd postgres

>ユーザー postgres のパスワードを変更。
>新しいパスワード:
>よくないパスワード: このパスワードには一部に何らかの形でユーザー名が含まれています。
>新しいパスワードを再入力してください:
>passwd: すべての認証トークンが正しく更新できました。

次はPostgreSQLのスーパーユーザ「postgres」のパスワード設定を行う。

まずPostgreSQLを起動する。

# systemctl start postgresql-13.service

何も出力されなければ起動成功らしいが、下記コマンドでサービスの状態を確認しておく。「Active: active (running)」となっており起動中であることが分かる。

# systemctl status postgresql-13.service

>
● postgresql-13.service - PostgreSQL 13 database server
  Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; enabled; vendor preset: disabled)
  Active: active (running) since Sat 2022-01-22 16:32:28 JST; 1min 8s ago
    Docs: https://www.postgresql.org/docs/13/static/
 Process: 9469 ExecStartPre=/usr/pgsql-13/bin/postgresql-13-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 9474 (postmaster)
   Tasks: 8 (limit: 23546)
  Memory: 16.8M
  CGroup: /system.slice/postgresql-13.service
          tq9474 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
          tq9476 postgres: logger
          tq9478 postgres: checkpointer
          tq9479 postgres: background writer
          tq9480 postgres: walwriter
          tq9481 postgres: autovacuum launcher
          tq9482 postgres: stats collector
          mq9483 postgres: logical replication launcher

ここからパスワード設定の手順に入る。
OSのユーザーをroot→postgresに変更し、

# su - postgres

psqlを起動してから、psqlコマンドラインで
「alter role postgres with password 'postgres';」
を実行すれば
スーパーユーザのパスワード:postgres
と設定される。

$ psql

>psql (13.5)
>"help"でヘルプを表示します。
>postgres=# alter role postgres with password 'postgres';
 >ALTER ROLE
>postgres=# \q

最後に再起動して設定を反映させておく。

# systemctl restart postgresql-13.service

以上で2つの「postgres」ユーザに対するパスワード設定が完了した。


追記(これも設定した方がいい気がする)

psqlコマンドはオプション無しで実行すると以下が設定される。
・ホスト名:localhost
・ポート番号:5432
・ロール名:OSのユーザ名
・データベース名:ロール名と同じデータベース名

先述のpsql実行はOSユーザを「postgres」に切り替えて行ったため、ロール「postgres」でログインすることになった。
ではここで別のロールでのログインはどうだろうか?

まずOSユーザ「postgres」でOSにログインした状態で同じデータベース内にロール「testROLE01」を作る。

$ psql -U postgres -d postgres
>psql (13.5)
>"help"でヘルプを表示します。

postgres=# CREATE USER testROLE01 WITH PASSWORD 'testROLE01';
 >CREATE ROLE
postgres=# \q

次に新たに作成したロールでログインを試みる際には本当はパスワード要求をして貰いたいのだが、「psql: エラー: FATAL: ユーザ"testrole01"で対向(peer)認証に失敗しました」というエラーが吐き出されてしまった。

$ psql -U testrole01 -d postgres
psql: エラー: FATAL:  ユーザ"testrole01"で対向(peer)認証に失敗しました


pg_hba.conf編集

原因は上記ファイルのローカルホストからの接続を制御する行がデフォルトで以下のようになっていることらしい(pg_hba.confの役割については PostgreSQLインストールメモ その3 ~CentOS編②~ で述べるためここでは割愛する)。

# "local" is for Unix domain socket connections only
local   all             all                                     peer

最後の区分で認証方式がPeerに設定されている。Peer認証とはPostgreSQLのユーザーとOSユーザが一致している時にログインを許可するような仕組みのことで、今回でいえばOSユーザ「postgres」と接続要求したPostgreSQLのユーザー「testROLE01」が異なるためエラーになってしまった、ということらしい。

peer認証方式はカーネルからクライアント上のオペレーティングシステムのユーザ名を取得し、 それをデータベースユーザ名(オプションのユーザ名マップとともに)として使用することにより動作します。この方法はローカル接続でのみ使用可能です。
https://www.postgresql.jp/docs/11/auth-peer.html

あんまり嬉しくない設定かなあと思うので認証方式をmd5に変更しておく。

# "local" is for Unix domain socket connections only
local   all             all md5

再起動後「testROLE01」での接続を試みたところ今度は上手くいった。

# systemctl restart postgresql-13.service
# su - postgres
$ psql -U testrole01 -d postgres
>ユーザ testrole01 のパスワード:
>psql (13.5)
>"help"でヘルプを表示します。
>postgres=>


この記事が気に入ったらサポートをしてみませんか?