メインコンテンツまでスキップ
Version: v2.2.0

バックアップ手順

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で作業します。
コマンド内における[]で囲まれる以下に示す名前は、それぞれ適切なものに置き換えてください。

  1. [DBサービス名]
    バックアップを行うDBのサービス名です。通常では以下のいずれかで置き換えます。
    • db(FRUCtoS用のDBのサービス名)
    • audit-db(FRUCtoSの監査ログ用のDBのサービス名)
    • configuration-db(FRUCtoSの設定永続化用のDBのサービス名)
  2. [バックアップファイル名]
    バックアップファイルのファイル名で置き換えます。

3.1. バックアップ手順

$WORK/dist/fructos_dockerフォルダ内で次のコマンドを実行してください。コマンドはWindows、Linux、macOSで共通です。

注意

docker-composeのバージョンがv2.0.0以上の場合、以降のドキュメントサイトに記載されているdocker-composeコマンドをdocker composeコマンドに読み替えて実行してください。

Shell
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で共通です。

Shell
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で共通です。

  1. Dockerコンテナを停止します。
    Shell
    docker-compose stop
  2. PostgreSQLのDB設定ファイルを編集します。
    $WORK/dist/fructos_docker/[DBサービス名]/postgresql.confをテキストエディタなどから開き、archive_mode = ONに変更し、上書き保存します。
  3. 停止したDockerコンテナを再起動します。
    Shell
    docker-compose start
  4. $WORK/dist/fructos_docker/[DBサービス名]/wal/以下にWALファイルが出力されます。
info

DBのWAL出力設定を無効とする場合は、同様の手順でarchive_mode = OFFに変更してください。

4.2. ベースバックアップ手順

$WORK/dist/fructos_dockerフォルダ内で次のコマンドを実行してください。コマンドはWindows、Linux、macOSで共通です。

Shell
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で共通です。

  1. Dockerコンテナを停止します。

    Shell
    docker-compose stop
  2. リストアの設定をします。

    Shell
    docker-compose start [DBサービス名]
    Shell
    docker-compose exec [DBサービス名] /bin/bash
    Shell
    rm -rf /var/lib/postgresql/data/*
    Shell
    tar xvzf /bak/postgresql/bak/[バックアップファイル名] -C /var/lib/postgresql/data/
    Shell
    touch /var/lib/postgresql/data/recovery.signal
    Shell
    exit
  3. リストアの詳細設定をする場合は、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-TARGET

  4. Dockerコンテナを再起動します。

    Shell
    docker-compose restart
  5. DBにデータが復元されます。実行前のデータは失われることに注意してください。

tip

DBサービスのログからリカバリの状態を確認できます。

Shell
docker-compose logs -f [DBサービス名]

5. バックアップ先フォルダの変更

ストレージ故障時の復旧のために別ストレージへバックアップファイルを保存する場合など、バックアップ先のフォルダの変更方法について説明します。
$WORK/dist/fructos_dockerフォルダ内で次の手順を行ってください。手順はWindows、Linux、macOSで共通です。

  1. Dockerコンテナを停止します。
    Shell
    docker-compose stop
  2. 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ファイルの保存先)
  3. docker-compose.ymlの変更を反映して起動します。
    Shell
    docker-compose up -d