Linux 文件差异备份方案

题记

对于我这种大水比来说。。

能够搞出来已经很不错了。。虐心。。其实只是那么基础的东西。。

背景是这样的,我有服务器,有一个很多网站的 www 文件夹。

一直以来,我每天都会进行备份。备份的方式是,整个文件夹拷出来。

可是节约成本的我们很快就发现 15GB 的硬盘对于每天 300M 所有的备份,实在是吃不消,硬盘老是需要手工清理。

那么回想一下,其实完全无需每天重复备份那些重复的文件,应该采取差异备份方案,也就是说,月初做一次全量备份,然后每天备份那些改动时间戳在月初之后的文件。

这样要恢复任何一天的备份,只需要手持月初的全量备份,然后将差异备份覆盖进去,就可以得到当天的备份。

换句话说,绝大多数的情况下,差异备份应当是很少内容的。

那么问题来了,怎么整呢?

那当然是 bash 脚本了,中间虐心的菜鸟探索心路历程就省去了,直接上结果,虽然写出来的脚本是那么的很粗糙很繁琐很不专业,但是,能够搞出来已经很不错了。

一个能够将差异文件连路径复制到目标文件夹的函数

cp_month_diff() {

  # 第一个参数是源目录,请加上 / 结尾
  origin=$1

  # 第二个参数是目标目录,请加上 / 结尾
  target=$2

  # 获取当月第一天的参考时间点
  dt0=$(date +%Y%m01)

  # 提防下一步的搜索中可能会遇到的包含空格的文件名,需要修改分隔符
  # 参见:<http://www.2cto.com/os/201504/394478.html>
  IFS=$'\n'

  # 用 find -newermt 来列出变动过的文件(目录就省了),放到数组 files 里
  files=$(find $origin -type f -newermt $dt0)

  # 遍历 files 数组
  for file in $files
  do

    # 将原始文件名里面开头的原路径用正则删掉,接上目标路径,就是目标的文件路径
    newfile=${target}${file/#$origin/}

    # 计算目标路径的目录
    dir=$(dirname $newfile)

    # 连锁创建这个目录(因为目录不存在的话 cp 不进去)
    mkdir -p $dir

    # 将源文件复制到新路径
    cp $file $newfile

  done

}

然后,调用的话大概是这个样子:

cd /var/backups/backup_20150619
cp_month_diff /var/www/ ./

上面脚本的关键在于如下几点:

  1. find -newermt 列出所有的当月改动过的文件;
  2. 将上一步的结果完全按照字符串一个一个处理;
  3. 计算出目标的目录,并且创建目录再往里面拷;

对于高手来说,上述流程简直是又长又臭,但对于本菜鸟来说,起码能行。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/06/linux-backup-diff.html【Linux 文件差异备份方案】

发表评论

电子邮件地址不会被公开。 必填项已用*标注