バックアップ手順
1. 目的
FRUCtoS配布パッケージにより構成されるFRUCtoSのDBのバックアップ方法について説明します。
本ドキュメントはソフトウェアのインストール、OSの環境設定など基本的なコンピュータ管理の知識とその操作権限をもつ方を対象としています。
また、本書ではDockerを用いた手順とPostgreSQLを用いた手順を解説しているため、DockerとPostgreSQLの基本的な知識があるとより望ましいです。
2. DBバックアップの全体像
FRUCtoSで用いているDBは現在以下の3種類があり、それぞれ必要に応じてバックアップを取ることが推奨されます。
fructos_docker_database
(FRUCtoS用のDB)fructos_docker_audit_database
(FRUCtoSの監査ログ用のDB)fructos_docker_configuration_database
(FRUCtoSの設定永続化用のDB)
DBのバックアップ方法はいくつかありますが、ここではFRUCtoSの標準で用いているDB管理システム、PostgreSQLの機能を用いた方法について、 2種類のバックアップの概要と手順を示します。PostgreSQLと異なるDB管理システムを用いている場合は、そのシステムに応じたバックアップ方法を検討ください。
2.1. 論理バックアップ
論理バックアップはある時点でのDBのデータをバックアップファイルにバックアップします。作成されたバックアップファイルは、バックアップを行った時点にのみリストアが可能です。
論理バックアップの概念図
2.2. 物理バックアップ
物理バックアップはある時点でのDBのデータをベースバックアップファイルにバックアップし、また、データベースの変更ログを実際の処理に先行して継続的にWALファイルに書き出します。
ベースバックアップファイル作成時点以降かつWALファイルが存在する範囲内の任意の時点にリストアが可能です。
物理バックアップの利点は継続的にWALファイルが書き出されることです。DBがクラッシュした場合でも、先に書き出されたWALファイルとベースバックアップファイルを用いてリストアできます。
半面で、WALファイルが書き出し続けられるために、バックアップのファイル容量が増えていきます。
ファイル容量を抑えるために、定期的にベースバックアップファイルを作り直し、そのベースバックアップファイル作成以前のWALファイルを削除することが推奨されます。
物理バックアップの概念図
2.3. バックアップの違いの概要
論理バックアップと物理バックアップの違いについて、その概要を以下表に示します。
論理バックアップ | 物理バックアップ | |
---|---|---|
バックアップファイル | 1つ(バックアップファイル) | 2つ以上(ベースバックアップファイル、 ベースバックアップ以降のWALファイル) |
リストア先 | バックアップ時点のみ | ベースバックアップ以降のWALファイル存在範囲内で任意 |
起動中のバックアップ | 可能 | 部分的に可能(WALファイル出力設定変更の反映には停止が必要) |
DBシステムクラッシュ時 | クラッシュ時の動作はなし(バックアップ時点への復元は可能) | クラッシュ時の操作まで復元が可能 |
3. DB論理バックアップ手順
構築手順 4.3 FRUCtoSの配置における配布パッケージ展開先のフォルダを$WORK
と表記します。
以下の例では配布パッケージを展開した$WORK/dist/fructos_docker
で作業します。
コマンド内における[]で囲まれる以下に示す名前は、それぞれ適切なものに置き換えてください。
- [DBサービス名]
バックアップを行うDBのサービス名です。通常では以下のいずれかで置き換えます。db
(FRUCtoS用のDBのサービス名)audit-db
(FRUCtoSの監査ログ用のDBのサービス名)configuration-db
(FRUCtoSの設定永続化用のDBのサービス名)
- [バックアップファイル名]
バックアップファイルのファイル名で置き換えます。
3.1. バックアップ手順
$WORK/dist/fructos_docker
フォルダ内で次のコマンドを実行してください。コマンドはWindows、Linux、macOSで共通です。
注意
docker-composeのバージョンがv2.0.0以上の場合、以降のドキュメントサイトに記載されているdocker-compose
コマンドをdocker compose
コマンドに読み替えて実行してください。
docker-compose exec [DBサービス名] /bin/bash -c 'pg_dumpall -c -U $POSTGRES_USER > /bak/postgresql/bak/[バックアップファイル名]'
コマンドが実行されると、$WORK/dist/fructos_docker/[DBサービス名]/bak/[バックアップファイル名]
としてバックアップファイルが出力されます。
3.2. リストア手順
バックアップで作成したファイルを、$WORK/dist/fructos_docker/[DBサービス名]/bak/[バックアップファイル名]
として配置します。
$WORK/dist/fructos_docker
フォルダ内で次のコマンドを実行してください。コマンドはWindows、Linux、macOSで共通です。
docker-compose exec [DBサービス名] /bin/bash -c 'psql -f /bak/postgresql/bak/[バックアップファイル名] -U $POSTGRES_USER'
コマンドが実行されると、バックアップファイル内のSQLコマンドが順に実行され、バックアップ時点のDBにデータが復元されます。実行前のデータは失われることに注意してください。
4. DB物理バックアップ手順
PostgreSQLのDB物理バックアップには、バックアップのベースとなるベースバックアップと、ベースバックアップ以降のDB書き込みログであるWALが必要です。
ベースバックアップは「DB論理バックアップ手順」同様にコマンドを実行する必要があります。対して、WALはDBの出力設定が有効となっている場合は、DB書き込み時に自動的に生成されます。
ベースバックアップの取得はDBシステム起動中にも行うことも出来ますが、DBのWAL出力設定の変更と反映にはDBシステムの停止が必要です。
4.1. WALファイル出力設定手順
$WORK/dist/fructos_docker
フォルダ内で次の手順を行ってください。手順はWindows、Linux、macOSで共通です。
- Dockerコンテナを停止します。Shell
docker-compose stop
- PostgreSQLのDB設定ファイルを編集します。
$WORK/dist/fructos_docker/[DBサービス名]/postgresql.conf
をテキストエディタなどから開き、archive_mode = ON
に変更し、上書き保存します。 - 停止したDockerコンテナを再起動します。Shell
docker-compose start
$WORK/dist/fructos_docker/[DBサービス名]/wal/
以下にWALファイルが出力されます。
info
DBのWAL出力設定を無効とする場合は、同様の手順でarchive_mode = OFF
に変更してください。
4.2. ベースバックアップ手順
$WORK/dist/fructos_docker
フォルダ内で次のコマンドを実行してください。コマンドはWindows、Linux、macOSで共通です。
docker-compose exec [DBサービス名] /bin/bash -c 'pg_basebackup -U $POSTGRES_USER -D - -Ft -Xn -z > /bak/postgresql/bak/[バックアップファイル名]'
コマンドが実行されると、$WORK/dist/fructos_docker/[DBサービス名]/bak/[バックアップファイル名]
としてベースバックアップファイルが出力されます。
WALはDB書き込みの度に書き出されるため、運用時にファイル容量が大きくなりやすいです。定期的にベースバックアップを取得し、
ベースバックアップ以前の古いWALファイルを適宜削除することが推奨されます。
4.3. リストア手順
WALファイルを、$WORK/dist/fructos_docker/[DBサービス名]/wal/
以下に、ベースバックアップファイルを、
$WORK/dist/fructos_docker/[DBサービス名]/bak/[バックアップファイル名]
の形式でそれぞれ配置します。
ファイルの配置後、$WORK/dist/fructos_docker
フォルダ内で次の手順を行ってください。手順はWindows、Linux、macOSで共通です。
Dockerコンテナを停止します。
Shelldocker-compose stop
リストアの設定をします。
Shelldocker-compose start [DBサービス名]
Shelldocker-compose exec [DBサービス名] /bin/bash
Shellrm -rf /var/lib/postgresql/data/*
Shelltar xvzf /bak/postgresql/bak/[バックアップファイル名] -C /var/lib/postgresql/data/
Shelltouch /var/lib/postgresql/data/recovery.signal
Shellexit
リストアの詳細設定をする場合は、PostgreSQLのDB設定ファイルを編集します。
$WORK/dist/fructos_docker/[DBサービス名]/postgresql.conf
をテキストエディタなどから開き、編集後、上書き保存します。 デフォルトではWALファイル内の最新状態を対象にリストアが行われますが、最新以外の状態への変更などが可能です。詳しくは以下のリンク先ドキュメントを参照してください。
https://www.postgresql.jp/document/13/html/runtime-config-wal.html#RUNTIME-CONFIG-WAL-RECOVERY-TARGETDockerコンテナを再起動します。
Shelldocker-compose restart
DBにデータが復元されます。実行前のデータは失われることに注意してください。
tip
DBサービスのログからリカバリの状態を確認できます。
docker-compose logs -f [DBサービス名]
5. バックアップ先フォルダの変更
ストレージ故障時の復旧のために別ストレージへバックアップファイルを保存する場合など、バックアップ先のフォルダの変更方法について説明します。
$WORK/dist/fructos_docker
フォルダ内で次の手順を行ってください。手順はWindows、Linux、macOSで共通です。
- Dockerコンテナを停止します。Shell
docker-compose stop
docker-compose.yml
を編集します。$WORK/dist/fructos_docker/docker-compose.yml
をテキストエディタなどから開き、編集後、上書き保存します。 ファイル内のservices: [DBサービス名]: volumes:
以下の設定値左部について、バックアップファイルの保存先を変更する場合は、./[DBサービス名]/bak
を、WALファイルの保存先を変更する場合は、./[DBサービス名]/wal
をそれぞれ新たな保存先のパスへ置き換えてください。services:
[DBサービス名]:
volumes:
- ./[DBサービス名]/bak:/bak/postgresql/bak ・・・(バックアップファイルの保存先)
- ./[DBサービス名]/wal:/bak/postgresql/wal ・・・(WALファイルの保存先)- docker-compose.ymlの変更を反映して起動します。Shell
docker-compose up -d