jpug 沖縄支部セミナー資料(2013-04-27)

89
PostgreSQL バックアップ & リカバリ 入門 沖縄支部セミナー 2013-04-27 株式会社 メトロシステムズ 佐藤 千佳

Upload: chika-sato

Post on 28-Jun-2015

3.252 views

Category:

Technology


0 download

DESCRIPTION

2013年4月27日のJPUG 沖縄支部セミナーでの資料です。 この資料は、2013年2月23日のオープンソースカンファレンス2013 Tokyo/Spring のセッション「PostgreSQL バックアップ&リカバリ入門」での資料を追加・修正したものになります。

TRANSCRIPT

Page 1: JPUG 沖縄支部セミナー資料(2013-04-27)

PostgreSQLバックアップ & リカバリ 入門

沖縄支部セミナー

2013-04-27

株式会社 メトロシステムズ佐藤 千佳

Page 2: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 2

自己紹介

佐藤 千佳 (さとう ちか)

所属: 株式会社メトロシステムズ(東京・池袋)

Mail: [email protected]

PostgreSQL との関わり

2007 年ごろからPostgreSQL 機能調査、周辺ツールを含めた性能評価を実施

お知らせ

この資料は後日アップします

Page 3: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 3

アジェンダ

1.PostgreSQL の紹介

2.バックアップ&リカバリとは

3.PostgreSQLで使用可能なバックアップ&リカバリ

4.PostgreSQL のアーキテクチャ

5.PostgreSQL のバックアップ&リカバリ方法

6.ツールの紹介

Page 4: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

4

PostgreSQL の紹介

Page 5: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 5

PostgreSQL とは... (1/3)

代表的なオープンソースの ORDBMS

PostgreSQL ライセンスで配布

BSD ライセンスに類似

Linux をはじめほとんどの UNIX 系 OS で動く

Windows や Mac OS X でも動く

日本語サイトが充実している

最新版の日本語ドキュメントがすぐにリリースされる

活発な意見交換の場(ML/勉強会/懇親会という名の...)

皆さん親切 … 等

Page 6: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 6

PostgreSQL とは... (2/3)

日本語ドキュメントサイト

Page 7: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 7

PostgreSQL とは... (3/3)

PostgreSQLのポータルサイト「Let's Postgres」

Page 8: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 8

PostgreSQL とは... (3/3)

PostgreSQLのポータルサイト「Let's Postgres」

詳しくは Web で !

Page 9: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

9

バックアップ & リカバリとは

Page 10: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 10

バックアップ・リカバリとは...(1/2)

バックアップとは

不測の事態に備え、データベースの内容を別ファイルに保存しておくこと

物理バックアップ

データベースを構成するファイル群を物理的に別の媒体へコピーする

論理バックアップ

表の定義や格納されているデータなどをファイルに出力する

Page 11: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 11

バックアップ・リカバリとは...(1/2)

バックアップとは

データベースの内容を別ファイルに保存しておくこと

物理バックアップ

データベースを構成するファイル群を物理的に別の媒体へコピーする

バックアップ

データベース

DB1DB2

データベース

DB1DB2

バックアップ領域

Page 12: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 12

バックアップ・リカバリとは...(1/2)

データベース社員表を

バックアップ

--- 社員表テーブル定義CREATE TABLE 社員(・・・);

--- 社員表のデータ1 田中 男2 佐藤 女3 鈴木 女・・・

バックアップとは

データベースの内容を別ファイルに保存しておくこと

論理バックアップ

表の定義や格納されているデータなどをファイルに出力する

社員表の表定義と格納されていたデータがバックアップされる

Page 13: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 13

バックアップ・リカバリとは...(2/2)

リカバリとは

失ったデータをバックアップファイルを使って復旧すること

ユーザーによるオペレーションミス

メディア障害

システム障害

自然災害ディスクのミラーリングだけで安心していませんか ? ・ オペレーションミスは救えません ・ ミラーリングはバックアップではありません      … 等

Page 14: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

14

PostgreSQLで使用可能なバックアップ・リカバリ

Page 15: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 15

PostgreSQLで使用可能なバックアップ・リカバリ(1/3)

物理バックアップとリカバリ

設定ファイルから丸ごとバックアップできる!

コールドバックアップとリカバリコールドバックアップとリカバリ

論理バックアップとリカバリ

メジャーバージョンアップ時のデータ移行や、異なるCPUアーキテクチャ環境への移行にも使える!

ホットバックアップとリカバリホットバックアップとリカバリ

Page 16: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 16

PostgreSQLで使用可能なバックアップ・リカバリ(2/3)

物理バックアップとPITR

最新の状態から任意の時点まで、好みに合わせてリカバリできる!

ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

((PPoint-oint-IIn-n-TTimeime RRecoveryecovery))

Page 17: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 17

PostgreSQLで使用可能なバックアップ・リカバリ(3/3)

① ① コールドバックアップとリカバリコールドバックアップとリカバリ

② ② ホットバックアップとリカバリホットバックアップとリカバリ

③ ③ ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

Page 18: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

18

PostgreSQL のアーキテクチャ

Page 19: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 19

PostgreSQL アーキテクチャ 「超」入門(1/5)

アプリケーション 各種プロセス群

トランザクションログ

アーカイブログ

データベース・クラスタ$PGDATA

データベース

データベース

データベース

PostgreSQL

問い合わせ

書き込み

読み込み書き込み書き込み

Page 20: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 20

PostgreSQL アーキテクチャ 「超」入門(2/5)

データベース・クラスタのファイル構造の一部

$PGDATA

・・・ データベース・クラスタ

・・・ トランザクション・ログ格納ディレクトリ

・・・ パラメータ・ファイル

・・・ クライアント認証設定ファイル

データベース・クラスタで共有する テーブルの格納ディレクトリ

postmaster.pid

pg_hba.conf

postgresql.conf

pg_xlog/

global/

pg_tblspc/

base/

テーブルスペースへのシンボリック リンク格納ディレクトリ

・・・

・・・ データベース格納ディレクトリ

・・・

起動中のPostgreSQL のプロセスID 記録ファイル(サーバ起動時のみ存在)・・・

Page 21: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 21

PostgreSQL アーキテクチャ 「超」入門(2/5)

データベース・クラスタのファイル構造の一部

$PGDATA

・・・ データベース・クラスタ

・・・ トランザクション・ログ格納ディレクトリ

・・・ パラメータ・ファイル

・・・ クライアント認証設定ファイル

データベース・クラスタで共有する テーブルの格納ディレクトリ

postmaster.pid

pg_hba.conf

postgresql.conf

pg_xlog/

global/

pg_tblspc/

base/

テーブルスペースへのシンボリック リンク格納ディレクトリ

・・・

・・・ データベース格納ディレクトリ

・・・

・・・ 起動中のPostgreSQL のプロセスID 記録ファイル(サーバ起動時のみ存在)

Page 22: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 22

PostgreSQL アーキテクチャ 「超」入門(3/5)

データベース・クラスタのファイル構造の一部

$PGDATA

・・・ データベース・クラスタ

postmaster.pid

pg_hba.conf

postgresql.conf

pg_xlog/

global/

pg_tblspc/

base/・ データベースに対する変更履歴の記録ファイルを格納 ⇒一般的にトランザクションログとよばれている

・ PostgreSQL 界ではこのディレクトリに格納されているファイルを WAL (ワル)とよぶ ⇒Write Ahead Log の略

Page 23: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 23

PostgreSQL アーキテクチャ 「超」入門(1/5)

アプリケーション 各種プロセス群

pg_xlogアーカイブログ

データベース

データベース

データベース

PostgreSQL

問い合わせ

書き込み

読み込み書き込み書き込み

$PGDATA

Page 24: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 24

PostgreSQL アーキテクチャ 「超」入門(1/5)

アプリケーション 各種プロセス群

アーカイブログ

データベース

データベース

データベース

PostgreSQL

WALWAL

WAL

pg_xlog

$PGDATA

Page 25: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 25

PostgreSQL アーキテクチャ 「超」入門(1/5)

アプリケーション 各種プロセス群

アーカイブログ

データベース

データベース

データベース

PostgreSQL

WALWAL

WAL

pg_xlog

Page 26: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 26

PostgreSQL アーキテクチャ 「超」入門(4/5)

WAL(トランザクションログ)とアーカイブログ

WAL 1WAL 2

WAL 3

WAL 4

WAL 2WAL 3

WAL 4

WAL 5

これでは過去の変更ログが

なくなってしまう!!

上書き(回収)される

たまった WAL はPostgreSQL に不要と判断されると・・・

Page 27: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 27

PostgreSQL アーキテクチャ 「超」入門(4/5)

WAL(トランザクションログ)とアーカイブログ

WAL 1WAL 2

WAL 3

WAL 4

WAL 2WAL 3

WAL 4

WAL 5

WAL 1

これがアーカイブログ(WALアーカイブ)上書きされる前に

WAL をコピー!

Page 28: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 28

PostgreSQL アーキテクチャ 「超」入門(5/5)

各種プロセス群

データベース

データベース

データベース

PostgreSQL用語の整理

WAL をコピーしたもの

データベースへの変更ログ

WALWAL

WAL

WAL アーカイブ

コピーWALコピー

WAL コピーWAL

$PGDATA

pg_xlog

Page 29: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

29

PostgreSQL のバックアップ & リカバリ方法

Page 30: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 30

PostgreSQL のバックアップ & リカバリ方法

① ① コールドバックアップとリカバリコールドバックアップとリカバリ

② ② ホットバックアップとリカバリホットバックアップとリカバリ

③ ③ ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

Page 31: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 31

PostgreSQL のバックアップ & リカバリ方法

① ① コールドバックアップとリカバリコールドバックアップとリカバリ

② ② ホットバックアップとリカバリホットバックアップとリカバリ

③ ③ ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

Page 32: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 32

コールドバックアップとリカバリ(1/4)

バックアップの流れ

1.データベースを停止

2.$PGDATA を丸ごとコピー

$ pg_ctl stop -w -D $PGDATA

waiting for server to shut down.... doneserver stopped

$ rsync -av $PGDATA/ $BACKUP/pgdata

cpコマンド, tarコマンド, rsyncコマンド … 等

Page 33: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 33

コールドバックアップとリカバリ(2/4)

リカバリの流れ

1.データベースを強制終了

2.既存の$PGDATAを退避

3.バックアップファイルで$PGDATAを置き換える

$ pg_ctl stop -m immediate -D $PGDATA

waiting for server to shut down.... doneserver stopped

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

Page 34: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 34

コールドバックアップとリカバリ(3/4)

時間

$PGDATA

① 2013年3月31日バックアップ取得

② 2013年4月26日障害発生

この間のデータは失われる

③ $PGDATAをバックアップファイルで置き換える

2013年3月31日のデータ

$PGDATA

バックアップファイル

データベース停止

データベース起動

データベース起動

データベース停止

リカバリ時間

バックアップ取得時間

Page 35: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 35

コールドバックアップとリカバリ(4/4)

良いところ

手順がシンプル

データベース・クラスタ全体をバックアップした場合、他のバックアップ方法と比較して処理が短時間で済む

注意点

データベースを停止する必要がある

バックアップを取得したタイミングにしか復旧できない

バックアップ・リカバリ対象はデータベース・クラスタ全体(テーブル単位、データベース単位の操作はできない)

Page 36: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 36

PostgreSQL のバックアップ & リカバリ方法

① ① コールドバックアップとリカバリコールドバックアップとリカバリ

② ② ホットバックアップとリカバリホットバックアップとリカバリ

③ ③ ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

Page 37: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 37

ホットバックアップとリカバリ(1/10)

バックアップの流れ

1.データベースが起動していることを確認

2.PostgreSQL のツールの1 つ pg_dump または pg_dumpall コマンドでバックアップ

$ pg_ctl status

pg_ctl: server is running (PID: xxxxx)

$ pg_dump mydb > mydb_dump.sql

Page 38: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 38

ホットバックアップとリカバリ(2/10)

pg_dump と pg_dumpall の違い

論理バックアップには 2 つの方法がある

pg_dump

テーブル単位、データベース単位にバックアップ

pg_dumpall

データベース・クラスタに格納してある全てのデータベースをバックアップ

Page 39: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 39

ホットバックアップとリカバリ(3/10)

pg_dump と pg_dumpall の違い(つづき)

pg_dump には 4 種類のバックアップ形式がある

1. 平文形式SQL 文によるスクリプトファイルを作成(デフォルト)

2. カスタム形式バイナリ形式の圧縮されたバックアップを作成

$ pg_dump --format=plain mydb > mydb_dump.sql

$ pg_dump --format=custom mydb > mydb_dump.custom

Page 40: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 40

ホットバックアップとリカバリ(4/10)

pg_dump と pg_dumpall の違い(つづき)

3. ディレクトリ形式バイナリ形式のバックアップを作成テーブル単位で圧縮されたバックアップファイルを作成

4. tar 形式バイナリ形式のバックアップを作成テーブル単位でバックアップファイルを作成

$ pg_dump --format=directory mydb -f mydb_dump.directory

$ pg_dump --format=tar mydb > mydb_dump.tar

Page 41: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 41

ホットバックアップとリカバリ(5/10)

pg_dump と pg_dumpall の違い(つづき)

pg_dumpall のバックアップ形式は 1 種類

1. 平文形式SQL文によるスクリプトファイルを作成

$ pg_dumpall > mydb_dumpall.sql

Page 42: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 42

出力形式によるバックアップ所要時間比較

環境OS : RHEL6u1MEM : 2GBCPU : 2core/4threadDB サイズ(pg_database_size) : 約 488 MB

バックアップコマンド 出力形式 オプション名 所要時間(秒)

pg_dump

平文(SQL) p (plain) <def.> 15.94

カスタム c (custom) 51.10

tar t (tar) 16.03

Page 43: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 43

ホットバックアップとリカバリ(6/10)

リカバリの流れ

1.データベースが起動していることを確認

2.psql または pg_restore コマンドでリカバリ

$ pg_ctl status

pg_ctl: server is running (PID: xxxxx)

$ psql -f mydb_dump.sql

必要に応じて、データベース・クラスタやデータベースは事前に作成しておく

Page 44: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 44

ホットバックアップとリカバリ(7/10)

リカバリコマンドの違い

バックアップ形式によってリカバリ方法が異なる

平文形式で取得した場合 : psql コマンド

平文形式で以外で取得した場合 : pg_restore コマンド

$ pg_restore -C -d postgres < mydb_dump.custom

$ psql -f mydb_dump.sql

Page 45: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 45

ホットバックアップとリカバリ(8/10)

バックアップコマンド

バックアップ単位

出力形式リカバリコマンド

pg_dumpテーブル単位

データベース単位

平文(SQL) psql

カスタム

pg_restoreディレクトリ

tar

pg_dumpall 全てのデータベース 平文(SQL) psql

コマンド対応表

Page 46: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 46

ホットバックアップとリカバリ(9/10)

時間

$PGDATA

① 2013年3月31日バックアップ取得

② 2013年4月26日障害発生

この間のデータは失われる

③ psql または pg_restore コマンドでリカバリ

2013年3月31日のデータ

$PGDATA

バックアップファイル

リカバリ時間

バックアップ取得時間

Page 47: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 47

ホットバックアップとリカバリ(10/10)

良いところ

バックアップ取得時にデータベースを停止する必要がない

クライアント環境から実行できる

CPU アーキテクチャの異なるマシンにリカバリできる

PostgreSQL のメジャーバージョンアップに使用できる

データのみ、スキーマのみでのバックアップが可能

データベース単位、テーブル単位でバックアップが可能(pg_dumpのみ)

注意点

バックアップを開始したタイミングにしか復旧できない

他のバックアップ・リカバリと比較すると処理時間が長い

設定ファイルなどのバックアップが別途必要になる

Page 48: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 48

PostgreSQL のバックアップ & リカバリ方法

① ① コールドバックアップとリカバリコールドバックアップとリカバリ

② ② ホットバックアップとリカバリホットバックアップとリカバリ

③ ③ ポイント・イン・タイム・リカバリポイント・イン・タイム・リカバリ

Page 49: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 49

ポイント・イン・タイム・リカバリ(1/18)

バックアップファイル

ベースバックアップの流れ

時間

pg_stop_backup()pg_start_backup()

$PGDATA

WALデータベース

Page 50: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 50

ポイント・イン・タイム・リカバリ(2/18)

$ cat $PGDATA/postgresql.conf~~ 略 ~~wal_level = archive  # PostgreSQL9.0 ~ のパラメータarchive_mode = onarchive_command = '/bin/cp -i %p /mnt/server/archivedir/%f'

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

ベースバックアップの取得

① パラメータの変更

$PGDATA

WALデータベース

Page 51: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 51

ポイント・イン・タイム・リカバリ(2/18)

$ cat $PGDATA/postgresql.conf~~ 略 ~~wal_level = archive  # PostgreSQL9.0 ~ のパラメータarchive_mode = onarchive_command = '/bin/cp -i %p /mnt/server/archivedir/%f'

※ 注意 ※このパラメータを変更した場合、PostgreSQL の再起動が必要 !!

ベースバックアップの取得

① パラメータの変更

$PGDATA

WALデータベース

Page 52: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 52

ポイント・イン・タイム・リカバリ(3/18)

$ psql -c "SELECT pg_start_backup(label)"

pg_start_backup----------------- 0/13000020(1 row)

()の中はメモ。取得日時などに設定しておくと分かりやすい

ベースバックアップの取得

② バックアップの開始を記録する

$PGDATA

WALデータベース

Page 53: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 53

ポイント・イン・タイム・リカバリ(4/18)

$BACKUP/pgdata

$ rsync -av --delete --exclude=pg_xlog \ --exclude=postmaster.pid $PGDATA/ \ $BACKUP/pgdata

③ $PGDATA をコピー

ベースバックアップの取得

rsync での取得がオススメ

$PGDATA

WALデータベース

Page 54: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 54

ポイント・イン・タイム・リカバリ(5/18)

$BACKUP/pgdata

$ psql -c "SELECT pg_stop_backup()"

pg_stop_backup---------------- 0/130000A8(1 row)

④ バックアップの終了を記録する

ベースバックアップの取得

ベースバックアップ

$PGDATA

WALデータベース

Page 55: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 55

ポイント・イン・タイム・リカバリ(6/18)

ベースバックアップ

ベースバックアップの取得

時間

③ pg_stop_backup()① pg_start_backup()

$PGDATA

WALデータベース

② ベースバックアップ取得

Page 56: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 56

ポイント・イン・タイム・リカバリ(6/18)

ベースバックアップ

ベースバックアップの取得

時間

pg_stop_backup()pg_start_backup()

$PGDATA

WALデータベース

ベースバックアップ取得中もトランザクションは実行

Page 57: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 57

ポイント・イン・タイム・リカバリ(6/18)

ベースバックアップ

ベースバックアップの取得

時間

pg_stop_backup()pg_start_backup()

WAL 1 WAL 2$PGDATA

WALデータベース

ベースバックアップ取得開始後に発生した WAL

Page 58: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 58

ポイント・イン・タイム・リカバリ(6/18)

ベースバックアップの取得

時間

pg_stop_backuppg_start_backup

ベースバックアップ

+ WAL 1 WAL 2

このセットでpg_stop_backup

時点のデータ

Page 59: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 59

ポイント・イン・タイム・リカバリ(6/18)

ベースバックアップの取得

時間

pg_stop_backuppg_start_backup

ベースバックアップ

+ WAL 1 WAL 2

このセットでpg_stop_backup

時点のデータ

ベースバックアップだけでは不十分!!

Page 60: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 60

デモ

~ ベースバックアップ取得編 ~

Page 61: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 61

ポイント・イン・タイム・リカバリ(7/18)

ベースバックアップの取得について

PostgreSQL 9.1 から pg_basebackup コマンドを使ってベースバックアップの取得!!

コマンド 1 つでベースバックアップを取得

クライアント環境からも実行可能

$ pg_basebackup -h <接続先> -D $PGDATA --progress

Page 62: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 62

ポイント・イン・タイム・リカバリ(7/18)

ベースバックアップの取得について

PostgreSQL 9.1 から pg_basebackup コマンドを使ってベースバックアップの取得!!

コマンド 1 つでベースバックアップを取得

クライアント環境からも実行可能

$ pg_basebackup -h <接続先> -D $PGDATA --progress

スーパーユーザまたは

REPLICATION権限が必要

max_wal_sendersパラメータ変更

Page 63: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 63

デモ 2

~ ベースバックアップ取得 ~

pg_basebackup 編

Page 64: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 64

ポイント・イン・タイム・リカバリ(8/18)

PITR

時間

WAL アーカイブ 2013年4月26日障害発生

2013年3月31日バックアップ取得

ベースバックアップ

WAL 1 WAL 2 WAL 3 WAL 4

WAL 1 WAL 2 WAL 3

$PGDATA

WALデータベース

Page 65: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 65

ポイント・イン・タイム・リカバリ(9/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

① データベースの強制終了

$PGDATA

WALデータベース

$ pg_ctl stop -m immediate -D $PGDATA

waiting for server to shut down.... doneserver stopped

2013年3月31日

Page 66: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 66

ポイント・イン・タイム・リカバリ(10/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

$PGDATA

WALデータベース

2013年3月31日

② アーカイブされる前のWALをバックアップ

$BACKUP/pgxlog

WAL 4

$ rsync -av $PGDATA/pg_xlog/ $BACKUP/pgxlog

WAL 1 WAL 2 WAL 3 WAL 4

Page 67: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 67

ポイント・イン・タイム・リカバリ(11/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

$PGDATA

WALデータベース

2013年3月31日 $BACKUP/pgxlog

WAL 4

$ tar cvfh $SAVE/pgdata_old.tar $PGDATA$ rm -rf $PGDATA

③ 既存のデータベース・クラスタを退避後 破棄する

Page 68: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 68

ポイント・イン・タイム・リカバリ(12/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

$PGDATA

WALデータベース

2013年3月31日 $BACKUP/pgxlog

WAL 4

$ rsync -av $BACKUP/pgdata/* $PGDATA

④ $PGDATAをベースバックアップで  置き換える

2013年3月31日時点のデータベース

Page 69: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 69

ポイント・イン・タイム・リカバリ(13/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

$PGDATA

データベース

2013年3月31日 $BACKUP/pgxlog

WAL 4

$ rm -rf $PGDATA/pg_xlog$ rsync -av $BACKUP/pgxlog/pg_xlog $PGDATA

⑤ 手順②で取得したWALファイルを $PGDATA/pg_xlog 配下に配置

WAL4

Page 70: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 70

ポイント・イン・タイム・リカバリ(13/18)

PITR

WAL アーカイブ

ベースバックアップ WAL 1 WAL 2 WAL 3

$PGDATA

データベース

2013年3月31日 $BACKUP/pgxlog

WAL 4

$ rm -rf $PGDATA/pg_xlog$ rsync -av $BACKUP/pgxlog/pg_xlog $PGDATA

⑤ 手順②で取得したWALファイルを $PGDATA/pg_xlog 配下に配置

WAL4

ベースバックアップに古い

pg_xlogが含まれている

場合は事前に削除する

Page 71: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 71

ポイント・イン・タイム・リカバリ(14/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL

$BACKUP/pgxlog

WAL 4

⑥ recovery.conf の作成

$ cat $PGDATA/recovery.conf~~ 略 ~~

restore_command = 'cp /mnt/server/archivedir/%f "%p" '

Page 72: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 72

ポイント・イン・タイム・リカバリ(14/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL

$BACKUP/pgxlog

WAL 4

⑥ recovery.conf の作成

$ cat $PGDATA/recovery.conf~~ 略 ~~

restore_command = 'cp /mnt/server/archivedir/%f "%p" '

Page 73: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 73

ポイント・イン・タイム・リカバリ(14/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL

$BACKUP/pgxlog

WAL 4

⑥ recovery.conf の作成

$ cat $PGDATA/recovery.conf~~ 略 ~~

restore_command = 'cp /mnt/server/archivedir/%f "%p" '

recovery_target_time パラメータを指定することでリカバリしたい”任意の時刻”を指定することもできる

Page 74: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 74

ポイント・イン・タイム・リカバリ(15/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

$BACKUP/pgxlog

WAL 4

⑦ PostgreSQL の起動

$ pg_ctl start -D $PGDATA

server startingデータベース

WAL4

Page 75: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 75

PostgreSQL 起動後の内部の動き

ポイント・イン・タイム・リカバリ(15/18)

PITR

WAL アーカイブ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL4

2013年3月31日時点のデータベース

Page 76: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 76

PostgreSQL 起動後の内部の動き

ポイント・イン・タイム・リカバリ(15/18)

PITR

WAL アーカイブ

$PGDATA

データベース

WAL4

WAL 1 WAL 2 WAL 3

①ベースバックアップ取得以降に発生した WAL アーカイブを適用(recovery.conf で指定)

Page 77: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 77

PostgreSQL 起動後の内部の動き

ポイント・イン・タイム・リカバリ(15/18)

PITR

WAL アーカイブ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL4

WAL3 まで適用されたデータベース

Page 78: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 78

PostgreSQL 起動後の内部の動き

ポイント・イン・タイム・リカバリ(15/18)

PITR

WAL アーカイブ

WAL 1 WAL 2 WAL 3

$PGDATA

データベース

WAL3 まで適用されたデータベース

②アーカイブされなかった最新のWAL を適用

WAL4

Page 79: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 79

ポイント・イン・タイム・リカバリ(16/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

$BACKUP/pgxlog

WAL 4

⑧ リカバリ完了

データベース

WAL4

リカバリが完了し、データベースに接続できるようになると、PostgreSQL のログに以下のメッセージが出力される

LOG: archive recovery completeLOG: database system is ready to accept connections

Page 80: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 80

ポイント・イン・タイム・リカバリ(17/18)

PITR

WAL アーカイブ

ベースバックアップ

WAL 1 WAL 2 WAL 3

$PGDATA

$BACKUP/pgxlog

WAL 4

⑨ データベースの内容を確認データベース

WAL4

Page 81: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 81

デモ 3

~ PITR 編 ~

Page 82: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 82

ポイント・イン・タイム・リカバリ(18/18)

良いところ

サービスを継続したままベースバックアップが取得できる

指定した任意の時刻まで復旧できる

障害発生直前の”最新””最新”の状態まで復旧できる

注意点

手順が複雑

WALアーカイブを取得している必要がある

バックアップ・リカバリ対象はデータベース・クラスタ全体(テーブル単位、データベース単位の操作はできない)

Page 83: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 83

コールドバックアップとリカバリ

ホットバックアップとリカバリ

ポイント・イン・タイムリカバリ

バックアップタイプ物理バックアップ

(オフライン)論理バックアップ

物理バックアップ(オンライン)

バックアップ方法cpコマンド, tarコマンド, rsyncコマンド, ストレージスナップショットなど

pg_dump / pg_dumpall

(1) pg_start_backup()(2) cpコマンド, tarコマンド, rsyncコマンドなど(3) pg_stop_backup()/ pg_basebackup(PostgreSQL9.1~)

リカバリ方法 特になし pg_restore / psql (PITR 機能)

どこまで戻せるか バックアップ時点 バックアップ時点 任意の時点

バックアップの最小単位

データベース・クラスタ テーブル(pg_dump) データベース・クラスタ

WALアーカイブ 不要 不要 必要

バックアップ中のデータベースの停止

必要 不要 不要

クライアント環境からの実行

不可 可能不可

(pg_basebackup可能)

まとめ

Page 84: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 84

コールドバックアップとリカバリ

ホットバックアップとリカバリ

ポイント・イン・タイムリカバリ

バックアップタイプ物理バックアップ

(オフライン)論理バックアップ

物理バックアップ(オンライン)

バックアップ方法cpコマンド, tarコマンド, rsyncコマンド, ストレージスナップショットなど

pg_dump / pg_dumpall

(1) pg_start_backup()(2) cpコマンド, tarコマンド, rsyncコマンドなど(3) pg_stop_backup()/ pg_basebackup(PostgreSQL9.1~)

リカバリ方法 特になし pg_restore / psql (PITR 機能)

どこまで戻せるか バックアップ時点 バックアップ時点 任意の時点

バックアップの最小単位

データベース・クラスタ テーブル(pg_dump) データベース・クラスタ

WALアーカイブ 不要 不要 必要

バックアップ中のデータベースの停止

必要 不要 不要

クライアント環境からの実行

不可 可能不可

(pg_basebackup可能)

まとめ

さまざまな制約事項の中から、そのシステムにあった

バックアップ・リカバリ方法を !!

Page 85: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

85

ツールの紹介

Page 86: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 86

pg_rman

PostgreSQL のバックアップとリカバリを管理するツール

PostgreSQL の外部ツール

Google Code からダウンロード可能

複雑な PITR の手順をコマンド 1 つで簡単に実行

増分バックアップや世代管理も可能

Linux などの UNIX 系 OS で動きます

Page 87: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 87

pg_rman のバックアップ・リストアの流れ

事前準備

$ pg_rman init -B $BACKUP -D $PGDATA

$ pg_rman backup --backup-mode=full --with-serverlog$ pg_rman validate

$ pg_ctl stop -m immediate -D $PGDATA$ pg_rman restore$ pg_ctl start -D $PGDATA

バックアップ

リストア(&リカバリ)

Page 88: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会 88

参考文献書籍

PostgreSQL 完全攻略ガイド (技術評論社)

オンラインドキュメント類

PostgreSQL 9.2.0文書

http://www.postgresql.jp/document/9.2/html/index.html

Let's Postgres

バックアップの概要と方式一覧http://lets.postgresql.jp/documents/technical/backup

ストリーミング・レプリケーション

http://lets.postgresql.jp/documents/technical/replication/

オープンソースカンファレンス講演資料http://lets.postgresql.jp/documents/report/osc2011-kansai/talks

pg-rman

http://code.google.com/p/pg-rman/wiki/readme_ja

Page 89: JPUG 沖縄支部セミナー資料(2013-04-27)

日本PostgreSQLユーザ会

89

ご清聴ありがとうございました