PostgreSQLのポイントインタイムリカバリ(インクリメンタルバックアップ)
PostgreSQL「ポイントインタイムリカバリ」(PITR)は、増分データベースバックアップ、オンラインバックアップ、またはアーカイブバックアップとも呼ばれます。 PostgreSQLサーバは、挿入、更新、削除などのすべてのユーザのデータ変更トランザクションを記録し、ファイルコールwrite-ahead(WAL)ログファイルに書き込みます。このメカニズムでは、WALファイルに格納された履歴レコードを使用して、前回のデータベースフルバックアップ以降に行われたロールフォワードの変更を行います。
利点
-
ゼロダウン時間 – 増分データベースのバックアップは重要です
1分でさえも余裕がない重要なシステムです。 Point-in-Timeリカバリを使用すると、データベースバックアップの停止時間を完全になくすことができます。これにより、データベースのバックアップとシステムへのアクセスが同時に行われるためです。
-
ストレージ容量を節約 – 増分データベースバックアップでは、
毎日フルデータベースバックアップの代わりに最後のバックアップ以降の最新のアーカイブログファイル。
上記の利点が懸念される場合は、常に増分データベースバックアップを実装する必要があります。ここでは、PostgreSQLサーバでポイントインタイムリカバリ(インクリメンタルバックアップ)を行う方法を示します。
PostgreSQLのバックアップ手順の概要**
-
アーカイブログをサポートするようにpostgresql.confを変更する
-
基本バックアップを作成する(完全データベースバックアップ)
-
ベースストレージをリモートストレージにバックアップします.
-
WAL(アーカイブログファイル)をリモートストレージにバックアップ(連続プロセス)
-
ベースバックアップからファイルを抽出する
-
pg__xlogフォルダからファイルをコピーする
-
recovery.confファイルを作成する
-
回復を開始する
チュートリアルは〜長い旅、患者を始めた…
データベースの初期化
-
1)テスト用データベースを作成し、/usr/local/pgsql/pgDataPITR/** の下にあるすべてのデータベースファイルを作成します。
データベースの初期化
….[mkyong]$ initdb -D/usr/local/pgsql/pgDataPITR/….
データベースを起動する
….[mkyong]$ pg__ctl start -D/usr/local/pgsql/pgDataPITR/….
-
2)PostgreSQL設定ファイル(postgresql.conf)** を変更するには、PostgreSQLサーバから生成されたWALファイルをコピーまたはアーカイブする方法をPostgreSQLに伝えるために、postgresql.confファイルにいくつかの変更を加える必要があります。
postgresql.confを変更する
….[mkyong]$ vi postgresql.conf
postgresql.confで次の変更を加えます。
archive
command = on
archive
command = ‘cp %p/usr/local/pgsql/pgDataPITR/wals/%f’
ウォールフォルダーを作成する ....[mkyong]$ mkdir/usr/local/pgsql/pgDataPITR/wals
データベースを再起動します。
….[mkyong]$ pg
ctl stop -D/usr/local/pgsql/pgDataPITR/[mkyong]$ pg
ctl start -D/usr/local/pgsql/pgDataPITR/….
-
注意!!! PostgreSQLがログファイル、pg
xlog、アーカイブログをどのように扱うかを理解する** pg
xlogは、すべてのデータ履歴レコードを格納するPostgreSQLログファイルフォルダです。/usr/local/pgsql/pgDataPITR/pg
xlogにあります。たとえば、ユーザーがレコードを挿入、更新、または削除すると、すべてのトランザクションがpg
xlogフォルダの下のファイルログファイルを自動的に作成または追加します。ログファイルの形式は、000000010000000000000001 – > 000000010000000000000006という形式です
例えば、
….[postgres@localhost pg__xlog]$ ls -lsh
total 113M
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006
すべてのログファイルは約16Mのデータを処理できます。この制限を超えると、新しいログファイルが自動的に作成され、ファイル名は0-9とA-Z
000000010000000000000001
..
..
000000010000000000000009
..
..
00000001000000000000000A
..
..
00000001000000000000000Z
これは、ロールフォワードPostgreSQLポイントインタイムリカバリとして使用するログファイルです。 ** 注意!!! postgresql.confファイルにWALファイルパスを設定していますか?
archive
command = on
archive
command = ‘cp %p/usr/local/pgsql/pgDataPITR/wals/%f’
つまり、PostgreSQLが新しい履歴レコードを挿入しようとしたときにpg__xlogがいっぱいであることが検出された場合、最も古い履歴ログファイルを自動的にアーカイブして** /usrに移動します/local/pgsql/pgDataPITR/wals ** フォルダにあります。 ** Attention !!! ** これらのアーカイブファイルを継続的にバックアップする必要があります(インクリメンタルバックアップと呼ばれる理由:))。もう完全なデータベースバックアップは必要ありませんが、アーカイブログファイルを常にバックアップしています。 重要なログファイルフォルダ ..../usr/local/pgsql/pgDataPITR/pg__xlog/usr/local/pgsql/pgDataPITR/wals
データシミュレーション&バックアッププロセス
ダミーのテーブルとレコードを作成する – 新しいテーブルに455,252個のレコードを動的に作成する.400kレコードはPostgreSQLにpg
xlogフォルダに十分なログファイルを作成させ、
/usr/local/pgsql/pgDataPITR/pg
xlog 〜
/usr/local/pgsql/pgDataPITR/wals
には、すべてのログファイルに約16Mサイズのファイルが含まれています。
-
1)2008年11月25日17時17分に作成されたテーブルテストPITR1 **
# psql # select (** ) from pg__class; –- contain 229 records # select (** ) from pg__description; –- contains 1988 records # create table testPITR1 as select ** from pg__class, pg__description; #--totally 229 x 1988 = 455,252 records # select ** from current__timestamp; –-2008-11-25 17:17
ログファイルは次のようになります
….[postgres@localhost pgDataPITR]$ cd pg
xlog/[postgres@localhost pg
xlog]$ ls -lsh
total 113M
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:16 000000010000000000000007
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000008
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000009
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000A
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000B
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000C
[postgres@localhost pgDataPITR]$ cd wals[postgres@localhost wals]$ ls -lsh
total 97M
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000000
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000001
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000002
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000003
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000004
17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000005
** 2)完全なデータベースバックアップバックアップを作成する**