低成本方案,数据备份至阿里云oss
接上一篇 【自动化数据备份】
上一篇我们可以将数据自动化备份至另一台服务器,对于学生党来说再来一台主机单独备份数据??? ,找到一个低成本解决方案阿里云oss , 其他家的云存储应该也可行
开通阿里云oss,以下为各个服务存储对比

开通年包

40G的空间我们预估可以存多少天
目前来看我的网站备份文件+数据库备份文件为17M大小,按照首年预估 均值每天50M吧
一年存储容量为 50M*365天=17G左右 也就是说 9块 可以将网站恢复到一年中的任何时候
以年为单位的清理一次就行(9块钱,买不了吃亏,买不了上当)
购买具体配置参考这篇文章(也可以用起来,不用设置图片路径简直不要太爽)
目标:我们需要获取三个配置
keyid:
keysecret:
endpoing新增用户


创建用户会得到
keyid:
keysecret:新增授权

提取endpoint
https://help.aliyun.com/zh/oss/developer-reference/configure-ossutil?spm



根据说明粘贴并加上前缀

这里得到了endpoint
endpoint: https://oss-cn-shenzhen.aliyuncs.com这样就得到了三个配置项
访问oss只需要这几个就可以,不过我们还需对oss创建目录
https://oss.console.aliyun.com/bucket


备份文件
安装以及配置ossutil
要将文件备份到阿里云OSS(Object Storage Service),可以使用阿里云提供的命令行工具 ossutil。以下是如何使用 ossutil 将文件备份到阿里云OSS的步骤:
官方文档地址:https://help.aliyun.com/zh/oss/developer-reference/configure-ossutil?spm
安装ossutil
sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash- 安装完成后,ossutil会安装到/usr/bin/目录下。
在/usr/bin/目录下输入配置命令。
./ossutil64 config提示默认配置文件会存放到该目录,回车就行


配置完成后可查看该文件


接下来就可以开始备份了
开始备份
只上传目录中变化的文件
可以使用 ossutil 的 --update 选项。这个选项确保只有在源路径(你的本地目录)中比目标路径(OSS中的路径)更新的文件才会被上传。
以下是如何使用 --update 选项上传目录中有变化的文件:
ossutil cp -r --update /local/path/to/directory/ oss://your-bucket-name/path/in/oss/其中:
-r表示递归复制,所以它会处理目录及其子目录中的所有文件。--update确保只上传那些在本地有更新的文件。/local/path/to/directory/是你要上传的本地目录的路径。your-bucket-name是你在OSS中创建的存储桶的名称。path/in/oss/是你希望在OSS中存储文件的路径。
使用这个命令,ossutil 会比较本地目录和OSS中的目标路径下的文件,只上传那些在本地有更新或是新添加的文件。
bucket: https://oss.console.aliyun.com/bucket
我要上传的目录为/www/backup/site
OSS中bucket的名称:newbie-typora
在OSS中存储文件的路径:typecho_backups/所以我的命令为
ossutil cp -r --update /www/backup/site oss://newbie-typora/typecho_backups/执行:

Succeed: Total num: 3, size: 52,410,186. OK num: 3(upload 3 files).
Total num: 3: 这表示总共处理了3个文件。size: 52,410,186: 这表示这3个文件的总大小为52,410,186字节。OK num: 3(upload 3 files): 这表示3个文件都成功上传了。
average speed 12896000(byte/s)
- 这表示上传的平均速度是12,896,000字节/秒,也就是大约12.9MB/s。
4.065132(s) elapsed
- 这表示上传操作总共花费了4.065132秒。
总的来说,这个输出告诉你 ossutil 成功地上传了3个文件,总大小为52.4MB,平均速度为12.9MB/s,总共花费了4.07秒。
阿里云oss查看

由于是第一次上传,我们增加一个文件看看是否只是上传更新的文件

Succeed: Total num: 4, size: 69,880,248. OK num: 4(upload 1 files, skip 3 files), Skip size: 52,410,186.
Total num: 4: 这表示在本地目录中总共检查了4个文件。size: 69,880,248: 这表示这4个文件的总大小为69,880,248字节。OK num: 4(upload 1 files, skip 3 files): 这表示总共有4个文件被处理。其中1个文件被上传,而其他3个文件由于没有变化(与OSS中的版本相同)而被跳过。Skip size: 52,410,186: 这表示被跳过的3个文件的总大小为52,410,186字节。
average speed 5028000(byte/s)
- 这表示上传的平均速度是5,028,000字节/秒,也就是大约5.03MB/s。
3.478022(s) elapsed
- 这表示上传操作总共花费了3.478022秒。
总结:在/www/backup/site目录中,有4个文件被检查。其中1个文件因为在OSS中没有相应的版本或有所变化而被上传,其他3个文件因为与OSS中的版本相同而被跳过。上传的平均速度为5.03MB/s,总共花费了3.48秒。
由此看来成功了

实际应用
需求:我需要上传两个文件目录,一个是网站的备份目录,一个是数据库的备份目录,并且我希望使用自动化脚本每天备份一次
我要上传的目录为/www/backup/site 以及 /www/backup/database
OSS中bucket的名称:newbie-typora
在OSS中存储文件的路径:typecho_backups/
执行两次命令即可将两个文件夹变化的文件上传
ossutil cp -r --update /www/backup/site oss://newbie-typora/typecho_backups/
ossutil cp -r --update /www/backup/database oss://newbie-typora/typecho_backups/创建两个脚本一个是设置定时任务的脚本 setup_backup.sh,另一个是实际执行备份的脚本 backup_script.sh。
backup_script.sh:
这个脚本包含实际的备份命令。
#!/bin/bash
ossutil cp -r --update /www/backup/site oss://newbie-typora/typecho_backups/
ossutil cp -r --update /www/backup/database oss://newbie-typora/typecho_backups/为此脚本添加执行权限:
chmod +x backup_script.shsetup_backup.sh:
这个脚本用于设置定时任务。
#!/bin/bash
# 获取当前脚本的目录
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# 询问用户选择执行的时间单位
while true; do
read -p "你想按照哪个时间单位执行备份脚本? (1. 分钟 2. 小时 3. 天) " unit_choice
case $unit_choice in
1) unit="分钟"; cron_unit="*"; break ;;
2) unit="小时"; cron_unit="hour"; break ;;
3) unit="天"; cron_unit="day"; break ;;
*) echo "错误: 请输入 1, 2 或 3。" ;;
esac
done
# 询问用户每隔多少时间单位执行
while true; do
read -p "每隔多少$unit你想运行备份脚本? " interval
if [[ "$interval" =~ ^[0-9]+$ ]]; then
case $cron_unit in
"*") [[ $interval -ge 1 && $interval -le 59 ]] && break || echo "错误: 请输入一个在1到59之间的数字。" ;;
"hour") [[ $interval -ge 1 && $interval -le 23 ]] && break || echo "错误: 请输入一个在1到23之间的数字。" ;;
"day") [[ $interval -ge 1 && $interval -le 31 ]] && break || echo "错误: 请输入一个在1到31之间的数字。" ;;
esac
else
echo "错误: 请输入一个有效的数字。"
fi
done
# 根据用户选择的时间单位设置cron
case $cron_unit in
"*") cron_time="*/$interval * * * *";;
"hour") cron_time="0 */$interval * * *";;
"day") cron_time="0 0 */$interval * *";;
esac
# 添加到cron
(crontab -l; echo "$cron_time $DIR/backup_script.sh") | crontab -
echo "备份脚本现在将每隔 $interval $unit 运行一次。"为此脚本添加执行权限:
chmod +x setup_backup.sh现在,你可以运行 ./setup_backup.sh 来设置定时任务。这将按照选择的时间间隔定期执行 backup_script.sh,从而执行备份操作。
要关闭特定的定时任务,我们需要从当前用户的 crontab 中移除它。以下是一个简单的脚本,将移除所有与 backup_script.sh 相关的定时任务:
remove_backup_cron.sh:
#!/bin/bash
# 获取当前脚本的目录
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# 移除所有与backup_script.sh相关的cron任务
crontab -l | grep -v "$DIR/backup_script.sh" | crontab -
echo "已移除与备份脚本相关的定时任务。"为此脚本添加执行权限:
chmod +x remove_backup_cron.sh现在,当运行 ./remove_backup_cron.sh 时,与 backup_script.sh 相关的所有定时任务都将被移除。

三个文件下载链接:https://newbie-typora.oss-cn-shenzhen.aliyuncs.com/code/oss_backup_bash.zip