低成本方案,数据备份至阿里云oss

接上一篇 【自动化数据备份】

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

开通阿里云oss,以下为各个服务存储对比

image-20230917112327540

开通年包

image-20230917112240847

40G的空间我们预估可以存多少天

目前来看我的网站备份文件+数据库备份文件为17M大小,按照首年预估 均值每天50M吧

一年存储容量为 50M*365天=17G左右 也就是说 9块 可以将网站恢复到一年中的任何时候

以年为单位的清理一次就行(9块钱,买不了吃亏,买不了上当)

购买具体配置参考这篇文章(也可以用起来,不用设置图片路径简直不要太爽)

目标:我们需要获取三个配置

keyid:
keysecret:
endpoing

新增用户

image-20230917120109557

image-20230917115805495

创建用户会得到

keyid:
keysecret:

新增授权

image-20230917115926742

提取endpoint

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

image-20230917120409466

image-20230917120608844

image-20230917120806552

根据说明粘贴并加上前缀

image-20230917120913095

这里得到了endpoint

endpoint:    https://oss-cn-shenzhen.aliyuncs.com

这样就得到了三个配置项

访问oss只需要这几个就可以,不过我们还需对oss创建目录

https://oss.console.aliyun.com/bucket

image-20230917131818184

image-20230917132007394

备份文件

安装以及配置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

提示默认配置文件会存放到该目录,回车就行

image-20230917132543936

image-20230917133146222

配置完成后可查看该文件

image-20230917133528087

image-20230917133739968

接下来就可以开始备份了

开始备份

只上传目录中变化的文件

可以使用 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/

执行:

image-20230917135517578

  1. 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个文件都成功上传了。
  2. average speed 12896000(byte/s)

    • 这表示上传的平均速度是12,896,000字节/秒,也就是大约12.9MB/s。
  3. 4.065132(s) elapsed

    • 这表示上传操作总共花费了4.065132秒。

总的来说,这个输出告诉你 ossutil 成功地上传了3个文件,总大小为52.4MB,平均速度为12.9MB/s,总共花费了4.07秒。

阿里云oss查看

image-20230917135644529

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

image-20230917141528720

  1. 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字节。
  2. average speed 5028000(byte/s)

    • 这表示上传的平均速度是5,028,000字节/秒,也就是大约5.03MB/s。
  3. 3.478022(s) elapsed

    • 这表示上传操作总共花费了3.478022秒。

总结:在/www/backup/site目录中,有4个文件被检查。其中1个文件因为在OSS中没有相应的版本或有所变化而被上传,其他3个文件因为与OSS中的版本相同而被跳过。上传的平均速度为5.03MB/s,总共花费了3.48秒。

由此看来成功了

image-20230917141824677

实际应用

需求:我需要上传两个文件目录,一个是网站的备份目录,一个是数据库的备份目录,并且我希望使用自动化脚本每天备份一次

我要上传的目录为/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.sh

setup_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 相关的所有定时任务都将被移除。

image-20230917150114344

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

如果觉得我的文章对你有用,请随意赞赏