この記事では、Windows Server 2019 環境における Restic バックアップ ツールの実践的なガイドについて詳しく説明します。 Windows 固有のファイル ロックとアクセス許可の問題に焦点を当て、NTFS ACL を使用してパスワード ファイルを保護する方法、VSS ボリューム シャドウ コピー (–use-fs-snapshot) を使用してロックされたファイルを処理する方法に重点を置き、スナップショットのクリーンアップ、データ リカバリ、整合性検証、オフサイトの災害復旧などの主要な操作について説明します。最後に、PowerShell とタスク スケジューラに基づく一連の自動バックアップと電子メール アラート スクリプトが提供され、運用および保守担当者が安全で信頼性の高い無人バックアップ ソリューションを作成できるようになります。
Restic は、Windows で利用できるシングルバイナリの、クライアント側で暗号化され、グローバルに重複排除されたスナップショット バックアップ ツールでもあります。 Windows Server 2019 の最も重要な違いは次の 3 つです。タスクスケジューラによる無人化、VSS スナップショットを使用してロックされたファイルを処理する、NTFS ACL を使用してパスワード ファイルのアクセス許可を厳密に制御する。
1. インストール (単一バイナリ、ウィンゲット、または手動配置を推奨)
方法 A: winget (推奨、その後のアップグレードが簡単)
による管理者のステータスPowerShell を開きます。
winget install restic.restic
インストール後にバージョンを確認します。
restic version
方法 B: .exe を手動でダウンロードする
RESTIC リリースからダウンロード restic_*_windows_amd64.zip解凍後、 restic.exe 入れます C:\Program Files\Restic\そしてディレクトリをシステムに追加します PATH。直接投入しないでください System32その後のバージョン管理と監査を容易にするため。
方法 C: 共有した Baidu ネットワークのディスク アドレスからダウンロードする
リンク: 抽出コード: hpdy
ディレクトリ構造
C:\Program Files\Restic\
├── logs\ # 存放每日备份、清理和校验的日志
├── exclude.txt # 备份排除列表(如临时文件、缓存目录等)
├── init.log # 首次执行 restic init 时的输出日志
├── restic.exe # Restic 主程序
├── restic_backup_passwd.txt # Restic 仓库密码文件(需严格控制 NTFS ACL 权限)
└── restic-backup.ps1 # 自动化备份与发信通知的主 PowerShell 脚本
2. 環境変数とパスワード ファイル (Windows では、プレーン テキストの環境変数ではなく、必ずパスワード ファイルを使用してください)
Restic は Windows 上の環境変数もサポートしていますが、本番環境ではパスワードファイルを優先する。 PowerShell で現在のセッションの一時環境変数を設定すると、テストに使用できます。
$env:RESTIC_REPOSITORY = "D:\Backup\restic-repo"
$env:RESTIC_PASSWORD_FILE = "C:\ProgramData\Restic\password.txt"
システム レベルまで保持したい場合 (パスワードには推奨されません)、以下を使用できます。
[Environment]::SetEnvironmentVariable("RESTIC_REPOSITORY", "D:\Backup\restic-repo", "Machine")
パスワードファイルの権限(キー) : Windows いいえ chmod 600NTFS ACL で次のように制限する必要がありますバックアップを実行している ID のみが読み取り可能。タスクが次で始まると仮定します。 SYSTEM 実行中、のみ許可されています SYSTEM そして Administrators 読む:
$acl = Get-Acl "C:\ProgramData\Restic\password.txt"
$acl.SetAccessRuleProtection($true, $false) # 禁用继承
$acl.Access | ForEach-Object Out-File "C:\Program Files\Restic\mail-failure.log" -Append
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","Read","Allow")
$acl.AddAccessRule($rule)
$rule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators","Read","Allow")
$acl.AddAccessRule($rule2)
Set-Acl "C:\ProgramData\Restic\password.txt" $acl
これにより、一般ユーザーや誤操作プロセスによるパスワードの読み取りを防止します。
ウェアハウス バックエンドの例 (Windows パスの書き込み) :
# 本地目录
D:\Backup\restic-repo
# SFTP
sftp://user@192.168.1.100//backup/repo
# S3 兼容(MinIO / 阿里云 OSS / 华为 OBS)
s3:
s3:oss-cn-beijing.aliyuncs.com/bucket-name/repo
S3 シナリオでは、追加の認証情報も必要です (制限されたファイルを使用するか、タスク固有のアカウントにのみ設定することをお勧めします)。
$env:AWS_ACCESS_KEY_ID = "xxx"
$env:AWS_SECRET_ACCESS_KEY = "xxx"
3. ウェアハウスの初期化 (1 回のみ実行)
# 初始化 restic 仓库到 D:\backup\repo
restic init --repo "D:\backup\repo" --password-file "C:\ProgramData\Restic\password.txt"
# 示例1
restic init --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
出力 created restic repository ... それが成功です。ウェアハウスのパスワードを失うと、すべてのバックアップを永久に復元することはできません。使用することをお勧めします restic key add バックアップ キーを追加し、安全な場所に保管します。
4. コアバックアップ: バックアップ (Windows Server 2019 に必要) --use-fs-snapshot)
実行中のファイルは Linux で直接バックアップできます。 Windows 上の多数のファイル (データベース、IIS ログ、システム ファイルなど) がプロセスによってロックされます。VSS スナップショットを追加しないと、次のような問題が発生します。 Access is denied またはファイルがスキップされます。 Restic は Windows でサポートされています --use-fs-snapshotボリューム シャドウ コピー サービスを通じてファイルを一貫した状態で読み取ります。
基本的なバックアップ コマンド (管理者 PowerShell) :
restic backup C:\Data D:\AppData `
--use-fs-snapshot `
--repo "D:\jg_cpz\minio_backup" `
--password-file "C:\Program Files\Restic\restic_backup_passwd.txt" `
--exclude-file "C:\ProgramData\Restic\exclude.txt" `
--compression better `
--tag server-data
共通パラメータ (Windows と同等) :
--use-fs-snapshot # Windows 必加,处理锁定文件
--exclude C:\Data\tmp # 排除目录
--exclude-file exclude.txt # 批量排除,一行一个 Windows 路径
--compression better # auto|off|fastest|better|max
--dry-run # 试运行,不写仓库
--host WS2019-DB01 # 手动指定主机名
例: SQL Server ホット スタンバイ (ランディング ファイルなし)
SQL Server がサーバー上で実行されている場合は、次を使用できます。 sqlcmd 出力ストリームは、巨大な生成を避けるために Restic に直接パイプされます。 .bak 一時ファイル:
sqlcmd -S localhost -E -Q "BACKUP DATABASE [YourDB] TO DISK = 'NUL' WITH COPY_ONLY" |
restic backup --stdin --tag mssql
知らせ:TO DISK = 'NUL' 実際のファイルは生成されず、データ フローは直接 Restic に進みます。確保する必要がある sqlcmd 使用可能であり、実行アカウントにはバックアップ権限があります。
5. スナップショット管理: スナップショット/削除/プルーン
スナップショットを表示する
restic snapshots
restic snapshots --tag server-data
restic snapshots --host WS2019-DB01
restic snapshots latest
# 示例
restic snapshots --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出结果:
D:\jg_cpz> restic snapshots --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
repository 2086c998 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
--------------------------------------------------------------------------------------
4d9d5fbb 2026-10-24 08:52:24 ecs-240e-0002 server-data D:\minio 1.218 GiB
5e8acd11 2026-10-24 09:00:32 ecs-240e-0002 server-data D:\jg_cpz\gdal 222.012 MiB
--------------------------------------------------------------------------------------
Timestamps shown in local time
2 snapshots
restic snapshots --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" latest
# 输出结果:
D:\jg_cpz> restic snapshots --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" latest
repository 2086c998 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
--------------------------------------------------------------------------------------
5e8acd11 2026-10-24 09:00:32 ecs-240e-0002 server-data D:\jg_cpz\gdal 222.012 MiB
--------------------------------------------------------------------------------------
Timestamps shown in local time
1 snapshots
古いスナップショットを自動的にクリーンアップするforget 削除対象にマークを付けるだけで、prune その後初めて、データ ブロックが実際にリサイクルされます。運用環境は 2 つのステップで実行することをお勧めします。 forget 結果が正しくなった後、 prune:
# forget 命令的作用是删除快照记录。注意,它不会立刻释放硬盘空间,它只是把备份的“目录”删了。
#--keep-daily 7:保留最近 7 天,每天的最后一个快照。
#--keep-weekly 4:保留最近 4 周,每周的最后一个快照。
#--keep-monthly 6:保留最近 6 个月,每个月的最后一个快照。
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6
restic prune
指定されたスナップショットを削除します
指定されたレスティックスナップショットを削除します。コアコマンドは restic forget <快照ID>。この操作は 2 つの手順で実行されます。forget スナップショットの「レコード」を削除する責任を負いますが、 prune 占有されているディスク領域を実際に解放する責任を負います。
🔍 ステップ 1: 削除するスナップショット ID を見つける
まず、すべてのスナップショットをリストし、ターゲット スナップショットの ID を見つける必要があります。
restic -r "D:\jg_cpz\minio_backup" snapshots
# 示例:
D:\tmp> restic --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" snapshots
# 输出:
repository 2086c998 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
--------------------------------------------------------------------------------------
4d9d5fbb 2026-10-24 08:52:24 ecs-240e-0002 server-data D:\minio 1.218 GiB
5e8acd11 2026-10-24 09:00:32 ecs-240e-0002 server-data D:\jg_cpz\gdal 222.012 MiB
fe28025e 2026-10-24 12:00:58 ecs-240e-0002 mysqbackup D:\backup 62.101 GiB
de371bec 2026-10-24 14:02:34 ecs-240e-0002 server-data D:\backup 63.536 GiB
D:\jg_cpz\gdal
D:\minio
--------------------------------------------------------------------------------------
Timestamps shown in local time
4 snapshots
# 示例:
D:\tmp> restic -r "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" snapshots
# 输出:
repository 2086c998 opened (version 2, compression level auto)
ID Time Host Tags Paths Size
--------------------------------------------------------------------------------------
4d9d5fbb 2026-10-24 08:52:24 ecs-240e-0002 server-data D:\minio 1.218 GiB
5e8acd11 2026-10-24 09:00:32 ecs-240e-0002 server-data D:\jg_cpz\gdal 222.012 MiB
fe28025e 2026-10-24 12:00:58 ecs-240e-0002 mysqbackup D:\backup 62.101 GiB
de371bec 2026-10-24 14:02:34 ecs-240e-0002 server-data D:\backup 63.536 GiB
D:\jg_cpz\gdal
D:\minio
--------------------------------------------------------------------------------------
Timestamps shown in local time
4 snapshots
実行後はリストが表示されるので、ID この列はスナップショットの一意の識別子 (通常は 8 桁の短い ID) です。
🗑️ ステップ 2: 削除を実行する
ここには 2 つの方法があり、どちらかを選択できます。
方法1:2段階で実行する(より安全かつ確認しやすい)
-
スナップショット レコードのみを削除する:
forgetこのコマンドはスナップショットへの参照を削除するだけで、スペースをすぐには解放しません。restic -r "D:\jg_cpz\minio_backup" forget <快照ID> # 示例: restic -r "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" forget 4d9d5fbb -
ディスク容量を解放する: それから実行します
pruneこれにより、ウェアハウスがスキャンされ、どのスナップショットからも参照されなくなった「孤立した」データ ブロックが削除されます。restic -r "D:\jg_cpz\minio_backup" prune # 示例: restic -r "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" prune
方法 2: ワンステップ (推奨)
直接 forget コマンドの後に追加 --prune パラメーターを指定すると、restic はスナップショットの削除後に自動的にクリーンアップを実行します。
restic -r "D:\jg_cpz\minio_backup" forget <快照ID> --prune
# 示例:
restic -r "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" forget fe28025e --prune
知らせ:prune 倉庫で再梱包しますので、他のバックアップ タスクと同時に実行することはできませんそうしないと、ライブラリがロックされ、エラーが報告されます。ビジネスの閑散期に、また、
バックアップ タスクは時間差で行われます。
削除ロジックに注意してください: 次の 2 つの状況
シナリオ 1: このファイルは他の保持されたスナップショットにも存在します (最も一般的)
結論: ファイルはまだ存在しており、復元できます。
- 原理: 同じファイルを毎日バックアップすると仮定します。
app.log。スナップショット A は 1 日目に保存し、スナップショット B も 2 日目に保存しました。 Restic は一番下にのみ存在します1食分データ ブロック、スナップショット A およびスナップショット B は、「ポインター」を介してこのデータ ブロックのみを指します。 - 操作する: 使用する場合
forgetスナップショット A が削除され、実行されましたprune。 Restic がクリーニングしているときに、「スナップショット A はなくなっていますが、スナップショット B はまだこのデータ ブロックを使用している」ことがわかります。予約するこのデータ。 - 結果: スナップショット B を復元すると、このファイルはそのまま残ります。
シナリオ 2: このファイルは削除されたスナップショット (固有のデータ) に「のみ属します」
結論: 実行したら pruneファイルは物理的に完全に削除されており、復元できません。
- 原理: スナップショット A にファイルを保存するとします。
only_in_A.txtその後、このファイルをソース ディレクトリから削除したため、後続のスナップショット B と C にはそのファイルがありません。スナップショット A を実行するとforgetそして追加しますprune最後に、レスト スキャンにより、まだこのデータを参照しているスナップショットが存在しないことが判明したため、ハードディスクからデータが取得されました。完全に消去するそれ。 - 結果: 将来スナップショット B または C が復元されるとき、このファイルはそこには存在しません。スナップショットAの記録も消えています。このデータは「灰になった」。
6. リカバリ: 復元 (最も重要な機能)
ターゲットディレクトリに復元
restic restore <快照ID> --target D:\Restore
restic restore 4d9d5fbb --target D:\tmp --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
単一のディレクトリまたはファイルのみを復元します
restic restore <快照ID> --target D:\Restore --include "/D/minio/data"
# 例如:
# 注意 --include "/D/minio/data" 的路径不能是:"\D\minio\data"
restic restore 4d9d5fbb --target D:\tmp --include "/D/minio/data" --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
単一ファイルを直接エクスポートする
restic dump <快照ID> "/D/minio/config/minio.env" > D:\test.txt
# 示例:
restic dump 4d9d5fbb --repo "D:\jg_cpz\minio_backup1" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" "/D/minio/config/minio.env"> D:\tmp\minio.env
スナップショット内のファイルをリストする
restic ls <快照ID>
# 示例:
# 用 restic ls 命令看一眼快照 4d9d5fbb 的目录结构,确认 data 文件夹到底是以什么路径存储的。
restic ls 4d9d5fbb --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
restic ls <快照ID> "/D/minio/config"
# 示例:
restic ls 4d9d5fbb --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt" "/D/minio/config"
# 输出:
repository 2086c998 opened (version 2, compression level auto)
[0:00] 100.00% 4 / 4 index files loaded
snapshot 4d9d5fbb of [D:\minio] at 2026-10-24 08:52:24.1702605 +0800 CST by ECS-240E-0002\Administrator@ecs-240e-0002 filtered by [/D/minio/config]:
/D/minio/config
/D/minio/config/minio.env
ウェアハウス全体でファイル名を検索する
restic find "filename.txt" <快照ID>
# 示例:
restic find "minio.env" 4d9d5fbb --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出:
repository 2086c998 opened (version 2, compression level auto)
[0:00] 100.00% 4 / 4 index files loaded
Found matching entries in snapshot de371bec from 2026-10-24 14:02:34
/D/minio/config/minio.env
Found matching entries in snapshot 4d9d5fbb from 2026-10-24 08:52:24
/D/minio/config/minio.env
⚠️ Windows リカバリの重要な制限事項: Windows 上のファイルの Restic ACL と所有者バックアップ/復元機能には制限があります。一部のバージョンでは SecurityDescriptor サポートが改善されていますが、依然として Backup Operators グループのメンバーシップまたはそれに対応する権限。回復後に権限の例外が発生した場合は、手動での修正が必要になる場合があります。
7. 倉庫検証(サイレントダメージを防ぐため、運用保守時に必ず行う必要があります)
サイレントディスクの損傷やビットの破損は肉眼では検出できないため、定期的に検出する必要があります check:
restic check
# 示例:
restic check --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出:
using temporary cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-2435865498
create exclusive lock for repository
repository 2086c998 opened (version 2, compression level auto)
created new cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-2435865498
load indexes
[0:00] 100.00% 4 / 4 index files loaded
check all packs
check snapshots, trees and blobs
[0:00] 100.00% 4 / 4 snapshots
no errors were found
より厳密な完全なデータ検証 (低速):
restic check --read-data
# 示例:
restic check --read-data --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出:
using temporary cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-1059252936
create exclusive lock for repository
repository 2086c998 opened (version 2, compression level auto)
created new cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-1059252936
load indexes
[0:00] 100.00% 4 / 4 index files loaded
check all packs
check snapshots, trees and blobs
[0:00] 100.00% 4 / 4 snapshots
read all data
[0:40] 100.00% 120 / 120 packs
no errors were found
妥協 (ランダムサンプリング):
restic check --read-data-subset 10%
# 示例:
restic check --read-data-subset 10% --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出:
using temporary cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-2999965827
create exclusive lock for repository
repository 2086c998 opened (version 2, compression level auto)
created new cache in C:\Users\ADMINI~1\AppData\Local\Temp\1\restic-check-cache-2999965827
load indexes
[0:00] 100.00% 4 / 4 index files loaded
check all packs
check snapshots, trees and blobs
[0:00] 100.00% 4 / 4 snapshots
read 10.0% of packfiles
[0:04] 100.00% 12 / 12 packs
no errors were found
ベストプラクティス: 週に 1 回実行 check失敗するとアラームがトリガーされます。バックアップが途中で中断された場合、 repository locked:
restic unlock
# 示例:
restic unlock --repo "D:\jg_cpz\minio_backup" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
# 输出:
repository 2086c998 opened (version 2, compression level auto)
8. 倉庫間コピー スナップショット: コピー (オフサイト災害復旧 3-2-1)
ローカルウェアハウスのスナップショットをオフサイトの OSS または別のサーバーに同期します。
restic copy --repo D:\Backup\restic-repo `
--repo2 s3: `
<快照ID>
# 示例:
restic copy --repo "D:\jg_cpz\minio_backup" `
--repo2 s3: `
5e8acd11 `
--password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
注: Restic copy コマンドを実行する前に、同じ PowerShell ウィンドウで次のコマンドを実行して環境変数を設定します。これらの変数は現在のウィンドウ内でのみ有効で、閉じると無効になります。
repo2 を使用する前に初期化が必要です。
$env:AWS_ACCESS_KEY_ID = "你的AccessKey"
$env:AWS_SECRET_ACCESS_KEY = "你的SecretKey"
$env:AWS_DEFAULT_REGION = "us-east-1" # MinIO 通常需要,可任意指定,但必须存在
# 使用前需要初始化
restic init --repo "s3:" --password-file "C:\Program Files\Restic\restic_backup_passwd.txt"
すべてのスナップショットをコピーする場合は省略します <快照ID>。copy グローバル重複排除を使用すると、ターゲット ウェアハウスの欠落したデータ ブロックのみが転送され、同じコンテンツが繰り返しアップロードされることはありません。
9. 自動化スクリプト + タスクスケジューラ
Windows Server 2019の使用タスクスケジューラ自動起動とスケジュールされたバックアップ、ステータスの電子メール通知を実現します。
スクリプトの中心となるロジックは次のとおりです。実行するたびに、まずウェアハウスが初期化されているかどうかを確認し、初期化されていない場合は実行します。 restic init; その後、バックアップを実行し、最終ステータスに基づいて電子メールを送信します。。
# C:\Program Files\Restic\restic-backup.ps1(管理员/SYSTEM 权限运行)
$ErrorActionPreference = "Stop"
# ========== 1. 基础配置 ==========
# ========== 性能参数 ==========
$env:RESTIC_PACK_SIZE = "128" # 本地仓库建议 64~128
$env:RESTIC_REPOSITORY = "D:\jg_backup"
$env:RESTIC_PASSWORD_FILE = "C:\Program Files\Restic\restic_backup_passwd.txt"
$env:EXCLUDE_FILE = "C:\Program Files\Restic\exclude.txt"
$backupPaths = @("D:\jg_cpz","D:\minio")
$RepoConfigFile = "D:\jg_backup\config" # restic 仓库的标志性文件
$MailParams = @
# 邮件失败时写入本地日志,避免因邮件问题中断备份
"邮件通知失败:$($_.Exception.Message)"
# 引入 Mailozaurr
Import-Module Mailozaurr -ErrorAction Stop
# ========== 2. 辅助函数:发送邮件 ==========
function Send-BackupMail {
param([string]$Subject, [string]$Body, [string]$Priority = "Normal")
$mail = @
# 邮件失败时写入本地日志,避免因邮件问题中断备份
"邮件通知失败:$($_.Exception.Message)"
try
# 邮件失败时写入本地日志,避免因邮件问题中断备份
"邮件通知失败:$($_.Exception.Message)" catch {
# 邮件失败时写入本地日志,避免因邮件问题中断备份
"邮件通知失败:$($_.Exception.Message)" | Out-File "C:\Program Files\Restic\mail-failure.log" -Append
}
}
# ========== 3. 仅首次运行:初始化仓库 ==========
if (-not (Test-Path $RepoConfigFile)) {
try {
restic init --repo $env:RESTIC_REPOSITORY --password-file $env:RESTIC_PASSWORD_FILE 2>&1 | Out-File "C:\Program Files\Restic\init.log" -Append
if ($LASTEXITCODE -eq 0) {
Send-BackupMail -Subject "[Restic] 仓库初始化成功 $(hostname)" `
-Body "仓库 $($env:RESTIC_REPOSITORY) 已初始化完成。`n时间:$(Get-Date)"
} else {
Send-BackupMail -Subject "[CRIT] [Restic] 仓库初始化失败 $(hostname)" `
-Body "restic init 退出码 $LASTEXITCODE,请检查 init.log。" -Priority High
exit 1 # 初始化失败则不继续备份
}
} catch {
Send-BackupMail -Subject "[CRIT] [Restic] 仓库初始化异常 $(hostname)" `
-Body $_.Exception.Message -Priority High
exit 1
}
}
# 初始化成功后,继续执行备份
# ========== 4. 执行备份 ==========
$ErrorActionPreference = "Continue"
# Restic 在备份前会并发统计文件数量和总大小,用于估算进度,这个扫描阶段在文件多时会产生大量额外 I/O,拖慢整体速度。加上 --no-scan 可以跳过这一阶段
$LogFile = "C:\Program Files\Restic\logs\backup-$(Get-Date -Format 'yyyyMMdd-HHmm').log"
restic backup $backupPaths `
--use-fs-snapshot `
--no-scan `
-o vss.provider=MS `
--repo $env:RESTIC_REPOSITORY `
--password-file $env:RESTIC_PASSWORD_FILE `
--exclude-file $env:EXCLUDE_FILE `
--compression better `
--tag server-data *>> $LogFile
$ret = $LASTEXITCODE
# ========== 5. 根据备份状态发送通知 ==========
# ========== 构造带日志的邮件正文 ==========
function Get-LogTail {
param([string]$Path, [int]$Lines = 80)
if (-not (Test-Path $Path)) { return "(日志文件不存在)" }
$content = Get-Content -Path $Path -Tail $Lines -ErrorAction SilentlyContinue
if (-not $content) { return "(日志为空)" }
return ($content -join "`r`n")
}
# 清理旧快照(分两步,确认后再 prune)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 *>> $LogFile
restic prune *>> $LogFile
restic check *>> $LogFile
$logTail = Get-LogTail -Path $LogFile -Lines 80
if ($ret -eq 0) {
$subject = "[OK] [Restic] 备份成功 $(hostname)"
$body = "备份完成。`n日志文件:$LogFile`n`n===== 末尾日志 =====`n$logTail"
Send-BackupMail -Subject $subject -Body $body
}
elseif ($ret -eq 3) {
$subject = "[WARN] [Restic] 备份部分文件失败 $(hostname)"
$body = "退出码 3,快照已生成但部分文件被跳过。`n日志文件:$LogFile`n`n===== 末尾日志 =====`n$logTail"
Send-BackupMail -Subject $subject -Body $body -Priority High
}
else {
$subject = "[CRIT] [Restic] 备份失败 $(hostname)"
$body = "退出码 $ret。`n日志文件:$LogFile`n`n===== 末尾日志 =====`n$logTail"
Send-BackupMail -Subject $subject -Body $body -Priority High
exit $ret
}
主要な設計ノート
①初期化の冪等判定Test-Path $RepoConfigFile ウェアハウスのルートディレクトリに存在するかどうかを確認します config 書類。restic init 成功後にファイルが生成されるため、直接繰り返し実行するよりもこの判断が適切です。 restic init より安全 – ウェアハウスがすでに存在する場合、後者はエラーを報告して終了します。のみ config 初期化ブランチは、「初回実行のみ」の要件を満たすブランチが存在しない場合にのみ選択されます。
②初期化に失敗したら終了
初期化に失敗した直後 exit 1これ以上バックアップは実行されません。ウェアハウスが利用できない場合、バックアップは必然的に失敗するため、実行を継続しても意味のないエラー ログが生成されるだけです。
③メール通知のタイミング
このスクリプトは、次の 3 つの主要なノードで電子メールを送信します。初期化成功/失敗、バックアップ成功/部分失敗/完全失敗。メール送信自体の場合 try/catch パッケージでは、SMTP サーバーが一時的にアクセスできない場合でも、バックアップ プロセスは中断されませんが、ローカル ログに書き込むようにダウングレードされます。
④ 優先順位付け
バックアップ成功 Normal警告と致命的なエラーの場合 Highこれにより、電子メール クライアントや後続のアラーム ルールによる差別化された処理が容易になります。
タスク スケジューラ タスクを作成する (管理者 PowerShell)
Restic Windows で VSS スナップショットを完全に利用するには、タスク ID が次のとおりである必要があります。 「サービスとしてログイン」 そしてバックアップ権限。最も簡単な方法は、 SYSTEM 実行して「最高の特権で実行する」にチェックを入れます。
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File `"C:\Program Files\Restic\restic-backup.ps1`""
$trigger = New-ScheduledTaskTrigger -Daily -At "23:00PM"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "Restic Backup" -Action $action -Trigger $trigger -Principal $principal
GUIでも利用可能タスクスケジューラでタスクを作成し、トリガーとして「毎日」を選択し、アクションを PowerShell スクリプトに指定してチェックを入れます。「最高の特権で実行する」「全般」で「ユーザーがログインしているかどうかに関係なく実行する」を選択します。
導入リマインダー
- マイロザウルのインストール: で
SYSTEM実行中のタスク プランでは、モジュールを次の場所にインストールする必要があります。システムレベルパスを指定する場合は、事前に管理者の PowerShell で実行することをお勧めしますInstall-Module Mailozaurr -Scope AllUsers -Force。 - 資格情報のセキュリティ: 例のパスワードはプレーンテキストです。実稼働環境では代わりにこれを使用することをお勧めします。 Windows 資格情報マネージャー または、暗号化された CLIXML ファイルを使用して SMTP パスワードを読み取り、スクリプトの漏洩を防ぎます。
- 初期化ログ:
init.logバックアップログとは別に保存されるため、障害発生時にウェアハウスの作成やバックアップの実行に問題があるのかをすぐに区別するのに便利です。