データの損失を防ぎ、安全な運用を支えるファイルバックアップ機能。本記事では、その設計思想から実装、設定手順、サンプルコードまで詳しく解説します。バックアップの基本概念を理解し、実践的な活用方法を身につけましょう。
Shellの基礎知識 🟡 Shell の基礎知識(入門編) 🟡 Shell の基礎知識(基礎編) 🟡 Shell の基礎知識(実践編)
📌 「動かす楽しさ」を最短で体感!Shellの第一歩をここから。
📌 条件分岐やループなど、実務で通用する基本操作を網羅。
📌 現場レベルの自動化スクリプトを実装しながら学ぶ実戦形式。
├─【Shellの基礎知識】中級者向けShellスクリプト|実用的な書き方とコツ
├─【Shellの基礎知識】中級者向けShell活用術|10の応用Tipsを紹介。
├─【Shellの基礎知識】共通関数定義クラスの完全ガイド!設計から実践まで徹底解説
├─【Shellの基礎知識】簡単なログ出力ロジックを作ってみました。
├─【Shellの基礎知識】シェルスクリプトの作成を時短!テンプレートで効率化する方法
└─【Shellの基礎知識】ファイルバックアップ機能を徹底解説!設計・実装・活用まで!
ファイルバックアップ機能の概要と役割
ファイルバックアップ機能は、重要なデータの保護を目的として設計されています。システム障害やヒューマンエラーによるデータ損失を防ぐため、定期的なバックアップを実施することが求められます。本セクションでは、ファイルバックアップ機能の目的、重要性、設計方針について解説します。
ファイルバックアップ機能の目的
ファイルバックアップの主な目的は、以下の通りです。
- データ保護: システム障害や誤削除によるデータ損失を防ぐ。
- 業務継続性の確保: 迅速なデータ復元により業務の停止時間を最小限に抑える。
- 法令遵守: データの保存義務がある業界において、適切なバックアップが必要。
- サイバー攻撃対策: ランサムウェアなどの攻撃からデータを守るために、バックアップが重要。
ファイルバックアップ機能の重要性と課題解決のポイント
バックアップ機能は、単にデータを保存するだけでなく、実用的な復元が可能であることが求められます。重要性を理解し、課題を解決するためのポイントを押さえましょう。
バックアップ機能の重要性
- システム障害時にデータを迅速に復旧できる。
- 誤操作によるデータ削除を防ぐためのリスク管理が可能。
- データ保管ポリシーに基づいた安全な管理が可能。
課題解決のポイント
課題 | 解決策 |
---|---|
バックアップの頻度が適切でない | 業務に応じたスケジュールを設定し、定期バックアップを実施する。 |
ストレージの容量が不足する | 増分バックアップや圧縮を活用し、容量を最適化する。 |
バックアップデータが破損する可能性がある | 定期的なバックアップデータの検証(整合性チェック)を行う。 |
ファイルバックアップ機能の設計の基本方針
ファイルバックアップを設計する際には、データの一貫性や復元性を考慮する必要があります。以下のポイントに基づいて設計を行います。
設計の基本原則
- 信頼性: バックアップデータが確実に復元できることを保証。
- 自動化: 定期バックアップをスケジュール設定し、人的ミスを防ぐ。
- 効率性: 重複データを減らし、ストレージを最適に使用。
- セキュリティ: バックアップデータを暗号化し、不正アクセスを防ぐ。
設計時に考慮すべきポイント
設計要素 | 内容 |
---|---|
バックアップの種類 | フルバックアップ・増分バックアップ・差分バックアップの選択 |
ストレージの選定 | ローカルストレージ、クラウドストレージ、外部デバイスなど |
リストア手順 | バックアップデータの検証と復旧方法の確立 |
自動化 | スケジュールタスク(cronなど)の設定 |
これらの設計方針に基づき、ファイルバックアップ機能を適切に構築することで、安定したデータ管理が可能になります。
設計書の構成と設計要素
ファイルバックアップ機能の実装には、明確な設計書が必要です。本章では、クラス設計の前提条件、使用する変数の一覧、実装されている関数の詳細について解説します。
クラス設計の前提条件
ファイルバックアップ機能を設計するにあたり、以下の前提条件を考慮します。
- バックアップ対象: 指定されたディレクトリやファイルをアーカイブ形式で保存
- 実行環境: Linux環境(Bashスクリプトで実装)
- ログ管理: 共通ログ出力クラスを活用
- エラーハンドリング: 異常発生時は適切なエラーメッセージを出力
前提となる実行環境
本バックアップスクリプトは、共通ログ出力クラス( logger.shrc)および共通関数定義クラス( utils.shrc)を使用することを前提としています。これにより、ログ管理や共通関数の再利用性を高め、メンテナンス性を向上させます。
本スクリプトを実行するには、以下の環境が必要です。
- 共通ログ出力クラス( logger.shrc)が適切に配置されていること
- 共通関数定義クラス( utils.shrc)が適切に配置されていること
- Bash 4.x 以上の環境
- バックアップ対象のディレクトリと出力先ディレクトリが適切に設定されていること
前提となる実行環境
Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。
実行環境
BASE_DIR(任意のディレクトリ)
- scripts
- bin(実行スクリプト格納領域)
- <<各種実行スクリプト>>.sh (実行ファイル)
- com(共通スクリプト格納領域)
- logger.shrc(共通ログ出力ファイル)
- utils.shrc(共通関数定義ファイル)
- etc(設定ファイル等の格納領域)
- infraMessage.conf(メッセージ定義ファイル)
- log(スクリプト実行ログの格納領域)
- スクリプト名.log
- tmp(テンポラリ領域)
- rep(レポート出力領域)
- bin(実行スクリプト格納領域)
使用する変数一覧
スクリプト内で使用する主な変数は以下の通りです。
変数名 | 用途 | 例 |
---|---|---|
TARGET_LIST | バックアップ対象のファイルリスト | /etc/target.cfg |
IGNORE_LIST | バックアップ除外リスト | /etc/ignore.cfg |
BACKUP_DIR | バックアップファイルの保存先 | /backup |
BACKUP_FILE | 生成されるバックアップファイル名 | backup_YYYY-MM-DD.tar.gz |
実装されている関数の詳細
本スクリプトでは、以下の関数を実装しています。
1. checkArg() - 引数の妥当性確認
バックアップ対象や保存先ディレクトリの確認を行います。
checkArg()
2. executeBackup() - バックアップ処理の実行
指定された対象をアーカイブし、バックアップを作成します。
executeBackup()
3. cleanup() - 異常終了時の処理
エラー発生時に一時ファイルを削除し、適切なログを出力します。
cleanup()
4. restoreBackup() - バックアップの復元
作成したバックアップファイルを展開し、復元を行います。
restoreBackup()
target.cfg と ignore.cfg の具体的な記載方法
バックアップスクリプトでは、 target.cfg にバックアップ対象のファイルやディレクトリを、 ignore.cfg にバックアップから除外する項目を記載します。本章では、それぞれのファイルの記述フォーマットとサンプルを解説します。
前提となるテスト環境
以下のディレクトリ構成をもとに、バックアップスクリプトの動作を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [crayon-67e6e51fd2898225039974 inline="true" ]test ├── test1/ │ ├── test1-1/ │ │ ├── test1-1-1.txt │ │ ├── test1-1-2.txt │ │ └── test1-1.txt │ ├── test1-2/ │ │ ├── test1-2-1.txt │ │ └── test1-2-2.txt │ └── test1-3/ │ ├── test1-3-1.txt │ └── test1-3-2.txt └── test2/ ├── test2-1/ │ ├── test2-1-1.txt │ │ └── test2-1-2.txt ├── test2-2/ │ ├── test2-2-1.txt │ └── test2-2-2.txt └── test2-3/ ├── test2-3-1.txt └── test2-3-2.txt |
target.cfg の記載方法
target.cfg には、バックアップ対象とするファイルやディレクトリを1行ずつ記述します。
記述ルール
- 絶対パスで記述する(例: /home/user/documents)
- ファイル名またはディレクトリ名を記載する
- ワイルドカード( *)は使用しない(意図しないファイルが含まれるリスクを避けるため)
- コメント行は # を先頭に付与
target.cfg の記述例
# バックアップ対象リスト
/home/user/documents
/etc/nginx/nginx.conf
/var/log/syslog
/home/user/project/source_code
/opt/application/config.yaml
ignore.cfg の記載方法
ignore.cfg には、バックアップ対象から除外するファイルやディレクトリを1行ずつ記述します。
記述ルール
- 対象ファイルが属するディレクトリを target.cfg に記載している場合、そこから除外したいファイルやフォルダを記述
- 相対パスまたは絶対パスで記述する
- ワイルドカード( *)を使用可能(特定の拡張子を除外する際に便利)
- コメント行は # を先頭に付与
ignore.cfg の記述例
# 除外リスト
*.tmp
*.log
/var/log/debug.log
/home/user/documents/temp/*
target.cfg と ignore.cfg の組み合わせ
例えば、以下の設定でバックアップが行われる場合:
- target.cfg に /home/user/documents が含まれる
- ignore.cfg に *.tmp と /home/user/documents/temp/* が指定される
この場合、 /home/user/documents 以下の全ファイルがバックアップ対象になりますが、 *.tmp の拡張子を持つファイル、および /home/user/documents/temp/ 内のすべてのファイルは除外されます。
ワイルドカード(*)の使用について
「ignore.cfg」 では、ワイルドカード(*)を使用できますが、「target.cfg」 では、ワイルドカードを記載しても適用されません。
ignore.cfg の目的
ignore.cfg は、 tar でアーカイブを作成するときに除外するファイルやディレクトリを指定するリストです。
このリストに記載されたものは、バックアップの対象外になります。
ignore.cfg の書き方
指定の仕方によって動作が異なります。
ここでは /test/ 配下のフォルダ・ファイルを例に説明します。
フォルダごと除外する場合
例: test1-1/ フォルダごと除外
/test/test1/test1-1/
📌 この指定をすると test1-1/ フォルダ全体が除外されます。
- 【除外対象】
- /test/test1/test1-1/
- /test/test1/test1-1/test1-1-1.txt
- /test/test1/test1-1/test1-1-2.txt
特定のファイルだけを除外する場合
例: test1-2/test1-2-1.txt だけを除外
/test/test1/test1-2/test1-2-1.txt
📌 この指定をすると test1-2-1.txt のみが除外され、同じフォルダ内の他のファイルはバックアップに含まれます。
- 【除外対象】
- /test/test1/test1-2/test1-2-1.txt
- 【バックアップに含まれるもの】
- /test/test1/test1-2/test1-2-2.txt
除外リストの具体例
以下の ignore.cfg を設定すると、フォルダごと除外するものと、特定のファイルだけ除外するものが混在します。
/test/test1/test1-1/ # test1-1 フォルダごと除外
/test/test1/test1-2/test1-2-1.txt # 特定のファイルのみ除外
/test/test1/test1-3/test1-3-2.txt # 特定のファイルのみ除外
📌 この指定をした場合、バックアップの中に含まれるものは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | [crayon-67e6e51fd28dd765428116 inline="true" ]test/ ├── test1/ │ ├── test1-2/ │ │ └── test1-2-2.txt │ └── test1-3/ │ └── test1-3-1.txt └── test2/ ├── test2-1/ │ └── test2-1-1.txt ├── test2-2/ │ └── test2-2-1.txt └── test2-3/ └── test2-3-1.txt |
tar の実行コマンド
/bin/tar --exclude-from="/scripts/etc/ignore.cfg" -czvf backup.tar.gz -T "/scripts/etc/target.cfg"
このコマンドを実行すると、 ignore.cfg に指定したものを除外した状態で backup.tar.gz を作成します。
除外リストの指定方法
以下の除外リストを使用することで、特定のディレクトリやファイルをバックアップ対象から除外できます。
除外対象 | 記述例 | 除外される内容 |
---|---|---|
フォルダ全体を除外 | /test/test1/test1-1/ | test1-1 フォルダとその中のすべてのファイル |
特定のファイルを除外 | /test/test1/test1-2/test1-2-1.txt | test1-2-1.txt のみ |
除外リストファイルのサンプル
上記の除外リストを ignore.cfg に記述すると、以下のようになります。
# /scripts/etc/ignore.cfg
/test/test1/test1-1
/test/test1/test1-2/test1-2-1.txt
/test/test1/test1-3/test1-3-2.txt
設定の確認方法
設定が正しく反映されているか確認するには、以下のコマンドを実行してください。
1. バックアップ対象の一覧を確認
cat /path/to/target.cfg
2. 除外設定を確認
cat /path/to/ignore.cfg
3. tarコマンドで動作確認
tar --exclude-from=/path/to/ignore.cfg -czf backup.tar.gz -T /path/to/target.cfg
このコマンドを実行することで、 target.cfg に記載されたファイルがアーカイブされ、 ignore.cfg に記載されたファイルは除外されます。
ファイルバックアップ機能の設定手順
このセクションでは、ファイルバックアップ機能の設定手順について説明します。
前提となる実行環境
本スクリプトは以下の環境を前提としています。
- OS: Linux(CentOS, RHEL, Ubuntuなど)
- シェル: Bash 4.x 以上
- 必要なコマンド: tar, find, grep, cron
ファイルバックアップ機能の設定方法
以下の手順でファイルバックアップ機能を設定します。
- バックアップ対象リスト( target.cfg)を作成する。
- 除外リスト( ignore.cfg)を作成する。
- スクリプト backupFiles.sh を適切な場所に配置する。
- 実行権限を付与する。
- 手動で実行し、正常動作を確認する。
このスクリプトでは、バックアップ対象のファイル・ディレクトリを設定ファイルで管理します。設定ファイルはスクリプトと同じディレクトリにある etc フォルダ内に格納してください。
設定ファイルの格納場所
スクリプトを実行するフォルダに、以下の2つのファイルを作成します。
- etc/target.cfg - バックアップ対象のファイル・ディレクトリ
- etc/ignore.cfg - バックアップ時に除外するファイル・ディレクトリ
target.cfg(バックアップ対象リスト)
バックアップ対象のファイルやディレクトリを、1行ずつ記述します。
記述例:
/var/log/syslog
/home/user/documents/
/etc/nginx/nginx.conf
ignore.cfg(バックアップ除外リスト)
バックアップ時に除外するファイルやフォルダを、1行ずつ記述します。ワイルドカード( *)も使用できます。
記述例:
*.log
*.tmp
cache/
アーカイブ格納先ディレクトリの設定
バックアップファイルは、指定されたディレクトリ(例: /backup)に保存されます。バックアップディレクトリの設定方法は以下の通りです。
backupFiles.sh -b /backup
設定後、ディレクトリが適切に作成されていることを確認してください。
定期バックアップのスケジュール設計(cronを活用)
ファイルバックアップを定期的に実行するために、 cron を設定します。
1. crontab -e を実行
ターミナルで以下のコマンドを実行し、crontab を編集します。
crontab -e
2. 定期実行のスケジュールを設定
毎日深夜3時にバックアップを実行する場合、以下のように記述します。
0 3 * * * /path/to/backupFiles.sh -b /backup
3. 設定を確認
設定が反映されたことを確認するため、以下のコマンドを実行します。
crontab -l
この設定により、ファイルバックアップが定期的に実行され、自動でデータを保護できます。
実践的な利用方法とサンプルコード
ファイルバックアップ機能を適切に活用することで、データの保護と業務の安定性を確保できます。本章では、基本的な使い方から具体的な利用ケース、共通ログ出力クラスのメリットまで解説します。
基本的な使い方
バックアップスクリプト backupFiles.sh を実行する基本的な方法を紹介します。
1. バックアップの実行
手動でバックアップを実行するには、以下のコマンドを使用します。
sh backupFiles.sh -b /backup
このコマンドを実行すると、 /etc/target.cfg に記載された対象ファイルがアーカイブされ、指定したディレクトリに保存されます。
2. バックアップの確認
作成されたバックアップが正しく存在しているかを確認するには、以下のコマンドを使用します。
ls -lh /backup/backup_*.tar.gz
3. バックアップデータの内容確認
バックアップファイル内のデータを確認するには、以下のコマンドを実行します。
tar -tvf /backup/backup_YYYY-MM-DD.tar.gz
よくある利用ケース
バックアップ機能は、様々なシチュエーションで活用できます。代表的な利用ケースを紹介します。
定期的なデータ保護
- 毎日深夜に重要なデータをバックアップし、7日以上前のバックアップを自動削除。
- クラウドストレージやリモートサーバーへバックアップを転送。
システムメンテナンス時のデータ保全
- システムアップグレード前にフルバックアップを作成。
- 障害発生時に迅速に復元できるよう、最新のデータを保持。
開発・テスト環境のデータ管理
- 本番環境のデータをバックアップし、テスト環境へリストア。
- バージョン管理の一環として、変更履歴を保持。
ファイルバックアップスクリプトの実装
以下のスクリプトを使用することで、設定済みのディレクトリをバックアップできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | #!/bin/sh #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # logger.sh ver.1.0.0 2025.02.20 # # Usage: # sh backupFiles.sh -b [ 格納先ディレクトリ ] # # Description: # - 指定されたファイル・ディレクトリをアーカイブ # - 除外リストを考慮して圧縮 # - 7日以上前のバックアップを自動削除 # - 異常終了時の処理を `trap` で制御 # # 設計書 # none # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # <変更履歴> # Ver. 変更管理No. 日付 更新者 変更内容 # 1.0 PR-0001 2025/01/16 Bepro 新規作成 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # 共通クラスの読み込み . $(dirname $0)/../com/logger.shrc . $(dirname $0)/../com/utils.shrc # ======================================== # 実行ユーザー確認(root限定) # ======================================== runAsRoot # ======================================== # 定数定義 # ======================================== readonly JOB_OK=0 readonly JOB_WR=1 readonly JOB_ER=2 # 変数定義 target_list="${ETC_PATH}/target.cfg" ignore_list="${ETC_PATH}/ignore.cfg" backup_dir="" backup_file="" # エラーメッセージ定義 err_msg01="バックアップ保存先が指定されていません。" err_msg02="バックアップ保存先が存在しません。作成します。" err_msg03="バックアップ保存先に書き込み権限がありません。" err_msg04="ターゲットリストが存在しません。" err_msg05="除外リストが存在しません。" err_msg06="tar アーカイブ作成に失敗しました。" err_msg07="古いバックアップの削除に失敗しました。" err_msg08="異常終了のため、バックアップを削除します。" # ======================================== # 関数定義 # ======================================== # 使用方法の表示 usage() { echo "Usage: $0 -b <backup_directory>" exit ${JOB_ER} } # 引数の妥当性確認 checkArg() { if [ -z "$backup_dir" ]; then logOut "ERROR" "${err_msg01}" exitLog ${JOB_ER} fi if [ ! -d "$backup_dir" ]; then logOut "WARNING" "${err_msg02} (${backup_dir})" mkdir -p "$backup_dir" fi if [ ! -w "$backup_dir" ]; then logOut "ERROR" "${err_msg03} (${backup_dir})" exitLog ${JOB_ER} fi if [ ! -f "$target_list" ]; then logOut "ERROR" "${err_msg04} (${target_list})" exitLog ${JOB_ER} fi if [ ! -f "$ignore_list" ]; then logOut "WARNING" "${err_msg05} (${ignore_list})" fi # 【追加】ターゲットリスト内のファイルが存在するか確認 while read line; do if [ ! -e "$line" ]; then logOut "ERROR" "ターゲットファイルが見つかりません: ${line}" exitLog ${JOB_ER} fi done < "$target_list" } # 異常終了時のクリーンアップ処理 cleanup() { logOut "${err_msg08}" "ERROR" if [ -n "${backup_file}" && -f "${backup_file}" ]; then rm -f "${backup_file}" logOut "作成されたバックアップを削除しました: ${backup_file}" "WARNING" fi exitLog ${JOB_ER} } # バックアップ処理 executeBackup() { date_stamp="$(getCurrentDate)" echo "DEBUG: date_stamp=${date_stamp}" backup_file="${backup_dir}/backup_${date_stamp}.tar.gz" logOut "バックアップ開始: ${backup_file}" "INFO" # tar でアーカイブを作成 logOut "INFO" "tarアーカイブ対象のリスト:" cat "${target_list}" | while read line; do logOut "INFO" " - ${line}" done /bin/tar --exclude-from="${ignore_list}" -czf "${backup_file}" -T "${target_list}" rc=$? if [ $rc -ne $JOB_OK ]; then logOut "${err_msg06}" "ERROR" cleanup fi logOut "バックアップ完了: ${backup_file}" "INFO" } # 古いバックアップの削除 cleanOldBackups() { find "${backup_dir}" -type f -name "backup_*.tar.gz" -mtime +7 -exec rm {} + || logOut "${err_msg07}" "WARNING" } # ---------------------------------------------------------- # pre-process # ---------------------------------------------------------- scope="pre" startLog "backupFiles.sh バックアップ処理開始" # ======================================== # 引数の処理 # ======================================== while getopts "b:" opt; do case $opt in b) backup_dir="$OPTARG" ;; *) usage ;; esac done checkArg # `trap` 設定(異常終了時に cleanup() を呼び出し) trap cleanup ERR # ---------------------------------------------------------- # main-routine # ---------------------------------------------------------- scope="main" executeBackup cleanOldBackups # ---------------------------------------------------------- # post-process # ---------------------------------------------------------- scope="post" exitLog $JOB_OK |
※ 本スクリプトの利用により生じた、いかなる損害についても一切の責任を負わないものとします。また、損害賠償等の義務ついても、一切責任を負いません。
共通ログ出力クラスを導入するメリット
本スクリプトでは、共通ログ出力クラスを活用し、すべての処理ログを統一的に管理します。そのメリットは以下の通りです。
1. 一貫性のあるログ管理
- バックアップの開始・終了時にログを出力し、処理状況を記録。
- エラー発生時には即座に原因を特定できる。
2. デバッグの効率化
- 詳細なログを残すことで、問題発生時のトラブルシューティングが容易に。
- スクリプトの動作を時系列で把握できる。
3. システム運用の安定化
- バックアップ処理が正しく実行されているか、定期的にログを確認可能。
- 管理者が遠隔地からでもバックアップの実行状況を把握できる。
共通ログ出力クラスを導入することで、ログ管理が効率化され、トラブル対応の迅速化が可能になります。
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 2120-03-29 17:01:01 [ INFO ] SCRIPT:[backupFiles.sh] PID:[1511646] STARTED LOG. DEBUG: date_stamp=2120-03-29 2120-03-29 17:01:01 [ INFO ] tarアーカイブ対象のリスト: 2120-03-29 17:01:01 [ INFO ] - /test/test1/ 2120-03-29 17:01:01 [ INFO ] - /test/test2/test2-1/test2-1-1.txt 2120-03-29 17:01:01 [ INFO ] - /test/test2/test2-2/test2-2-1.txt 2120-03-29 17:01:01 [ INFO ] - /test/test2/test2-3/test2-3-1.txt /bin/tar: メンバ名から先頭の `/' を取り除きます /bin/tar: ハードリンク先から先頭の `/' を取り除きます 2120-03-29 17:01:01 [ INFO ] SCRIPT:[backupFiles.sh] PID:[1511646] ENDED LOG. ------------------------------------------------------------------- [root@localhost rep]# ls -l -rw-r--r--. 1 root root 227 3月 29 17:01 backup_2120-03-29.tar.gz [root@localhost rep]# tar -xzvf backup_2120-03-29.tar.gz test/test1/ test/test1/test1-2/ test/test1/test1-2/test1-2-2.txt test/test1/test1-3/ test/test1/test1-3/test1-3-1.txt test/test2/test2-1/test2-1-1.txt test/test2/test2-2/test2-2-1.txt test/test2/test2-3/test2-3-1.txt [root@localhost rep]# tree -F work/ work/ └── test/ ├── test1/ │ ├── test1-2/ │ │ └── test1-2-2.txt │ └── test1-3/ │ └── test1-3-1.txt └── test2/ ├── test2-1/ │ └── test2-1-1.txt ├── test2-2/ │ └── test2-2-1.txt └── test2-3/ └── test2-3-1.txt 8 directories, 5 files |
🔹 「/bin/tar: メンバ名から先頭の `/' を取り除きます」なぜ / を削除するの?
これは 誤った解凍によるシステム破壊を防ぐため。もし / 付きでバックアップされると、解凍時に ルートディレクトリ (/) 直下に強制的に展開 されてしまい、最悪の場合システムファイルを上書きする危険があるためです。
バックアップデータのリストア方法
バックアップデータは、障害発生時や誤操作によるデータ消失に備えて保存されています。本章では、バックアップファイルを復元する手順と、復元前にデータの整合性を確認する方法について解説します。
tarアーカイブからの復元
バックアップファイルは tar.gz 形式で圧縮されているため、復元には tar コマンドを使用します。
1. バックアップファイルのリスト表示
アーカイブ内のファイルを確認するには、以下のコマンドを実行します。
tar -tzf /backup/backup_YYYY-MM-DD.tar.gz
このコマンドを実行すると、バックアップに含まれているファイル一覧が表示されます。
2. 指定ディレクトリにバックアップを展開
バックアップデータを /restore ディレクトリに復元する場合、以下のコマンドを実行します。
tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore
復元先のディレクトリを指定することで、データを適切な場所に展開できます。
3. 特定のファイルのみ復元
バックアップデータの一部のみを復元する場合、ファイル名を指定して展開できます。
tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore path/to/file.txt
バックアップファイルの検証
バックアップが正しく作成されているかを確認することは重要です。以下の手順でデータの整合性を検証できます。
1. ファイルのハッシュ値を比較
バックアップ前後のファイルが一致しているか確認するには、 md5sum または sha256sum コマンドを使用します。
md5sum /original/file.txt
md5sum /restore/file.txt
ハッシュ値が一致すれば、バックアップが正しく復元されていることを示します。
2. tarアーカイブの整合性チェック
バックアップファイルが破損していないかを確認するには、以下のコマンドを実行します。
tar -tvf /backup/backup_YYYY-MM-DD.tar.gz
エラーメッセージが出なければ、アーカイブが正常であることを意味します。
3. バックアップデータのサイズ確認
バックアップデータが想定通りのサイズになっているか確認するには、以下のコマンドを使用します。
ls -lh /backup/backup_YYYY-MM-DD.tar.gz
予想よりも小さい場合、バックアップの対象ファイルが不足している可能性があるため、再確認が必要です。
トラブルシューティングとベストプラクティス
バックアップおよびリストアのプロセスは、データ保護の要となる重要な機能です。しかし、環境や設定によっては問題が発生することもあります。本章では、バックアップの失敗要因とその対策、リストア時のよくある問題と解決策について解説します。
バックアップに失敗する原因と対策
バックアップ処理が失敗する主な原因と、それぞれの対策を以下の表にまとめました。
原因 | 説明 | 対策 |
---|---|---|
権限不足 | バックアップ対象のディレクトリやファイルに適切なアクセス権限がない |
|
ストレージ容量不足 | バックアップの保存先に十分な空き容量がない |
|
ネットワーク障害 | リモートストレージへのバックアップ時に通信が途切れる |
|
リストア時のよくある問題と解決策
リストアの際に発生しやすい問題と、その対処方法を以下に示します。
1. バックアップファイルが破損している
復元しようとした際に、tarがエラーを出力する場合、バックアップファイルが破損している可能性があります。
tar -tzf /backup/backup_YYYY-MM-DD.tar.gz
エラーが表示された場合、以下の対応を行います。
- 別のバックアップファイルを使用する
- バックアップ時のログを確認し、正常に作成されていたかチェックする
- ストレージのエラーを確認し、ファイルシステムのチェックを行う( fsck コマンドなど)
2. ファイルのオーナーやパーミッションが復元されない
リストア後に適切な権限が付与されていない場合、復元時のオプションを確認する必要があります。
tar -xpvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore
また、手動でオーナーやパーミッションを設定する場合、以下のコマンドを使用できます。
chown -R user:group /restore
chmod -R 755 /restore
3. リストア先のディレクトリが不足している
リストアする際にディレクトリが存在しない場合、事前に作成する必要があります。
mkdir -p /restore
4. 一部のファイルのみ復元したい
特定のファイルのみを復元するには、tarコマンドで対象ファイルを指定します。
tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore path/to/file.txt
これにより、指定したファイルのみを復元できます。