📑

PostgreSQL:概要理解

2022/06/02に公開

現場でPostgreSQL使うことになったので調べたことを纏めてみた。

アーキテクチャ


psqlからの問合せに対して、postmasterで一旦リクエストを受け取り、以降はforkされたpostgresqlにて対応する。
postgresqlは問合せ内容に応じてbackground processとやり取りを行い、shared_buffersにデータがあれば問合せ内容の処理して、psqlに問合せ結果を返す。
background processは任意のタイミングでdata領域にshared_buffersの内容を反映する。

追記型アーキテクチャとは?

PostgreSQLは追記型アーキテクチャを採用している。
追記型アーキテクチャは、通常の更新と削除を違うやり方で行う。

更新処理:通常はレコードに対して直接更新を行うが、追記型は更新後のデータを新規レコードとして挿入する。更新前レコードの取り扱いは、後述する削除処理の流れで削除される。

削除処理:通常はそのまま削除されるが、追記型は削除タイミングが異なる。削除対象のレコードに対してフラグを立てて、 VACUUM機能により削除する。

上記により、更新・削除が通常と比べて速く処理できるようになる。

構成情報

OS情報

手元にCentOS7のiosがあったのでVirtualBoxにインストール。
諸事情によりrhel8×PostgreSQL10で作り直しました。
インストール時のOS設定は割愛。

rhelのios,サブスクリプション登録は以下を参考にしました。
https://densan-hoshigumi.com/server/redhat-developer-program-rhel8-part1
https://densan-hoshigumi.com/server/rhel8-subscription-register

[root@postest ~]# uname -a
Linux postest 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
[root@postest ~]#

PostgreSQL構成情報

インストール直後の構成情報について調べてみた。

#リポジトリ追加
[root@postest ~]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 2022/6/4 他の方からアドバイスあり。rhelの場合、既存のAppStreamリポジトリがあるので、最新版を使うなどの要件がない限り開発元のPGDGリポジトリではなく、AppStreamを使うことをお勧めします。

#パッケージ情報確認
[root@postest ~]# dnf info postgresql-server
名前         : postgresql-server
バージョン   : 10.21
リリース     : 2.module+el8.6.0+15342+53518fac
Arch         : x86_64
サイズ       : 5.1 M
ソース       : postgresql-10.21-2.module+el8.6.0+15342+53518fac.src.rpm
リポジトリー : rhel-8-for-x86_64-appstream-rpms
概要         : The programs needed to create and run a PostgreSQL server
URL          : http://www.postgresql.org/
ライセンス   : PostgreSQL
説明         : PostgreSQL is an advanced Object-Relational database management system (DBMS).
             : The postgresql-server package contains the programs needed to create
             : and run a PostgreSQL server, which will in turn allow you to create
             : and maintain PostgreSQL databases.

#インストール
[root@postest ~]# dnf install -y postgresql-server
インストール済み:
  libpq5-14.2-42PGDG.rhel8.x86_64 #ライブラリ
  postgresql-10.21-2.module+el8.6.0+15342+53518fac.x86_64 #クライアント(psqlコマンド)
  postgresql-server-10.21-2.module+el8.6.0+15342+53518fac.x86_64 # サーバ

#パスワード変更
[root@postest ~]# passwd postgres
ユーザー postgres のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

##スイッチ
[root@postest ~]# su - postgres
[postgres@postest ~]$

#データベース初期化
[postgres@postest ~]$ initdb -D /var/lib/pgsql/data
initdb: /lib64/libpq.so.5: no version information available (required by initdb)
データベースシステム内のファイルの所有者は"postgres"となります。
このユーザがサーバプロセスも所有する必要があります。

データベースクラスタはロケール"ja_JP.UTF-8"で初期化されます。
そのためデフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.UTF-8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

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

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

警告: ローカル接続で"trust"認証を有効にします。
この設定はpg_hba.confを編集するか、次回のinitdbの実行の際であれば-Aオプ
ション、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。

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

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

#起動
[postgres@postest ~]$ systemctl start postgresql

#プロセス一覧
[postgres@postest ~]$ systemctl status postgresql
  Process: 27304 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS)
 Main PID: 27307 (postmaster)
    Tasks: 8 (limit: 11269)
   Memory: 15.9M
   CGroup: /system.slice/postgresql.service
           tq27307 /usr/bin/postmaster -D /var/lib/pgsql/data
           tq27308 postgres: logger process ##ログ
           tq27310 postgres: checkpointer process ##チェックポイント処理
           tq27311 postgres: writer process ##共有バッファの内容をデータファイルに同期
           tq27312 postgres: wal writer process ##共有バッファの内容をWALファイルに同期
           tq27313 postgres: autovacuum launcher process ##自動バキューム
           tq27314 postgres: stats collector process ##統計情報の収集
           mq27315 postgres: bgworker: logical replication launcher

#ファイル一覧
[postgres@postest ~]$ rpm -ql postgresql-server-10.21-2.module+el8.6.0+15342+53518fac.x86_64
/etc/pam.d/postgresql
/etc/postgresql-setup
/etc/postgresql-setup/upgrade
/etc/postgresql-setup/upgrade/postgresql.conf
/usr/bin/ ##psqlとかTool群が格納
/usr/lib/ ##共有ライブラリが格納
/usr/lib64/ 
/usr/libexec/
/usr/sbin/postgresql-new-systemd-unit
/usr/share/ ##翻訳ファイルなどが格納
/var/lib/pgsql
/var/lib/pgsql/.bash_profile
/var/lib/pgsql/backups
/var/lib/pgsql/data ##★設定ファイル、データベース、ログなどが格納
/var/run/postgresql

#ファイル詳細(data)
[postgres@postest ~]$ ls -l /var/lib/pgsql/data
PG_VERSION ##バージョン番号
base ##データベース格納ディレクトリ
current_logfiles ##カレントログファイル名が記録されている
global ##テーブルや列の情報などのスキーマメタデータと内部的な情報を格納する
log ##★ログファイル
pg_commit_ts
pg_dynshmem
pg_hba.conf ##認証の設定ファイル
pg_ident.conf
pg_logical
pg_multixact
pg_notify
pg_replslot
pg_serial
pg_snapshots
pg_stat
pg_stat_tmp
pg_subtrans
pg_tblspc ##表領域ディレクトリのシンボリックリンク
pg_twophase
pg_wal ##★トランザクションログ
pg_xact
postgresql.auto.conf ##ALTER SYSTEMの変更内容が追加される
postgresql.conf ##★全体の設定ファイル
postmaster.opts
postmaster.pid

###その他詳細:https://www.postgresql.jp/document/10/html/storage-file-layout.html

#設定ファイル(postgresql.confの有効行のみ)
[postgres@postest ~]$ grep -v -e '^\s*#' -e '^\s*$' /var/lib/pgsql/data/postgresql.conf
max_connections = 100                   # (change requires restart)
shared_buffers = 128MB                  # min 128kB
dynamic_shared_memory_type = posix      # the default is the first option
logging_collector = on                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
log_timezone = 'Asia/Tokyo'
datestyle = 'iso, ymd'
timezone = 'Asia/Tokyo'
lc_messages = 'ja_JP.UTF-8'                     # locale for system error message
lc_monetary = 'ja_JP.UTF-8'                     # locale for monetary formatting
lc_numeric = 'ja_JP.UTF-8'                      # locale for number formatting
lc_time = 'ja_JP.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.simple'

###その他詳細:https://www.postgresql.jp/document/10/html/runtime-config.html

# 接続設定 (2022/6/3追加)
[root@postest ~]# cp -ip /var/lib/pgsql/data/postgresql.conf /var/tmp/postgresql.conf_`date +%Y%m%d`
[root@postest ~]#
[root@postest ~]# vi /var/lib/pgsql/data/postgresql.conf
[root@postest ~]#
[root@postest ~]# diff /var/lib/pgsql/data/postgresql.conf /var/tmp/postgresql.conf_`date +%Y%m%d`_2
59c59
< listen_addresses = 'localhost'                # what IP address(es) to listen on;
---
> #listen_addresses = 'localhost'               # what IP address(es) to listen on;
63c63
< port = 5432                           # (change requires restart)
---
> #port = 5432                          # (change requires restart)
[root@postest ~]#
## listen_addresses:外部から接続してくるIPを指定
## port:外部から接続してくるポートを指定

基本的な操作


#初期設定

##パスワード設定
[postgres@postest ~]$ psql -c "alter user postgres with password 'パスワード'"
psql: /lib64/libpq.so.5: no version information available (required by psql)
psql: /lib64/libpq.so.5: no version information available (required by psql)
ALTER ROLE
###「-c」オプションコマンド送信
###「""」送信内容


##ログイン
[postgres@postest ~]$ psql
psql: /lib64/libpq.so.5: no version information available (required by psql)
psql: /lib64/libpq.so.5: no version information available (required by psql)
psql (10.21)
"help" でヘルプを表示します。
postgres=#

##ログアウト
postgres=# \q
[postgres@postest ~]$

##認証設定(パスワード認証)
[postgres@postest ~]$ cp -ip /var/lib/pgsql/data/pg_hba.conf /var/tmp/pg_hba.conf_`date "+%Y%m%d"`
[postgres@postest ~]$ 
[postgres@postest ~]$ vi /var/lib/pgsql/data/pg_hba.conf
[postgres@postest ~]$
[postgres@postest ~]$ diff /var/lib/pgsql/data/pg_hba.conf /var/tmp/pg_hba.conf_`date "+%Y%m%d"`
84c84
< local   all             all                                     md5
---
> local   all             all                                     trust
[postgres@postest ~]$
[postgres@postest ~]$ systemctl restart postgres
### md5:パスワード認証
### trust:接続を無条件で許可



#ユーザ

##作成(SQL)
postgres=# CREATE ROLE piguo WITH LOGIN PASSWORD 'パスワード';
CREATE ROLE
postgres=#
postgres=# SELECT usename FROM pg_user;
 usename
----------
 postgres
 piguo
(2)
postgres=#

##削除(SQL)
postgres=# DROP USER piguo;
DROP ROLE
postgres=#
postgres=# SELECT usename FROM pg_user;
 usename
----------
 postgres
(1)

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

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


#DB

##接続DB確認
postgres=# select current_database();
 current_database
------------------
 postgres
(1)

##DB作成
postgres=# create database test;
CREATE DATABASE
postgres=#
postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 test      | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
(4)

##DB接続
postgres=# \c test
データベース"test"にユーザー"postgres"として接続しました。
test=#
test=#  select current_database();
 current_database
------------------
 test
(1)

##DB削除
postgres=# drop database test;
DROP DATABASE
postgres=#
postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3)

##TBL作成
postgres=# \c test
データベース"test"にユーザー"postgres"として接続しました。
test=#
test=# create table customer (
test(# id int8,
test(# name char(010)
test(# );
CREATE TABLE
test=#
test=# \d
             リレーション一覧
 スキーマ |   名前   |  タイプ  |  所有者
----------+----------+----------+----------
 public   | customer | テーブル | postgres
(1)

##TBL削除
test=# drop table customer;
DROP TABLE
test=#
test=# \d
リレーションが見つかりませんでした。
test=#

ダミーデータ作成

https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/


#アーカイブファイルをダウンロード
[root@postest src]# mkdir /usr/local/src/sampledatabase
[root@postest src]#
[root@postest src]# cd /usr/local/src/sampledatabase
[root@postest sampledatabase]#
[root@postest sampledatabase]# wget https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip
[root@postest sampledatabase]#
[root@postest sampledatabase]# unzip dvdrental.zip
[root@postest sampledatabase]#

#DB作成
[root@postest sampledatabase]# su - postgres
最終ログイン: 2022/06/03 () 02:48:24 JST日時 pts/0
[postgres@postest ~]$
[postgres@postest ~]$ psql
postgres=#
postgres=# create database dvdrental;
CREATE DATABASE
postgres=#
postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限
-----------+----------+------------------+-------------+-------------------+-----------------------
 dvdrental | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 test      | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
(5)
postgres=#
postgres=# \q
[postgres@postest ~]$

#ダミーデータリストア
[postgres@postest ~]$ cd /usr/local/src/sampledatabase/
[postgres@postest sampledatabase]$
[postgres@postest sampledatabase]$ pg_restore -h localhost -p 5432 -U postgres -d dvdrental dvdrental.tar
パスワード:
[postgres@postest sampledatabase]$
[postgres@postest sampledatabase]$ psql
postgres=#
postgres=# \c dvdrental
データベース"dvdrental"にユーザー"postgres"として接続しました。
dvdrental=#
dvdrental=# \d
                       リレーション一覧
 スキーマ |            名前            |   タイプ   |  所有者
----------+----------------------------+------------+----------
 public   | actor                      | テーブル   | postgres
 public   | actor_actor_id_seq         | シーケンス | postgres
 public   | actor_info                 | ビュー     | postgres
 public   | address                    | テーブル   | postgres
 public   | address_address_id_seq     | シーケンス | postgres
 public   | category                   | テーブル   | postgres
 public   | category_category_id_seq   | シーケンス | postgres
 public   | city                       | テーブル   | postgres
 public   | city_city_id_seq           | シーケンス | postgres
 public   | country                    | テーブル   | postgres
 public   | country_country_id_seq     | シーケンス | postgres
 public   | customer                   | テーブル   | postgres
 public   | customer_customer_id_seq   | シーケンス | postgres
 public   | customer_list              | ビュー     | postgres
 public   | film                       | テーブル   | postgres
 public   | film_actor                 | テーブル   | postgres
 public   | film_category              | テーブル   | postgres
 public   | film_film_id_seq           | シーケンス | postgres
 public   | film_list                  | ビュー     | postgres
 public   | inventory                  | テーブル   | postgres
 public   | inventory_inventory_id_seq | シーケンス | postgres
 public   | language                   | テーブル   | postgres
 public   | language_language_id_seq   | シーケンス | postgres
 public   | nicer_but_slower_film_list | ビュー     | postgres
 public   | payment                    | テーブル   | postgres
 public   | payment_payment_id_seq     | シーケンス | postgres
 public   | rental                     | テーブル   | postgres
 public   | rental_rental_id_seq       | シーケンス | postgres
 public   | sales_by_film_category     | ビュー     | postgres
 public   | sales_by_store             | ビュー     | postgres
 public   | staff                      | テーブル   | postgres
 public   | staff_list                 | ビュー     | postgres
 public   | staff_staff_id_seq         | シーケンス | postgres
 public   | store                      | テーブル   | postgres
 public   | store_store_id_seq         | シーケンス | postgres
(35)

バックアップ・リストア

以下のバックアップ・リストア方式が存在する。

①コールドバックアップ
②ホットバックアップ(論理バックアップ)
③継続アーカイブ+PITR(Point In TimeRecovery)

最新の状態までリカバリできるため、商用では③が利用されるケースが多い。
バックアップ方法として、「pg_basebackup」と「pg_rman」があるが、今回は手順が簡単な「pg_rman」にてバックアップを行った。

バックアップ・リストアのイメージは以下の通り。


#アーカイブログ、バックアップ格納先の確認
[root@postest ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   30G  0 disk
tqsda1          8:1    0  600M  0 part /boot/efi
tqsda2          8:2    0    1G  0 part /boot
mqsda3          8:3    0 28.4G  0 part
  tqrhel-root 253:0    0 26.4G  0 lvm  /
  mqrhel-swap 253:1    0    2G  0 lvm  [SWAP]
sdb             8:16   0   50G  0 disk
tqsdb1          8:17   0   14G  0 part /wal
mqsdb2          8:18   0   36G  0 part /backup
sr0            11:0    1 1024M  0 rom
[root@postest ~]#

###領域作成手順:https://zenn.dev/piguolabo/articles/db33e854283115

#アーカイブログ設定
[root@postest ~]# cp -ip /var/lib/pgsql/data/postgresql.conf /var/tmp/postgresql.conf_`date +"%Y%m%d"`
[root@postest ~]#
[root@postest ~]#
[root@postest ~]# vi /var/lib/pgsql/data/postgresql.conf
[root@postest ~]#
[root@postest ~]# diff /var/lib/pgsql/data/postgresql.conf /var/tmp/postgresql.conf_`date +"%Y%m%d"`
217c217
< archive_mode = on             # enables archiving; off, on, or always
---
> #archive_mode = off           # enables archiving; off, on, or always
219c219
< archive_command = 'cp -p %p /wal/%f'          # command to use to archive a logfile segment
---
> #archive_command = ''         # command to use to archive a logfile segment
223c223
< archive_timeout = 60          # force a logfile segment switch after this
---
> #archive_timeout = 0          # force a logfile segment switch after this


#アーカイブログ動作確認
[root@postest ~]# ls -l /var/lib/pgsql/data/pg_wal/
合計 32768
-rw------- 1 postgres postgres 16777216  63 19:40 000000010000000000000001
-rw------- 1 postgres postgres 16777216  63 19:40 000000010000000000000002
drwx------ 2 postgres postgres        6  63 18:59 archive_status
[root@postest ~]#
[root@postest ~]# ls -l /wal
合計 16
drwx------ 2 root root 16384  63 19:48 lost+found
[root@postest ~]#

###ここでダミーデータ作成###

[root@postest ~]# ls -l /var/lib/pgsql/data/pg_wal/
合計 49152
-rw------- 1 postgres postgres 16777216  63 20:15 000000010000000000000007
-rw------- 1 postgres postgres 16777216  63 20:16 000000010000000000000008
-rw------- 1 postgres postgres 16777216  63 20:13 000000010000000000000009
drwx------ 2 postgres postgres       43  63 20:15 archive_status
[root@postest ~]#
[root@postest ~]#
[root@postest ~]# ls -l /wal
合計 114704
-rw------- 1 postgres postgres 16777216  63 19:59 000000010000000000000001
-rw------- 1 postgres postgres 16777216  63 20:06 000000010000000000000002
-rw------- 1 postgres postgres 16777216  63 20:07 000000010000000000000003
-rw------- 1 postgres postgres 16777216  63 20:08 000000010000000000000004
-rw------- 1 postgres postgres 16777216  63 20:11 000000010000000000000005
-rw------- 1 postgres postgres 16777216  63 20:13 000000010000000000000006
-rw------- 1 postgres postgres 16777216  63 20:15 000000010000000000000007
drwx------ 2 root     root        16384  63 19:48 lost+found
[root@postest ~]

#pg_rmanインストール
[root@postest ~]# yum install postgresql10-libs ##依存パッケージのインストール
[root@postest ~]#
[root@postest ~]# mkdir /usr/local/src/pg_rman
[root@postest ~]#
[root@postest ~]# cd /usr/local/src/pg_rman

### サーバにrpmファイルを転送 ###

[root@postest pg_rman]# ls -l
合計 88
-rw-r--r-- 1 root root 86036  63 20:19 pg_rman-1.3.14-1.pg10.rhel8.x86_64.rpm
[root@postest pg_rman]#
[root@postest pg_rman]# rpm -ivh pg_rman-1.3.14-1.pg10.rhel8.x86_64.rpm
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:pg_rman-1.3.14-1.pg10.rhel8      ################################# [100%]
[root@postest pg_rman]#

#バックアップ
[root@postest pg_rman]# su - postgres
[postgres@postest ~]$ 
[postgres@postest ~]$ psql
postgres=# 
postgres=# SHOW log_directory ;
 log_directory
---------------
 log
(1)

postgres=#
postgres=# SHOW archive_command ;
 archive_command
------------------
 cp -p %p /wal/%f
(1)

postgres=#
postgres-# \q
[postgres@postest ~]$
[postgres@postest ~]$ vi ~/.bash_profile
[postgres@postest ~]$
[postgres@postest ~]$ cat ~/.bash_profile
[ -f /etc/profile ] && source /etc/profile

PGDATA=/var/lib/pgsql/data
export PGDATA
BACKUP_PATH=/backup #追加
export BACKUP_PATH #追加
[postgres@postest ~]$
[postgres@postest ~]$ exit
ログアウト
[root@postest pg_rman]#
[root@postest pg_rman]# su - postgres
[postgres@postest ~]$
[postgres@postest ~]$ echo $BACKUP_PATH
/backup
[postgres@postest ~]$
[postgres@postest ~]$ rm -rf /backup/* #ファイル等があると後続のコマンドでエラーが発生するため
[postgres@postest ~]$
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman init
INFO: ARCLOG_PATH is set to '/wal'
INFO: SRVLOG_PATH is set to '/var/lib/pgsql/data/log'
[postgres@postest ~]$
[postgres@postest ~]$ vi $BACKUP_PATH/pg_rman.ini
[postgres@postest ~]$
[postgres@postest ~]$ cat $BACKUP_PATH/pg_rman.ini
ARCLOG_PATH='/wal'
SRVLOG_PATH='/var/lib/pgsql/data/log'

BACKUP_MODE = F           #フルバックアップ
COMPRESS_DATA = YES       #データの圧縮
KEEP_ARCLOG_FILES = 10    #アーカイブ WAL の保存ファイル数
KEEP_DATA_GENERATIONS = 3 #データベースバックアップの保存世代数
KEEP_SRVLOG_FILES = 10    #サーバログの保存ファイル数
[postgres@postest ~]$

##全体バックアップ
###「serverlog」サーバログもバックアップ
###「progress」バックアップ進捗表示(ファイル数)
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman backup --backup-mode=full --with-serverlog --progress
Password:
INFO: copying database files
Processed 1276 of 1276 files, skipped 0
INFO: copying archived WAL files
Processed 24 of 24 files, skipped 0
INFO: copying server log files
Processed 1 of 1 files, skipped 0
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
INFO: start deleting old archived WAL files from ARCLOG_PATH (keep files = 10)
INFO: delete "000000010000000000000001"
INFO: delete "000000010000000000000004"
INFO: delete "000000010000000000000003"
INFO: delete "000000010000000000000005"
INFO: delete "000000010000000000000002"
INFO: delete "000000010000000000000010"
INFO: delete "00000001000000000000000F"
INFO: delete "00000001000000000000000E"
INFO: delete "00000001000000000000000D"
INFO: delete "00000001000000000000000C"
INFO: start deleting old server files from SRVLOG_PATH (keep files = 10)
INFO: start deleting old backup (keep generations = 3)
INFO: does not include the backup just taken
INFO: backup "2022-06-03 21:18:32" should be kept
DETAIL: This is the 1st latest full backup.
[postgres@postest ~]$
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2022-06-03 21:45:37  2022-06-03 21:45:45  FULL  9004kB     2  DONE
2022-06-03 21:18:32  2022-06-03 21:18:39  FULL    11MB     1  OK
[postgres@postest ~]$

##★検証。必ず実施。しないとリストア不可
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman validate
INFO: validate: "2022-06-03 21:45:37" backup, archive log files and server log files by CRC
INFO: backup "2022-06-03 21:45:37" is valid
[postgres@postest ~]$
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2022-06-03 21:45:37  2022-06-03 21:45:45  FULL  9004kB     2  OK
2022-06-03 21:18:32  2022-06-03 21:18:39  FULL    11MB     1  OK
[postgres@postest ~]$

#リストア

##リストアファイル生成
[postgres@postest ~]$ systemctl stop postgresql
[postgres@postest ~]$ /usr/pgsql-10/bin/pg_rman restore
INFO: the recovery target timeline ID is not given
INFO: use timeline ID of current database cluster as recovery target: 2
INFO: calculating timeline branches to be used to recovery target point
INFO: searching latest full backup which can be used as restore start point
INFO: found the full backup can be used as base in recovery: "2022-06-03 21:45:37"
INFO: copying online WAL files and server log files
INFO: clearing restore destination
INFO: validate: "2022-06-03 21:45:37" backup, archive log files and server log files by SIZE
INFO: backup "2022-06-03 21:45:37" is valid
INFO: restoring database files from the full mode backup "2022-06-03 21:45:37"
INFO: searching incremental backup to be restored
INFO: searching backup which contained archived WAL files to be restored
INFO: backup "2022-06-03 21:45:37" is valid
INFO: restoring WAL files from backup "2022-06-03 21:45:37"
INFO: restoring online WAL files and server log files
INFO: generating recovery.conf
INFO: restore complete
HINT: Recovery will start automatically when the PostgreSQL server is started.
[postgres@postest ~]$

##生成ファイルの確認
[postgres@postest ~]$ cat $PGDATA/recovery.conf
# recovery.conf generated by pg_rman 1.3.14
restore_command = 'cp /wal/%f %p'
recovery_target_timeline = '2'
[postgres@postest ~]$

##リストア
[postgres@postest ~]$ systemctl start postgresql
[postgres@postest ~]$ grep 'アーカイブリカバリ' /var/lib/pgsql/data/log/postgresql-Fri.log
2022-06-03 21:38:16.368 JST [6478] LOG:  アーカイブリカバリを開始しています
2022-06-03 21:38:17.966 JST [6478] LOG:  アーカイブリカバリが完了しました
[postgres@postest ~]$

参考

https://www.postgresql.jp/document/10/html/
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/
https://pgecons-sec-tech.github.io/tech-report/
https://www.amazon.co.jp/dp/4863541864/ref=cm_sw_r_cp_api_i_1WDS8ZDFFV1YS42Y4208
https://www.postgresql.org/download/linux/redhat/
https://gihyo.jp/dev/feature/01/dex_postgresql
https://www.amazon.co.jp/dp/B06XSWVL55/ref=cm_sw_r_tw_dp_FBM3TTXQFTDZ5VXCBEN6

Discussion