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 行)