[pgsql-jp: 36957] Re: WAL の*.backupファイルは不要か?

Katsuhiko Okano k_okano @ po.ntts.co.jp
2006年 4月 3日 (月) 13:45:53 JST


岡野です。


> この制御ファイルは、pg_xlogディレクトリ以外の$PG_DATAディレクトリ
> 内にあるのでしょうか。要するに、その制御ファイル(チェックポイント
> のデータ)は、バックアップしたディレクトリ内に含まれているのでしょ
> うか。そうであるならば、明示的にチェックポイントを記述している
> *.backup ファイルは無くても構わないとならないでしょうか。

バックアップはどうやって取得する想定でしょうか。
いわゆるオンラインバックアップ($PGDATA配下とアーカイブされたWALファイルを
保管しておく方法)でしょうか?

制御ファイルは$PGDATA/global/pg_control です。
$PGDATA配下を丸ごとコピーすれば、その中に含まれます。
(8.0.3のマニュアルの「第 49章データベースの物理的な格納」もご参照ください)
制御ファイル(チェックポイントがいつなのか)がどこまで信頼できるかは前のメールの
とおりです。

最初のメールで中井さんが書かれたような状態
(チェックポイントとバックアップ履歴ファイルの取得時点が違っている状態)
にならないためにも、$PGDATA配下を丸ごとコピーする方法をすすめます。
#最新のデータは記録されていても、直前のバックアップとその前のバックアップ
#の間の変更が記録されていないのはなぜ?と悩まなくてすみます(^_^;)。


> > しかし、pg_start_backup('LABEL')を呼び出した後に誰かが手動で
> > CHECKPOINTを実行すると、制御ファイルのチェックポイントが書き換わります。
> > バックアップ履歴ファイルは、pg_start_backup時のチェックポイントのままです。
> > ファイルコピー中で、一部のファイルだけコピーされていたタイミングに実行され
た場
> > 合には
> > バックアップ履歴ファイルがないとおかしな事になる可能性があるのではないでし
ょう
> > か。
> 
> そう、そこが心配なところです。例えば、最新の世代のデータのバック
> アップが壊れていたときに、一つ前の世代のバックアップデータが使える
> かどうかを知りたいのです。一つ前の世代のバックアップをとったときの
> *.backupは、最新の世代のバックアップを取ったときに無くなっています。

8.0.3のマニュアルの「22.3. オンラインバックアップとポイントインタイムリカバリ
(PITR)」
には、
>オンラインバックアップを使用して復旧を成功させるためには、少なくともバックア
ップの
>開始時点まで遡る、連続した一連の保管済みWALファイルが必要です。
とあります。
・ある時点の(整合性の取れた)バックアップデータ
・上記のバックアップ時点〜復旧させたい時点までの連続したWALファイル
が残っていれば復旧できるでしょう。


> > また、バックアップ履歴ファイルにはユーザーの指定したバックアップラベル
> > が入っています。
> > (イレギュラーな運用が発生して)どのバックアップファイル群を使ってリカバリ
> > するかを人間が判断しなければならない状況では、
> > ラベルファイルにある情報(例えば、不定期バックアップの理由だとか
> > このバックアップには一部しか含まれていないとか)が役に立つと思います。
> 
> バックアップしたデータベースの中に、チェックポイントのデータが
> 含まれていれば、ユーザは何も気にせずバックアップデータとWAL
> ファイルとでリカバリできるとうれしいです。唯一、気にしなければ

言葉づかいが一般的ではなかったので、説明させてください。
オンラインバックアップの動作は以下の流れだと思っています。
(1)pg_start_backup('LABEL')で$PGDATA/backup_label が作成されます。(ラベルファ
イル)
  このタイミングでチェックポイントが発生し、
  そのチェックポイントの位置やバックアップ開始時刻等が含まれます。
(2)$PGDATA配下を丸ごとコピーすると、上記ファイルはその中に含まれます。
(3)pg_stop_backup()で上記ファイルが削除され、そのコピーに情報追加したものがpg_
xlogにコピーされます
  (ファイル名の例:000000010000000000000001.000FD808.backup)
  このファイルにはバックアップ終了時刻等が含まれます。(バックアップ履歴ファ
イル)

よって、どの世代のバックアップにも、
・ただ一つのラベルファイル $PGDATA/backup_label
・0個以上のバックアップ履歴ファイル pg_xlog配下の*.backupファイル
 (またはアーカイブログを格納するディレクトリ配下)
が含まれるはずです。
#8.0.3のソースの src/backend/access/transam/xlog.cの
#pg_start_backup関数、pg_stop_backup関数を参照ください。
リカバリ時は、ただ一つしかないラベルファイルを見て
どのバックアップファイル群を使ってリカバリすべきか判断できると思います。


> ならないのは、WALファイルにバックアップしたときからのログが
> すべて含まれているかどうかだけなら、気楽にリカバリできます。

そうですね。バックアップ以降のログが全て含まれている事は大切ですね。
リカバリまわりはケース・バイ・ケースなので、手順書を作っておいたうえで
その手順書でリハーサルもしておくべきです。


> 
> > ちなみに、PostgreSQL8.1からは、
> > pg_stop_backup()を実行した時に古い*.backupファイルを削除するようにしました。
> > (Bruce) 
> > とリリースノートにあります。
> 
> とすると前述のように最新のバックアップデータが壊れていた場合、
> 一つ前の世代のバックアップデータを使うには、一工夫必要に
> なってしまいます。
> 
> チェックポイントは、データベースに記録されているから、
> *.backupファイルは無くても大丈夫だよと、言ってもらえるのを
> 期待したんですが。:-)
> 逆に言うと、チェックポイントがバックアップされるデータに
> 含まれているのであれば、非常に便利というかありがたいのですが。
> 

オンラインバックアップ時点のチェックポイントは
ラベルファイル($PGDATA/backup_label)に記録されています。

ラベルファイルや*.backupファイルは、無いと面倒が増えますし、
バックアップ取得スクリプトは一度作ったらあまり変更しないと思うので、
取っても大きな負担にはならないよ。と言えると思います:-)。
----------------------------------------
Katsuhiko Okano
k_okano at po.ntts.co.jp
NTT Sofrware Corp. (division "NBRO-PT4")



pgsql-jp メーリングリストの案内