服务器数据库零成本自动化数据备份方案

更新于2024-11-05 08:00:0010 分钟4 千字4141885300
摘要

1、背景

本站只有一台机器,总担心云服务器哪天挂了导致数据丢失,辛辛苦苦写的文章丢了就难受了。

如果自己手动备份,比如说文章在网站发表后,再手动复制一份到其他云盘或者本地电脑,总感觉很麻烦。而且,如果遇到服务器挂了,数据库数据丢了,那手动备份在本地或者云盘的文章再恢复到网站数据库更是一件麻烦的事情。

想简单方便,最高效的办法自然是购买云服务器厂商的数据备份服务了。

但是,作为一个个人站长,总是想节约一些成本,毕竟都是用爱发电,💰钱花再少也是钱。于是,我把目标瞄向了零成本的数据备份实现方案。

本文将为您介绍一下,本站的数据库等服务器文件零成本自动化数据备份技术方案!

2、WebDAV & Cadaver

首先,简单向大家介绍一下零成本数据备份使用到的工具和协议。

2.1、WebDAV

以下描述来自ChatGPT:

WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP/HTTPS 协议的扩展,旨在为 Web 上的用户提供分布式的文件管理和编辑功能。它允许用户通过网络对远程服务器上的文档进行直接读写访问,类似于使用本地文件系统。 WebDAV 提供了一组标准的 HTTP 扩展,以便在 Web 上进行文件的创建、修改、移动、复制、删除等操作。通过使用 WebDAV,用户可以像使用本地文件系统一样操作远程服务器上的文件和目录,而无需使用特定的客户端软件。 WebDAV 的一些常见应用场景包括:

  • 在线文档协作:多个用户可以同时编辑同一文档,实现实时协作。
  • 远程文件管理:用户可以通过网络对远程服务器上的文件进行管理,如上传、下载、重命名、删除等操作。
  • 版本控制:WebDAV 还支持版本控制功能,允许用户对文档进行版本管理和历史记录查看。

总的来说,WebDAV 提供了一种方便的方式来实现远程文件管理和协作,使得用户可以更加灵活地利用网络资源进行工作和交流。

2.2、Cadaver

Cadaver 是一个基于命令行的 WebDAV 客户端,它允许用户通过命令行界面与 WebDAV 服务器进行交互。WebDAV 是一种用于在 Web 上进行文档管理和编辑的协议,它允许用户在远程服务器上执行文件操作,如创建、删除、复制、移动文件等。

使用 Cadaver,你可以通过命令行执行诸如上传文件、下载文件、创建目录等操作,而无需使用图形用户界面或者浏览器。这种命令行方式可以很方便地集成到脚本中,用于自动化文件管理任务。

例如,你可以使用 Cadaver 在命令行中执行如下命令来上传文件到 WebDAV 服务器:

cadaver https://example.com/webdav/
dav:/webdav/> put example.txt

3、实现方案与过程

了解完大概的技术背景后,我们直接开始实操……

3.1、支持WebDAV的云盘

首先,我们需要先准备一个支持WebDAV的云盘。

3.1.1、坚果云

国内支持WebDAV的云盘并不多,如果不考虑国外的云盘,可以尝试使用“坚果云”。

免费版的坚果云支持每个月1GB的上传流量,3GB的下载流量,如果只是备份数据库,也够用了。

如果你需要备份的数据比较多,可以考虑用云服务厂商的数据备份服务,或者开通坚果云会员。

(此处@坚果云,给我打钱!!!)

3.1.2、InfiniCloud

如果你需要备份的数据比较多,而且不想花钱,那我目前在用的InfiniCloud可能能够满足你的需求。

InfiniCloud(原TeraCLOUD)是日本的一家云盘,虽然在境外,但访问速度还可以,并且没有文件上传、下载的流量限制,云盘免费空间有25GB(之前搞活动可以有45GB的免费空间)。

可以访问下面网站进行注册,注册完毕后即有20GB永久免费空间。 https://infini-cloud.net/en/

大家注册完可以点击MyPage,找的Referral Bonus,输入我的邀请码 EVTHL 再领取额外的5GB永久免费空间。

(此处@InfiniCloud,给我打钱!!!)

申请完毕后,还是在当前页面,可以看到一个Apps Connection,请勾选☑️Turn on Apps Connection,会展示类似如下内容:

WebDAV Connection URL
Connection ID izhxxx
Apps Password (Password will not be displayed)Reissue

请记住url、ID和密码,密码忘记了可以点Reissue会重新给你发一个密码,但是之前的密码就用不了了。

这三个参数就是我们要配置 WebDAV 需要用到的链接参数,等下会用到。

(如果你用的是坚果云,坚果云官网应该有介绍的,本文就不赘述了。)

3.2、安装和配置Cadaver

准备工作已经完成了,此时我们便可以登录服务器安装、配置Cadaver,上传文件到云盘了。当然,如果你想备份本地机器的文件也可以可以的。

3.2.1、安装Cadaver

安装比较简单,如果是linux红帽系的系统,(如 CentOS、Fedora),你可以使用以下命令安装 cadaver

sudo yum install cadaver

在 Debian/Ubuntu 系统上:

sudo apt-get install cadaver

如果是其他系统,大家自行搜索吧,本文不赘述了。

安装完成后,可以输入以下命令进行测试,url需替换为你的云盘的url,正常会让你输入账号密码,登录成功后,便可以使用put操作将文件上传到云盘了。

cadaver 你的云盘的url

但是手动备份肯定不是我们想要的,我们期望可以自动化备份,不要着急,请继续往下看……

3.2.2、配置Cadaver

cadaver 使用一个名为 .netrc 的文件来存储用户的认证信息,包括用户名和密码。这个文件通常位于用户的家目录下(~/.netrc)。你可以手动编辑这个文件,也可以使用 cadaver 提供的命令来设置密码。

在服务器中输入

vim ~/.netrc

在文件中添加以下内容,替换 <username><password> 为你的 WebDAV 服务器的用户名和密码:(即我们刚刚拿到的url、ID和密码)

machine example.com
login <username>
password <password>

之后关闭保存文件,在命令行中再次输入 cadaver 你的url,正常便不需要密码了。

请注意,这种方法会将密码以明文形式存储在文件中,因此请确保你的计算机安全。

3.2.3、docker?

如果你不想再本机安装Cadaver,可以考虑使用docker,但是我用docker-compose配置没成功,索性直接安装在本机了,有成功的大佬可以评论区提供下方案~~

3.3、自动化备份

我这里用了一个shell脚本,自动将服务器的某一目录下文件上传至云盘。

3.3.1、上传脚本

首先,在你需要备份的文件夹中,执行 touch backup.sh命令创建一个backup.sh文件。

再执行 vim backup.sh命令进行编辑,输入以下内容:

其中,local_dir请换成你要备份的目录,cloud_root请换成你云盘的url,该脚本可以按照你备份目录的目录结构进行备份

#!/bin/bash

# 设置本地目录和云盘根目录
local_dir="/Users/izhxxx/Projects/Files/backup"
cloud_root="https://jike.teracloud.jp/dav"

# 定义一个函数,用于在云盘上创建目录
create_cloud_directory() {
  local relative_path="$1"
  local directory="$1"
  echo "create_cloud_directory: $cloud_root$relative_path  $directory "
  cadaver "$cloud_root" -t <<EOF
mkdir "$directory"
EOF
}

# 定义一个函数,用于上传文件到云盘
upload_cloud_file() {
  local item="$1"

  # 获取文件名和目录路径
  filename=$(basename "$item")
  directory=$(dirname "$item")
  # 检查目录路径是否与本地目录相同

  if [ "$directory" = "$local_dir" ]; then
    relative_path=""
  else
    # 取相对路径(相对于本地目录),确保不带开头的斜杠
    relative_path="${directory#"$local_dir"}"
  fi
  echo "upload_cloud_file: $item $cloud_root$relative_path"

  # 如果不是文件夹,则执行其他操作(这里可以添加你想要执行的命令)

  bash -c "cadaver "$cloud_root$relative_path" -t <<EOF
put \"$item\"
EOF" _ {} \;
}

# 定义一个函数,用于递归地扫描本地目录
scan_local_folder() {
  local folder="$1"

  # 遍历本地目录中的所有内容
  for item in "$folder"/*; do
    # 如果是文件夹,则递归调用该函数

    if [ -d "$item" ]; then
      # 取相对路径(相对于本地目录),确保不带开头的斜杠
      relative_path="${item#"$local_dir"/}"
      # 需要新建的文件夹名称
      directory="${item#"$folder"/}"

      # 在云盘上创建相应的目录结构

      create_cloud_directory "$relative_path" "$directory"

      # 递归遍历子目录
      scan_local_folder "$item"
    elif [ -f "$item" ]; then
      upload_cloud_file "$item"
    fi
  done
}

# 开始扫描本地目录
scan_local_folder "$local_dir"

之后将该脚本设置为可执行文件 chmod -x backup.sh,执行 ./backup.sh正常便可以将你的文件夹中的数据备份到云盘了,可以登录云盘查验一下。

3.3.2、定时自动备份

之后定时执行脚本便可以实现自动化定时备份了。

命令行输入 crontab -e,使用cron 作业调度程序来定时执行 shell 脚本。

cron 是一个在 Unix 和类 Unix 系统上运行的后台守护进程,它可以按照预定的时间间隔执行命令或脚本。

如果是第一次编辑 cron 作业列表,系统会提示你选择默认编辑器。选择你熟悉的编辑器,并打开一个新的文件用于编辑 cron 作业列表。

在打开的文件中,每一行代表一个 cron 作业,每个作业由五个字段组成,分别是分钟、小时、日期、月份和星期。你可以按照以下格式添加一个新的定时执行任务:

请将/path/to/your/backup.sh替换为你的backup.sh路径

0 0 * * * *  /path/to/your/backup.sh

cron 作业执行时产生的输出(包括标准输出和标准错误)会被发送到当前用户的邮件(如果有配置邮件系统的话)。如果你想将输出重定向到文件中,你可以在 cron 作业中使用重定向符号来指定输出文件的路径。

例如,你可以在 cron 作业中这样指定输出文件的路径:

* * * * * /path/to/your/script.sh >> /path/to/your/logfile.log 2>&1

这将会将脚本的标准输出和标准错误都追加到 /path/to/your/logfile.log 文件中。如果你希望每次执行都覆盖日志文件而不是追加到文件末尾,你可以使用单个大于号 > 来进行重定向:

* * * * * /path/to/your/script.sh > /path/to/your/logfile.log 2>&1

确保你有足够的权限来写入日志文件,否则会产生权限错误。

3.3.3、数据定时同步到备份文件夹

大家也可以选择之直接修改上面的自动备份脚本,直接将需要备份的文件夹定时上传到云盘。

我这里对功能做了拆分,同步就是单纯的同步任务,将服务器指定的文件夹备份到云盘。哪些文件需要备份到云盘的,再定时将文件同步到服务器的备份文件夹。

比如,我的备份文件夹是 /home/izhxxx/backup/,假如我需要备份 /home/izhxxx/wscoder/mysql,那我需要定时将 /home/izhxxx/wscoder/mysql同步到 /home/izhxxx/backup/,同步任务再定时将 /home/izhxxx/backup/的数据同步到云盘。

这样的好处是,备份任务比较独立,不需要感知各个业务的数据逻辑。

4、最后

大功告成!再也不用担心数据会丢失了!

希望本文对你有所帮助,原创内容,未经同意请勿转载!

哇塞码农,致力于分享程序员的精彩世界,欢迎大家关注下本站~👏

评论区

你认为这篇文章怎么样?
  • great
    0
  • happy
    0
  • doubt
    0
  • boring
    0
  • bad
    0

0/2048