PostgreSQL:概要理解
現場で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,サブスクリプション登録は以下を参考にしました。
[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=#
ダミーデータ作成
#アーカイブファイルをダウンロード
[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 6月 3 19:40 000000010000000000000001
-rw------- 1 postgres postgres 16777216 6月 3 19:40 000000010000000000000002
drwx------ 2 postgres postgres 6 6月 3 18:59 archive_status
[root@postest ~]#
[root@postest ~]# ls -l /wal
合計 16
drwx------ 2 root root 16384 6月 3 19:48 lost+found
[root@postest ~]#
###ここでダミーデータ作成###
[root@postest ~]# ls -l /var/lib/pgsql/data/pg_wal/
合計 49152
-rw------- 1 postgres postgres 16777216 6月 3 20:15 000000010000000000000007
-rw------- 1 postgres postgres 16777216 6月 3 20:16 000000010000000000000008
-rw------- 1 postgres postgres 16777216 6月 3 20:13 000000010000000000000009
drwx------ 2 postgres postgres 43 6月 3 20:15 archive_status
[root@postest ~]#
[root@postest ~]#
[root@postest ~]# ls -l /wal
合計 114704
-rw------- 1 postgres postgres 16777216 6月 3 19:59 000000010000000000000001
-rw------- 1 postgres postgres 16777216 6月 3 20:06 000000010000000000000002
-rw------- 1 postgres postgres 16777216 6月 3 20:07 000000010000000000000003
-rw------- 1 postgres postgres 16777216 6月 3 20:08 000000010000000000000004
-rw------- 1 postgres postgres 16777216 6月 3 20:11 000000010000000000000005
-rw------- 1 postgres postgres 16777216 6月 3 20:13 000000010000000000000006
-rw------- 1 postgres postgres 16777216 6月 3 20:15 000000010000000000000007
drwx------ 2 root root 16384 6月 3 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 6月 3 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 ~]$
参考
Discussion