2017-05-28

PostgreSQLのバックアップ2

 前回の続きで、今回はPostgreSQLの物理バックアップについて記載します。


1.論理バックアップ
2.物理バックアップ ←今回


2.物理バックアップ
 PostgreSQLのデータベースの実体はファイルの集まりです。このファイル自体をコピーするのが物理バックアップです。

 PostgreSQLを起動した状態で行うのがオンライン・バックアップ、PostgreSQLを停止させた状態で行うのがオフライン・バックアップです。

1)特徴
 ・バックアップサイズが大きい
 ・バックアップ時間が長い
 ・リカバリ時間は短い
 ・業務影響大(方法によっては小)
 
 物理バックアップは、DBを停止する必要がある(オンラインバックアップ)ため、業務に対する影響は大きいです。また、バックアップサイズが大き目で、ストレージを圧迫する影響は大です。基本的にはファイルのバックアップなので、リストアにはあまり時間がかかりません。

2)バックアップ方法

①オフラインバックアップ

 PostgreSQLは停止しているので、データベースの実体であるファイルが更新されることはありません。そのため、バックアップするのはコピーコマンドを使ってPostgreSQLのデータが格納されたディレクトリごとコピーするだけです。高価なストレージを使っているなら、スナップショット機能を利用することも可能です。
 バックアップしたデータをリストアするには、コピーしたデータを使ってPostgreSQLを起動します。
②オンラインバックアップ
 PostgreSQLが起動しているので、データベースのファイルへの更新が行われています。そのため、単純にファイルをコピーするだけではだめです。コピー中にファイルが更新された分もカバーする必要があります。
PostgreSQLの場合、トランザクションログであるWALを使ってカバーします。
即ち、バックアップを使ってリカバリするには、
 ①バックアップしたデータを用意する
 ②バックアップ中に発生したWALも用意する
 ③バックアップしたデータを元にPostgreSQLを起動し、バックアップ中に発生した更新処理をWALから読みだし、未反映な処理をデータに反映する
 といった手順となります。
 ③の部分はPostgreSQLが自動でやってくれるので、①と②のデータをバックアップとして取得しておけば良いです。
 ①のデータは、オフライン・バックアップの時と同じくコピーコマンドを使ってバックアップします。②のデータはWALアーカイブという形で取得しておきます。
 WALファイルはデフォルト設定では直近の一定数しか保存されず、古くなったものは削除もしくは再利用(上書き)されていきます。そのため、リカバリに使えるようにWALファイルを別の場所に保存しておく必要があります。
 「postgresql.conf」に設定をしてPostgreSQLを起動すれば、別の場所に保存してくれます。
 wal_level = archive # リカバリに使える情報を保存するようにminimal以外の値にしておく
archive_mode = on   # PostgreSQLによるWALアーカイブ処理を有効にする
archive_command = 'cp %p /archive/%f'  # WALアーカイブ処理時に使われるコマンドを指定する
 ちなみに、「postgresql.conf」の保存場所は、「PostgreSQL」をインストールしたフォルダの「data」フォルダにあります。
3)オンラインバックアップ時の手順
 リカバリ時に本当に必要なWALを特定するために、「pg_start_buckup()」と「pg_stop_buckup()」コマンドを使います。
 オンライン・バックアップを行う際に
 ①pg_start_buckup()を実行
 ②データベースのファイルをコピー(オフライン・バックアップと同様)
 ③pg_stop_buckup()を実行
 「pg_start_backup()」コマンドと「pg_stop_backup()」コマンドを実行することで、バックアップが始まった時点と終わった時点のWALファイルがどれなのかがPostgreSQLによって記録されます。この情報はWALファイルと同じ場所に保存されるので、WALアーカイブを行っていれば同じくバックアップすることができます。
 PostgreSQL 9.1からは、上記の3ステップをすべてひっくるめて行ってくれる「pg_basebackup」コマンドが用意されました。「-D」オプションでバックアップ保存先を指定して実行します。
  「pg_basebackup -D/バックアップ場所」

 以上がPostgreSQLのバックアップでした。

0 件のコメント:

コメントを投稿