論理バックアップと物理バックアップの違い
論理バックアップ
→ DBの内容を論理的に取り出す
→ pg_dump / pg_dumpall
物理バックアップ
→ PostgreSQLのデータファイルをそのままバックアップ
→ pg_basebackup など
論理バックアップ
データベースをバックアップ
Plain SQL方式
# バックアップ
pg_dump -d <復元元データベース名> -f <バックアップファイル名>.sql
# 復元
createdb <復元先データベース名>
psql -d <復元先データベース名> -f <バックアップファイル名>.sql
custom方式
# バックアップ
pg_dump -Fc -d <復元元データベース名> -f <バックアップファイル名>.dump
# 復元
createdb <復元先データベース名>
pg_restore -d <復元先データベース名> <バックアップファイル名>.dump
-f → ファイルを指定
-d → データベースを指定
-Fc → Custom形式
データベースクラスターをバックアップ
pg_dumpallコマンドで全体バックアップを作成する。
・PostgreSQLクラスタ全体をバックアップ
・全データベース + ロールなどを含む
・出力は Plain SQL形式
・復元は psql を使う
# 全体をバックアップ
pg_dumpall -f <バックアップファイル名>.sql
# 全体を復元
psql -d postgres -f <バックアップファイル名>.sql
custom形式のデータベースクラスターのバックアップ
次のようなコマンドを用いて、疑似的に実現させる。
pg_dump -Fc -d db1 -f db1.dump # db1のcustom形式バックアップ
pg_dump -Fc -d db2 -f db2.dump # db2のcustom形式バックアップ
pg_dumpall --globals-only -f globals.sql # クラスタ全体で共有する情報
物理バックアップ
物理バックアップは、pg_dump のようにSQLとして保存するのではなく、PostgreSQLのデータファイルそのものをバックアップする方式。
物理バックアップの特徴
・PostgreSQLクラスタ全体が対象
・テーブル単位やDB単位ではなく、基本的にクラスタ単位
・大量データでは論理バックアップより高速になりやすい
・復旧時もクラスタ全体を戻す用途に向いている
・PostgreSQLのバージョン依存が強い
pg_basebackup
物理バックアップでは、代表的に pg_basebackup を使う。
pg_basebackup -D <バックアップ先ディレクトリ> -Fp -X stream -P
-D → バックアップ先ディレクトリ
-Fp → plain形式(ディレクトリとして保存)
-X stream → WALも同時に取得
-P → 進捗を表示
バックアップから復旧までの流れ(PITRなし)
# 0. 平常時にバックアップ作成
pg_basebackup -D /backup/base
# ↓ 障害発生 ↓
# 1. PostgreSQLを停止
pg_ctl stop -D /var/lib/postgresql/data
# 2. 壊れたデータディレクトリを退避
mv /var/lib/postgresql/data /var/lib/postgresql/data_broken
# 3. バックアップをデータディレクトリとして戻す
cp -a /backup/base /var/lib/postgresql/data
# 4. 所有者をPostgreSQL実行ユーザーに戻す
chown -R postgres:postgres /var/lib/postgresql/data
# 5. PostgreSQLを起動
pg_ctl start -D /var/lib/postgresql/data
# 6. 接続確認
psql -d postgres
WAL
物理バックアップを理解するうえで重要なのが WAL。
WAL = Write-Ahead Logging
データファイルを書き換える前に、
変更内容をログへ記録する仕組み。
イメージ:
SQL実行
↓
WALへ記録
↓
データファイルへ反映
物理バックアップでは、
ベースバックアップ
+
WAL
を組み合わせることで、より正確な復旧ができる。
PITR
WALを利用すると、特定時点まで戻すこともできる。
PITR
= Point-In-Time Recovery
= 指定した時刻まで復旧する仕組み
例:
10:00 ベースバックアップ
10:00〜15:00 WALを保存
14:37に誤操作
→ 14:36:59まで復旧
論理バックアップとの違い
| 項目 | 論理バックアップ | 物理バックアップ |
|---|---|---|
| 代表コマンド | pg_dump |
pg_basebackup |
| 対象 | DB・テーブル単位も可能 | クラスタ全体 |
| 保存内容 | SQLや論理データ | 実際のデータファイル |
| 一部だけ復元 | しやすい | 基本的に向かない |
| 別バージョンへの移行 | しやすい | 向かない |
| 大規模DB | 遅くなりやすい | 向いている |
| PITR | 基本できない | WALと組み合わせて可能 |
PITRの手順
内容は複雑なので、今回は手順のみ示す。
① WALアーカイブを有効化
② ベースバックアップを取得
③ WALを継続保存
④ 障害発生
⑤ PostgreSQL停止
⑥ ベースバックアップをPGDATAへ戻す
⑦ restore_commandと復旧目標時刻を設定
⑧ recovery.signalを作成
⑨ PostgreSQL起動
⑩ WALが指定時刻まで再生される