Tôi sẽ viết một kịch bản kiểm tra nếu một bản sao lưu hơn 1,7 hoặc 30 ngày tuổi và hành động tương ứng. Bạn chưa nói như vậy nhưng tôi giả sử bạn đang sử dụng Linux (tôi đã thêm thẻ linux vào câu hỏi của bạn) và bạn đang sao lưu vào một máy chủ từ xa. Bước đầu tiên sẽ là viết một đoạn script nhỏ chạy rsync
lệnh của bạn và cũng tạo một tệp trên máy chủ từ xa khi sao lưu xong. Điều này sẽ được sử dụng cả để cho biết liệu một bản sao lưu hiện đang chạy hay không và để kiểm tra tuổi của bản sao lưu (Tôi giả sử bạn đang giữ dấu thời gian ban đầu khi bạn sao lưu các tệp, vì vậy bạn không thể tự lấy ngày từ các tệp):
Tập lệnh Rsync (điều này giả sử bạn có quyền truy cập không cần mật khẩu vào máy chủ từ xa):
#!/usr/bin/env bash
ssh user@remote rm /path/to/daily/backup/backup_finished.txt
rsync /path/to/source/ user@remote:/path/to/daily/backup/
ssh user@remote touch /path/to/daily/backup/backup_finished.txt
Trên máy cục bộ , hãy thiết lập một công việc định kỳ thực hiện sao lưu hàng ngày:
@daily rsync_script.sh
Trên máy từ xa , bạn cần chạy tập lệnh tôi đưa ra bên dưới cứ sau vài giờ:
@hourly check_backup.sh
Kịch bản check_backup.sh:
#!/usr/bin/env bash
daily=/path/to/daily;
weekly=/path/to/weekly;
monthly=/path/to/monthly;
## The dates will be measured in seconds since the UNIX epoch,
## so we need to translate weeks and months (31 days) to seconds.
week=$((60*60*24*7));
month=$((60*60*24*31));
## Make sure no backup is currently running
if [ ! -e $daily/backup_finished.txt ]; then
echo "A backup seems to be running, exiting." && exit;
fi
## Get the necessary dates
weekly_backup_date=$(stat -c %Y $weekly/backup_finished.txt)
monthly_backup_date=$(stat -c %Y $monthly/backup_finished.txt)
now=$(date +%s)
monthly_backup_age=$((now - monthly_backup_date))
weekly_backup_age=$((now - weekly_backup_date))
## Check the age of the daily backup and copy it accordingly
if [[ "$monthly_backup_age" -gt "$month" ]]; then
## Copy unless the current $daily is identical to $weekly
diff $daily $weekly > /dev/null ||
## Delete the previous backup and copy the new one over
rm -rf $monthly && cp -rp $daily $monthly
fi
## Copy the weekly backup if it is older than a week but only
## if it is not identical to $monthly. The -r flag makes cp
## recursive and the -p flag makes it preserve dates and permissions.
if [[ "$weekly_backup_age" -gt "$week" ]]; then
## Copy unless the current $daily is identical to $monthly
diff $daily $monthly > /dev/null ||
rm -rf $weekly && cp -rp $daily $weekly
fi
Vì vậy, tập lệnh này ( check_backup.sh
) sẽ được chạy mỗi giờ trên máy chủ dự phòng của bạn. Vì nó không làm gì trừ khi bản sao lưu đủ cũ, không có vấn đề gì khi nó chạy thường xuyên như vậy. Bây giờ, mỗi khi sao lưu hàng ngày cũ hơn 31 ngày, nó sẽ được sao chép vào monthly
thư mục và nội dung của monthly
nó sẽ bị xóa. Tương tự cho hàng tuần khi sao lưu hơn 7 ngày tuổi.
Tôi đang sử dụng diff
để so sánh các bản sao lưu. Điều này có nghĩa là chúng tôi sẽ sao chép daily
vào weekly
nếu hiện tại weekly
hơn một tuần nhưng chỉ khi bản sao lưu sẽ được sao chép (hiện tại daily
) không giống với hiện tại weekly
và tương tự monthly
. Ví dụ: nếu tập lệnh vừa chạy và nó đã thấy rằng bản sao lưu hàng tháng giống với bản sao hàng tuần hiện tại, nó sẽ không ghi đè lên bản hiện có monthly
. Tuy nhiên, một tuần sau khi ý weekly
chí đã thay đổi, thì nó sẽ sao chép lại monthly
.
Kết quả cuối cùng của việc này là bất cứ lúc nào bạn nên có tối thiểu hai bản sao lưu khác nhau và thông thường bạn sẽ có ba bản sao lưu. Trường hợp xấu nhất là một cái gì đó không thành công và bạn không có bản sao lưu một tuần tuổi, chỉ một tháng tuổi hoặc ngược lại , bạn không có một tháng tuổi nhưng bạn có tuần trước.