0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】PostgreSQLのバックアップ(PITRは除く)

0
Posted at

論理バックアップと物理バックアップの違い

論理バックアップ
→ 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が指定時刻まで再生される
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?