バックアップとリストア──転ばぬ先の杖
最終章は運用についてです。
運用でまず重要なのは,
そのあとの節では,
バックアップの種類
バックアップには次の種類があります。
- 論理バックアップ
- SQLをそのまま保存する。無停止かつお手軽に実施できる。バックアップした時点までしか戻せない
- 物理バックアップ
- サーバを止めてデータファイルをコピーする。多くの場合,
論理バックアップより高速に実施できる。バックアップした時点までしか戻せない - オンラインバックアップとPITR
(Point In Time Recovery) - 無停止でデータファイルとWALアーカイブをコピーする。最新状態までの任意の時点に戻せる。運用コストは高くなる
論理バックアップは一般的に,rsync
などでファイルバックアップすればよく,
バックアップした直後から最新状態までの任意の時点に戻すには,
このようにそれぞれ,
リストアの設計
リストアを設計するうえでのポイントは稼働率です。表1のように,
表1 稼働率
稼働率 | 年間停止時間 | バックアップとリストアの方針 |
---|---|---|
90% | 36. | 月に複数回のメンテナンス時間を設けることができる。論理バックアップや物理バックアップとリストアで十分に対応できる |
99% | 3. | オンプレミスなら予備のマシンが必要になる。大規模なデータの場合はリストアの所要時間の把握などが必要になる |
99. | 8. | 法定停電や24時間365日対応などシステム以外の部分にも影響が出る99. |
99. | 5分間 | レプリケーションを利用した, |
99. | 32秒間 | 無停止で運用する専用サーバや, |
稼働率を高くするにはオンラインで行えるバックアップは必須ですし,
自分たちの稼働率を決めて,
pg_ dump──オンラインで論理バックアップ
一番スタンダートなのは論理バックアップツールであるpg_
- プレーンテキスト形式
(SQL) - カスタムアーカイブ形式
(圧縮したバイナリ) - ディレクトリ形式
(表単位で圧縮したバイナリ) - TAR形式
(表単位のバイナリ)
お勧めは,
カスタムアーカイブ形式でのバックアップとリストアは次のように実行します。
カスタムアーカイブ形式でのバックアップ
$ pg_dump -Fc データベース名 -U ユーザー名 \
-h ホスト名 -f /tmp/dump.custom
リストア
$ pg_restore -d データベース名 /tmp/dump.custom
このようにDBの停止を伴わずコマンド一つでバックアップし,
pg_ basebackup──PITRのためのオンラインバックアップ
pg_
pg_postgresql.
を次のように変更してWALアーカイブモードを有効にしておく必要があります。
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /usr/local/pgsql/backup/%f
&& cp %p /usr/local/pgsql/backup/%f'
wal_
pg_
具体的なバックアップとリストアの方法は,
PostgreSQLの停止
# service postgresql stop
バックアップ
$ pg_basebackup -D 出力先 -X s -P \
-h ホスト名 -U ユーザー名
アーカイブ
$ pg_basebackup -D 出力先 -X s -P \
-h ホスト名 -U ユーザー名
ここからリストア手順。まず最新のWALを避難
$ rsync -av $PGDATA/pg_wal/ $BACKUP_WAL
既存のデータを避難し,
$ rsync -av $PGDATA $BACKUP/old_pgdata
$ rm -rf $PGDATA
pg_
$ rsync -av $BACKUP/pgdata/* $PGDATA
古いWALを削除し,
rm -rf $PGDATA/pg_wal
$ rsync -av $BACKUP_WAL $PGDATA/pg_wal/
WALアーカイブの場所と復元ポイントの設定
$ vi recovery.conf
restore_command = 'cp /usr/local/pgsql/backup/%f "%p"'
recovery_target_time = '2018/12/01 00:47:00'
PostgreSQLの起動
# service postgresql start
リストア時には,
recovery.
で指定しているrestore_
このようにpg_
pg_ rman──PITRを助けてくれるツール
「PITRをしたいけどリストア手順が多くて難しい……」
pg_
バックアップ
# pg_rman backup --backup-mode=full \
--compress-data --progress
PostgreSQLの停止
# service postgresql stop
リストア
# pg_rman restore \
--recovery-target-time "2018/12/01 00:47:00"
PostgreSQLの起動
# service postgresql start
バックアップをより詳しく知りたい方へ
チュートリアルの動画