明日から本気だす

データベース好きなサポートエンジニアのメモです.

CentOS 8.2 に PostgreSQL 12.4 をインストール

はじめに

CentOS 8.2 に PostgreSQL 12.4 をインストールした際の自分用のメモ。
PostgreSQL 開発元の Yum リポジトリhttps://yum.postgresql.org/repopackages )を利用しインストール。
データベースクラスタの作成、PostgreSQL 起動・停止、作業用データベース・ロール作成までを記載した。

Yum リポジトリを追加

POSTGRESQL YUM REPOSITORY の RepoRPMs より、該当 OS(CentOS8)の URL リンクをコピーして yum コマンドでインストール。

$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

pgdg12 のリポジトリが追加されたことを確認。

$ dnf list | grep postgresql12
postgresql12.x86_64                                  12.4-1PGDG.rhel8                                 @pgdg12
postgresql12-libs.x86_64                             12.4-1PGDG.rhel8                                 @pgdg12
postgresql12-server.x86_64                           12.4-1PGDG.rhel8                                 @pgdg12
postgresql12-contrib.x86_64                          12.4-1PGDG.rhel8                                 pgdg12
postgresql12-devel.x86_64                            12.4-1PGDG.rhel8                                 pgdg12
postgresql12-docs.x86_64                             12.4-1PGDG.rhel8                                 pgdg12
postgresql12-llvmjit.x86_64                          12.4-1PGDG.rhel8                                 pgdg12
postgresql12-odbc.x86_64                             12.02.0000-1PGDG.rhel8                           pgdg-common
postgresql12-odbc-debuginfo.x86_64                   12.02.0000-1PGDG.rhel8                           pgdg-common
postgresql12-odbc-debugsource.x86_64                 12.02.0000-1PGDG.rhel8                           pgdg-common
postgresql12-plperl.x86_64                           12.4-1PGDG.rhel8                                 pgdg12
postgresql12-plpython.x86_64                         12.4-1PGDG.rhel8                                 pgdg12
postgresql12-plpython3.x86_64                        12.4-1PGDG.rhel8                                 pgdg12
postgresql12-pltcl.x86_64                            12.4-1PGDG.rhel8                                 pgdg12
postgresql12-test.x86_64                             12.4-1PGDG.rhel8                                 pgdg12

インストール

CentOS8 からデフォルトのパッケージ管理システムが yum から dnf に変更された。引き続き yum コマンドも利用できるが dnf コマンドの alias のよう。dnf コマンドで、postgresql12-server(サーバプログラム)と postgresql12(クライアントプログラム)を指定してインストールする。

$ sudo dnf -y install postgresql12 postgresql12-server

postgresql12-libs(共有ライブラリ) は依存関係でインストールされる。

$ dnf list installed | grep postgres
postgresql12.x86_64                           12.4-1PGDG.rhel8                               @pgdg12
postgresql12-libs.x86_64                      12.4-1PGDG.rhel8                               @pgdg12
postgresql12-server.x86_64                    12.4-1PGDG.rhel8                               @pgdg12

それ以外のパッケージも必要な場合は、別途 dnf コマンドでインストールする。

パッケージ 内容
postgresql12-docs マニュアル
postgresql12-contrib 拡張モジュール、便利ツール
postgresql12-devel 開発用ライブラリ
postgresql12-llvmjit JIT コンパイル対応(v11 より登場)
postgresql12-plperl PL/Perl
postgresql12-plpython PL/Python
postgresql12-plpython3 PL/Python3
postgresql12-pltcl PL/Tcl
postgresql12-test テストツール

パッケージのインストールが完了すると postgres ユーザが作成され /var/lib/pgsql がホームディレクトリとなる。ライブラリーやコマンドは /usr/pgsql-12 に配置されるので $HOME/.pgsql_profile環境変数$PATH を設定する。

$ passwd postgres
$ su - postgres
$ echo $HOME
/var/lib/pgsql
$ ll /usr/pgsql-12/
合計 12
drwxr-xr-x. 2 root root 4096  8月 24 20:23 bin
drwxr-xr-x. 3 root root 4096  8月 24 20:23 lib
drwxr-xr-x. 7 root root 4096  8月 24 20:23 share
$ touch .pgsql_profile
$ vim .pgsql_profile

# 追加
PATH=/usr/pgsql-12/bin:$PATH
MANPATH=/usr/pgsql-12/share/man:$MANPATH
PGDATA=/var/lib/pgsql/12/data
export PATH MANPATH PGDATA

データベースクラスターの作成

インストール後は initdb コマンドでデータベースクラスターを作成。データベースクラスタは、Oracle Database のインスタンスにあたるようなもの(?)

https://www.postgresql.jp/document/12/html/app-initdb.html

データベースクラスタとは、1つのサーバインスタンスで管理されるデータベースの集合です。1つのサーバインスタンスで管理されるデータベースの集合です

initdb コマンドを実行すると、データベースクラスタ、共有カタログテーブル、template データベース・postgres データベースが作成される。

  • 環境変数 $PGDATE を設定しているので -D オプションは指定しない。
  • -E オプションで template データベースの符号化方式を UTF-8 に指定。
  • --no-localeロケール--locale=C と同じ)を指定。
  • -A オプションでローカルユーザで利用されるデフォルトの認証方式を指定。

[ToDo] PostgreSQL の認証方式についてあとで調べる scram-sha-256 は v10 から指定可能(?)チャレンジ・レスポンス方式となり、認証方式としても安全だが、古いクライアントでは利用できないよう。 https://www.postgresql.jp/document/10/html/auth-methods.html

$ initdb -E UTF8 --no-locale -A scram-sha-256 -W
データベースシステム内のファイルの所有者はユーザ"postgres"となります。
このユーザをサーバプロセスの所有者とする必要があります。

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

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

新しいスーパユーザのパスワードを入力してください:
再入力してください:

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

成功しました。以下のようにしてデータベースサーバを起動することができます:

    /usr/pgsql-12/bin/pg_ctl -D /var/lib/pgsql/12/data -l ログファイル start

PostgreSQL 起動・停止

systemctl

dnf コマンドでインストールすると /usr/lib/systemd/system/postgresql-12.service も自動で作成されているので systemctl コマンドで起動・停止が可能。 (データベースクラスタ($PGDATA)を変更している場合は postgresql-12.service を編集する。)

# 起動
$ systemctl start postgresql-12.service

# ステータス確認
$ systemctl status postgresql-12.service
● postgresql-12.service - PostgreSQL 12 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-12.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-08-26 20:53:05 JST; 18s ago
     Docs: https://www.postgresql.org/docs/12/static/
  Process: 2507 ExecStartPre=/usr/pgsql-12/bin/postgresql-12-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 2512 (postmaster)
    Tasks: 8 (limit: 49772)
   Memory: 17.1M
   CGroup: /system.slice/postgresql-12.service
           ├─2512 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data/
           ├─2514 postgres: logger
           ├─2516 postgres: checkpointer
           ├─2517 postgres: background writer
           ├─2518 postgres: walwriter
           ├─2519 postgres: autovacuum launcher
           ├─2520 postgres: stats collector
           └─2521 postgres: logical replication launcher

 8月 26 20:53:05 nissps03.localdomain systemd[1]: Starting PostgreSQL 12 database server...
 
# 停止
$ systemctl stop postgresql-12.service

pg_ctl

/usr/pgsql-12/bin/pg_ctl コマンドを利用した起動・停止も可能。pg_ctl コマンドのオプションはドキュメント(https://www.postgresql.jp/document/12/html/app-pg-ctl.html) を参照

$ pg_ctl start
サーバの起動完了を待っています....2020-08-26 20:58:06.551 JST [2586] LOG:  starting PostgreSQL 12.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64-bit
2020-08-26 20:58:06.553 JST [2586] LOG:  listening on IPv6 address "::1", port 5432
2020-08-26 20:58:06.553 JST [2586] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2020-08-26 20:58:06.556 JST [2586] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-08-26 20:58:06.560 JST [2586] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-08-26 20:58:06.572 JST [2586] LOG:  redirecting log output to logging collector process
2020-08-26 20:58:06.572 JST [2586] HINT:  Future log output will appear in directory "log".
完了
サーバ起動完了

$ pg_ctl stop
サーバ停止処理の完了を待っています....完了
サーバは停止しました

ロールとデータベース作成

psql

postgres ユーザにスイッチして psql コマンドで DB に接続する。インストール直後は postgres データベースとテンプレートが存在する。

$ psql
ユーザ postgres のパスワード:
psql (12.4)
"help"でヘルプを表示します。

postgres-# \l
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+----------+-------------------+-----------------------
 postgres  | postgres | UTF8             | C        | C                 |
 template0 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(3 行)

ユーザ(ロール)作成

postgres ユーザはスーパーユーザとなるため、別途作業用のユーザ(ロール)を作成。

postgres=# CREATE ROLE staff;
CREATE ROLE

postgres=# SELECT rolname FROM pg_roles;
          rolname
---------------------------
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_read_server_files
 pg_write_server_files
 pg_execute_server_program
 pg_signal_backend
 postgres
 staff
(10 行)

postgres=# ALTER ROLE staff LOGIN;
ALTER ROLE

postgres=# ALTER ROLE staff PASSWORD 'hogehoge';
ALTER ROLE

PostgreSQL では、ロールがユーザとグループの両方の性質をもっている。CREATE ROLE コマンドでロールを作成するがCREATE USER コマンドも存在する。両コマンドの差は CREATE ROLE はデフォルトが NOLOGIN となり、CREATE USER はデフォルトが LOGIN となる。

ロールの属性(権限)変更

作成した staff ロールの属性(権限)に CREATEDB を追加。

postgres=# ALTER ROLE staff CREATEDB;
ALTER ROLE

postgres=# \du
                                             ロール一覧
 ロール名 |                                   属性                                   | 所属グループ
----------+--------------------------------------------------------------------------+--------------
 postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {}
 staff    | DB作成可                                                             | {}

データベース作成

作成したロールであらたに作業用のデータベースを作成。CREATE DATABASE を発行したロールがそのデータベースの所有者となる。

$ psql -U staff -d postgres

postgres=> CREATE DATABASE example01;
CREATE DATABASE

postgres=> \l
                                        データベース一覧
   名前    |  所有者  | エンコーディング | 照合順序 | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+----------+-------------------+-----------------------
 example01 | staff    | UTF8             | C        | C                 |
 postgres  | postgres | UTF8             | C        | C                 |
 template0 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | C        | C                 | =c/postgres          +
           |          |                  |          |                   | postgres=CTc/postgres
(4 行)

参考URL