kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

PostgreSQLのバックアップ覚えがき

PostgreSQLのバックアップは3種類

  • コールドバックアップ
  • ホットバックアップ
  • オンラインバックアップとポイントインタイムリカバリ(PITR)

コールドバックアップ

特徴

  • 物理バックアップとも言われる
  • $PG_DATA のファイルをまるまるコピーする方法

メリット

  • 方法がシンプルなので、手順もシンプル
  • ホットバックアップより、バックアップもリストアも高速

デメリット

  • DBの停止が必要
  • 全DBのバックアップしかできない
  • バックアップしたところまでしか、リストアできない

手順

rsync を利用する(特にPostgreSQL由来のコマンドは使用しない)

  • それぞれ、PostgreSQLを停止してから行うこと

バックアップ

  • $BACKUP は、バックアップファイル格納PATH
$ async -av $PGDATA/ $BACKUP/pgdata

リストア

$ rm -rf $PGDATA
$ async -av $BACKUP/pgdata $PGDATA/ 

ホットバックアップ

特徴

  • 論理バックアップとも言われる
  • 現状のDBをSQLに変換して保存する

メリット

  • DBを停止せずにバックアップが可能
  • DBやテーブル単位のバックアップが可能
  • コマンド1つで実行可能なため手順がシンプル

デメリット

  • コールドバックアップより、バックアップもリストアも時間がかかる
  • バックアップしたところまでしか、リストアできない

手順

pg_dump コマンドを実行する

  • pg_dumpコマンドは以下の形式でdumpが可能
    • プレーンテキスト(SQL)
    • カスタムアーカイブ(圧縮したバイナリ)
    • ディレクトリ(テーブル単位で圧縮したバイナリ)
    • TAR形式(テーブル単位のバイナリ)
  • カスタムアーカイブが、サイズが小さいけど、いざとなったらSQLに変換もできるのでオススメ

バックアップ

リモートからもバックアップ可能

  • オプション -Fc はカスタムアーカイブ形式の指定
$ pg_dump -Fc ${database_name} -U ${user_name} -h ${host_name} -f $BACKUP/dump.custom

リストア

$ pg_restore -d ${database_name} $BACKUP/dump.custom

オンラインバックアップとポイントインタイムリカバリ(PITR)

特徴

  • バックアップデータと、元DBのWALを使用してリカバリを行う
  • PITRとは、オンラインバックアップから現在までの任意の時間の状態でリカバリできる仕組み(すごい!

メリット

  • オンラインバックアップ開始〜最新状態の任意の時刻の状態に復旧可能

デメリット

  • 手順/運用が複雑(サードパーティツールである程度緩和可能)
  • WALアーカイブが必要
    • その分CPUリソースも、ストレージも食う
  • 元DBのWALアーカイブと、WALが必要
    • WALは必要が無くなると、別の情報に上書きされてしまう
    • そのため、不要になったWALをアーカイブ領域に保存する必要がある → それがWALアーカイブ

手順

ポイント

  • ベースバックアップと、マスタにあるWALアーカイブの組み合わせで復旧を行う

手順

(PostgreSQLを停止した状態で実施する)

  1. WALアーカイブを保存するように設定
  2. ベースバックアップの実行
  3. ベースバックアップからの復旧
  4. recovery.conf の設定(PITRの設定)

WALアーカイブを保存するように設定

postgresql.conf に以下の設定をする

wal_level = archive
archive_mode = on
archive_command = 'test ! -f /usr/local/pgsql/backup/%f && cp %p /usr/local/pgsql/backup/%f'
  • wal_level : WALの保存レベル。以下の3種類がある
    • minial : クラッシュまたは即時停止から回復するのに必要な情報のみ書き出す(デフォルト)
    • replica : WALアーカイブに対応。ストリーミングレプリケーションに必要な情報も追加
      • 9.6の時に、archivehot_standby という別々の設定が統一された
    • logical : ロジカルレプリケーションをサポートするのに必要な情報も追加
  • archive_mode : WALアーカイブを許可する設定。デフォルトOFF
    • on にすると、アーカイブプロセスが立ち上がるようになる
  • archive_command : WALを破棄する時に実行されるコマンド
    • %p はバックアップすべきWALのパス。 %f はWALファイル名
    • 自前でコマンドを用意する必要があるんだ...

ベースバックアップの実行

$ pg_basebackup -D $BACKUP -F t -x -z
  • -F: ファイルフォーマットの指定。t はtar形式の保存。デフォルトは p でプレーンテキストで保存される
  • -z : 出力ファイルをzip圧縮する
  • -x : ベースバックアップ作成中、出力ファイルの更新を止める(メモリを食うので注意

ベースバックアップからの復旧

既存のデータからWALだけ避難

$ mv $PGDATA/pg_wal/ $BACKUP_WAL

既存のデータは不要なので移動

$ mv $PGDATA/pg_wal/  ${適当なバックアップ先}

ベースバックアップからの復旧

(tar.gz を解凍してから)

$ cp $BACKUP/pgdata/* $PGDATA

WALを最新のものに変更

(ベースバックアップのWALは古いので消す)

$ rm -rf  $PGDATA/pg_wal/
$ cp $BACKUP_WAL $PGDATA/pg_wal

recovery.conf の設定

restore_command = 'cp /usr/local/pgsql/backup/%f %p'
recovery_target_time = '2018/12/01 00:47:00'
  • restore_command : archive_command と逆に、WALアーカイブからcopyするコマンドを設定
  • recovery_target_time : PITRしたい場合、その時刻を設定する
    • PITRが不要な場合はこの行は不要

参考

www.slideshare.net

WEB+DB PRESS Vol.108

WEB+DB PRESS Vol.108

  • 作者: 中野暁人,山本浩平,大和田純,曽根壮大,ZOZOTOWNリプレースチーム,権守健嗣,茨木暢仁,松井菜穂子,新多真琴,laiso,豊田啓介,藤原俊一郎,牧大輔,向井咲人,大島一将,上川慶,末永恭正,久保田祐史,星北斗,池田拓司,竹馬光太郎,粕谷大輔,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/12/22
  • メディア: 単行本
  • この商品を含むブログを見る

物理バップアップの概要 | Let's Postgres

blog.poppypop.mydns.jp

pg_basebackup

19.5. ログ先行書き込み(WAL)