本文记录自用服务器的数据备份方案。
是什么
三份备份:
两地存储:
为什么
特性 | 快照 | 增量备份 |
---|---|---|
创建速度 | 快速 | 较快 |
恢复速度 | 快速 | 较慢,需逐步应用所有增量备份 |
存储效率 | 高效,初始快照占用空间小 | 高效,仅备份变化数据 |
存储位置 | 通常在本地存储卷 | 通常在远程或外部存储 |
保护范围 | 对本地文件系统变化提供保护 | 提供对数据变化的全面保护 |
适用场景 | 快速恢复、测试和开发 | 日常备份、数据变化频繁的情况 |
sudo btrfs subvolume create /data/sub_volume_name
/data
必须是一个btrfs文件系统根目录。性质:
功能:
/usr/bin
下面。wget https://raw.githubusercontent.com/digint/btrbk/master/btrbk
chmod +x btrbk
sudo ./btrbk ls /
列出可用的btrfs文件系统(物理卷以及子卷)MOUNT_SOURCE ID FLAGS PATH
/dev/nvme1n1p1 5 - /data
/dev/nvme1n1p1 256 - /data/DockerAppData
/dev/nvme1n1p1 257 - /data/TestData
/dev/md0 5 - /hdd
mv btrbk /usr/bin
/etc/btrbk/btrbk.conf
文件# 文件系统内快照的配置
# 时间戳格式
timestamp_format long
# 快照至少存留的时间
snapshot_preserve_min 18h
# 持久化快照的间隔
snapshot_preserve 48h
# 远端目标位置中的配置(增量备份)
target_preserve_min no # 没有最小快照数量限制
target_preserve 20d 10w *m # 日快照保留20天 周快照10周 月快照永久保留
# 快照存储的目录 需要手动创建 并且在同一文件系统内
snapshot_dir /data/.btrbk_snapshots
# 需要备份的目录
volume /data
target /hdd/BtrbkSnapshots # target标志另一个文件系统的增量备份位置
subvolume /data/TestData
btrbk run -n -S
试运行一下,观察一下SNAPSHOT SCHEDULE
-----------------
ACTION SUBVOLUME SCHEME REASON
create /data/.btrbk_snapshots/TestData.20240701T2054 18h+ 48h preserve hourly: first of hour, 0 hours ago
BACKUP SCHEDULE
---------------
ACTION SUBVOLUME SCHEME REASON
create /hdd/BtrbkSnapshots/TestData.20240701T2054 20d 10w *m (sunday, 00:00) preserve monthly: first weekly of month 2024-06 (1 months ago, 1d 20h after sunday 00:00)
--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.33.0-dev)
Date: Mon Jul 1 20:54:48 2024
Config: /etc/btrbk/btrbk.conf
Dryrun: YES
Legend:
=== up-to-date subvolume (source snapshot)
+++ created subvolume (source snapshot)
--- deleted subvolume
*** received subvolume (non-incremental)
>>> received subvolume (incremental)
--------------------------------------------------------------------------------
/data/TestData
+++ /data/.btrbk_snapshots/TestData.20240701T2054
*** /hdd/BtrbkSnapshots/TestData.20240701T2054
NOTE: Dryrun was active, none of the operations above were actually executed!
btrbk run
创建第一个快照和备份文件。--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.33.0-dev)
Date: Tue Jul 2 00:45:54 2024
Config: /etc/btrbk/btrbk.conf
Legend:
=== up-to-date subvolume (source snapshot)
+++ created subvolume (source snapshot)
--- deleted subvolume
*** received subvolume (non-incremental)
>>> received subvolume (incremental)
--------------------------------------------------------------------------------
/data/TestData
+++ /data/.btrbk_snapshots/TestData.20240702T0045
*** /hdd/BtrbkSnapshots/TestData.20240702T0045
➜ /data rm -rf TestData
➜ /data ls
DockerAppData DockerAppData.backup TestData.backup
从快照恢复
➜ /data sudo btrbk list snapshots
SOURCE_SUBVOLUME SNAPSHOT_SUBVOLUME STATUS
/data/TestData /data/.btrbk_snapshots/TestData.20240702T0045 -
mv /data/TestData /data/TestData.BROKEN
➜ /data sudo btrfs subvolume snapshot /data/.btrbk_snapshots/TestData.20240702T0045 /data/TestData
Create a snapshot of '/data/.btrbk_snapshots/TestData.20240702T0045' in '/data/TestData'
➜ /data cd TestData
➜ TestData ls
FileBrowser MariaDB Memos NetData PhotoPrism
从增量备份恢复
sudo btrfs subvolume delete /data/.btrbk_snapshots/TestData.20240702T0105
➜ BtrbkSnapshots sudo btrfs send ./TestData.20240702T0105 | sudo btrfs receive /data/TestData.snapshot
At subvol ./TestData.20240702T0105
At subvol TestData.20240702T0105
➜ /data sudo btrfs subvolume snapshot /data/.btrbk_snapshots/TestData.20240702T0105 /data/TestData
Create a snapshot of '/data/.btrbk_snapshots/TestData.20240702T0105' in '/data/TestData'
➜ /data ls
DockerAppData DockerAppData.backup TestData TestData.backup
➜ /data sudo btrbk ls /
MOUNT_SOURCE ID FLAGS PATH
/dev/nvme1n1p1 5 - /data
/dev/nvme1n1p1 264 readonly /data/.btrbk_snapshots/TestData.20240702T0105
/dev/nvme1n1p1 256 - /data/DockerAppData
/dev/nvme1n1p1 265 - /data/TestData
/dev/md0 5 - /hdd
/dev/md0 257 readonly /hdd/BtrbkSnapshots/TestData.20240702T0105
➜ /data ls
DockerAppData DockerAppData.backup TestData TestData.backup
➜ /data cd TestData
➜ TestData ls
FileBrowser MariaDB Memos NetData PhotoPrism
#!/bin/bash
# 配置参数
OSSUTIL_PATH="/usr/bin/ossutil" # ossutil 的路径
LOCAL_DIR="/hdd/BtrbkSnapshots" # 本地备份目录
COMPRESSED_DIR="/hdd/CompressedArchives" # 压缩文档的目录
BUCKET_NAME="oss://alicloud-backup" # OSS 存储桶名称
LOG_FILE="./backup.log" # 日志文件路径
# 记录开始时间
echo "Starting backup to OSS at $(date)" >> $LOG_FILE
# 遍历本地备份目录中的所有增量备份文件
for backup_file in "$LOCAL_DIR"/*; do
# 获取增量备份文件的文件名
backup_filename=$(basename "$backup_file")
# 设置对应的压缩文件名(不加时间戳)
compressed_file="$COMPRESSED_DIR/${backup_filename}.tar.gz"
# 检查压缩文件是否已经存在
if [ -f "$compressed_file" ]; then
echo "Compressed file $compressed_file already exists. Skipping." >> $LOG_FILE
else
# 压缩增量备份文件
tar -zcf "$compressed_file" "$backup_file"
echo "Compressed $backup_file to $compressed_file." >> $LOG_FILE
fi
# 将压缩文件同步到 OSS 存储桶
$OSSUTIL_PATH cp --update "$compressed_file" $BUCKET_NAME >> $LOG_FILE 2>&1
# 检查上传是否成功
if [ $? -eq 0 ]; then
echo "Uploaded $compressed_file to OSS successfully." >> $LOG_FILE
else
echo "Failed to upload $compressed_file to OSS." >> $LOG_FILE
fi
done
echo "Backup process completed at $(date)" >> $LOG_FILE
0 3 * * * /usr/bin/btrbk --config /etc/btrbk/btrbk.conf run
0 4 * * * /home/zq/Scripts/OssBackup/backup_to_oss.sh