はじめに
データベースのバックアップは、システムの安定性とデータの保全にとって非常に重要です。特に、ビジネスにおいて重要なデータを扱っている場合、データ損失は大きな損害を引き起こす可能性があります。この記事では、Windows環境でPostgreSQLのバックアップを自動的にスケジューリングする方法について詳しく説明します。
バックアップの種類
PostgreSQLのバックアップには主に以下の3種類があります。
NO | 分類 | 概要 |
1 | オフライン物理 | DB を停⽌し、データファイルを物理的にコピーOS コマンド |
2 | オンライン論理 | DB 起動状態で、データを取り出して保存。定義・データ単位 のバックアップも可能 |
3 | オンライン物理(増分) | DB 起動状態で、データファイルを物理的にコピー。WALを継続的にアーカイブ。 |
この記事では、Windows環境でPostgreSQLのオンライン物理増分バックアップを行う方法について詳しく説明します。
オンライン物理増分バックアップの利点
オンライン物理増分バックアップには、以下のような利点があります。
- 連続運用: バックアップ中でもデータベースを停止する必要がありません。
- 効率的なストレージ使用: 変更されたデータのみをバックアップするため、ストレージの使用効率が高いです。
- 迅速なリカバリ: 必要なデータのみをリストアするため、リカバリ時間が短縮されます。
オンライン物理増分バックアップの仕組み
オンライン物理増分バックアップは、PostgreSQLのWAL(Write-Ahead Logging)機能を活用しています。このセクションでは、その仕組みについて詳しく説明します。
WAL(Write-Ahead Logging)とは
WAL(Write-Ahead Logging)は、データベースのデータの一貫性を保つために非常に重要な仕組みです。日本語では「ログ先行書き込み」と訳され、その名の通り、データ本体に変更を加える前に、その変更内容をログに記録するという方式のことを指します。
WALの働き
トランザクションが正常に終了し、コミットされると、WALにコミットに関する情報が記録されます。
トランザクション開始:
データベースに何かしらの変更を加えるトランザクションが開始されると、その変更内容がWALに記録されます。
WALへの書き込み:
WALへの書き込みは、データ本体への変更よりも優先されます。つまり、WALにログが正常に書き込まれたことを確認してから、初めてデータ本体への変更が実行されます。
データ本体への書き込み:
WALへの書き込みが完了すると、データ本体への変更が実行されます。
コミット:
トランザクションが正常に終了し、コミットされると、WALにコミットに関する情報が記録されます。
オンライン物理増分バックアップの流れ
- アーカイブモードの有効化:
postgresql.conf
でarchive_mode
を有効にし、archive_command
を設定します。これにより、WALセグメントが定期的に指定の場所にアーカイブされます。
- ベースバックアップの取得:
- 最初にフルバックアップ(ベースバックアップ)を取得します。このバックアップは、データベースの完全なスナップショットです。
pg_basebackup
コマンドを使用してベースバックアップを作成します。
- 増分バックアップの取得:
- ベースバックアップ以降に生成されたWALファイルを定期的にバックアップします。これが増分バックアップとなります。
- 増分バックアップは、WALファイルのアーカイブを指定のディレクトリに保存することで実現します。
必要なツール
オンライン物理増分バックアップには以下のツールが必要です。
- PostgreSQL(インストール済み)
- pg_basebackup(PostgreSQLに含まれている)
- Windowsタスクスケジューラ
- バッチファイル(.bat)
バックアップの準備
まず、PostgreSQLのアーカイブモードを有効にし、適切に設定する必要があります。
postgresql.confの設定
postgresql.conf
ファイル(C:\Program Files\PostgreSQL\15\dataにある)を編集し、以下の設定を変更します。(仮にWALファイルのアーカイブディレクトリはD:\Share\backup\archive\に設定します)
wal_level = replica
archive_mode = on
archive_command = 'copy "%p" "D:\\Share\\backup\\archive\\%f"'
pg_hba.confの設定
pg_hba.conf
ファイルを編集し、リモート接続を許可するための設定を以下のように変更します。
# TYPE DATABASE USER ADDRESS METHOD
#変更前
#host replication all ::1/128 scram-sha-256
host replication all ::1/128 trust
バッチファイルの作成
サンプルシナリオ
項目 | 説明 | |
バックアップ取得日時と種別 | 初回 | 全体バックアップ |
月曜~土曜定時 | 増分バックアップ | |
日曜定時 | 全体バックアップ | |
世代管理 | 過去2世代分を保持 |
全体バックアップスクリプト (full_backup.bat)
@echo off
setlocal
set PGUSER=postgres
set PGBIN=C:\Program Files\PostgreSQL\15\bin
set BACKUPDIR=D:\Share\backup\full
set FILENAME=base_backup_%date:~-10,4%%date:~-5,2%%date:~-2,2%_%time:~0,2%%time:~3,2%%time:~6,2%
"%PGBIN%\pg_basebackup" -U %PGUSER% -D "%BACKUPDIR%\%FILENAME%" -P
REM バックアップの世代管理
for /f "skip=2 delims=" %%A in ('dir /b /o-d "%BACKUPDIR%\*"') do rd /s /q "%BACKUPDIR%\%%A"
増分バックアップスクリプト
WALアーカイブによって増分バックアップが自動的に行われます。特別なスクリプトは不要です。ただし、アーカイブ先のディレクトリを適切に管理する必要があります。
タスクスケジューラを使用して自動化
全体バックアップ(毎週日曜日、初回は手動で実行します)
- タスクスケジューラを開きます。
- 「タスクの作成」を選択します。
- 「全般」タブで、名前を「Full Backup」とします。
- 「トリガー」タブで、「新規」をクリックし、「毎週」を選択し、「日曜日」にチェックを入れます。
- 「操作」タブで、「新規」をクリックし、「プログラム/スクリプト」にfull_backup.batのパスを入力します。
- 「OK」をクリックしてタスクを作成します。
まとめ
この記事では、Windows環境でPostgreSQLのオンライン物理増分バックアップを行う方法について詳しく説明しました。オンライン物理増分バックアップを利用することで、システムの停止を最小限に抑えながら、効率的なバックアップと迅速なリカバリを実現できます。ぜひこの手順を参考に、バックアップ体制を整えてください。
コメント