完整备份之累积备份 (Incremental backup)
- 还原的考虑
如果是完整备份的话。若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倾倒回去硬盘, 所有事情就搞定了!有些时候 (例如使用 dd 指令) 甚至连系统都不需要重新 安装!反正整个系统都给他倒回去,连同重要的 Linux 系统文件等,所以当然也就不需要重新安装。
那你知道完整备份的定义了吧?没错!完整备份就是将根目录 (/) 整个系统通通备份下来的意思!不 过,在某些场合底下,完整备份也可以是备份一个文件系统 (filesystem)!
- 累积备份的原则
虽然完整备份在还原方面有相当良好的表现,但是我们都知道系统用的越久,数据量就会越大!如此 一来, 完整备份所需要花费的时间与储存媒体的使用就会相当麻烦~所以,完整备份并不会也不太可能每天都进行的!那你想要每天都备份数据该如何进行呢?有两种方式啦,一种是本小节会谈到的累积备份,一种则是下个小节谈到的差异备份。
所谓的累积备份,指的是在系统在进行完第一次完整备份后,经过一段时间的运作, 比较系统与备 份文件之间的差异,仅备份有差异的文件而已。而第二次累积备份则与第一次累积备份的数据比较, 也是仅备份有差异的数据而已。如此一来,由于仅备份有差异的数据,因此备份的数据量小且快速! 备份也很有效率。 我们可以从下图来说明:
假如我在星期一作好完整备份,则星期二的累积备份是系统与完整备份间的差异数据;星期三的备份 是系统与星期二的差异数据, 星期四的备份则是系统与星期三的差异数据。你得要注意的是,星 期二的数据是完整备份加第一次累积备份, 星期三的数据是完整备份加第一次累积与第二次累积备 份,星期四的数据则是星期一的完整备份加第一次加第二次加第三次累积备份。 由于每次都仅与前 一次的备份数据比较而已,因此备份的数据量就会少很多!
那如何还原?经过上面的分析,我们也会知道累积备份的还原方面比较麻烦! 假设你的系统在星期 五的时候挂点了!那你要如何还原?首先,你必须要还原星期一的完整备份,然后还原星期二的累积 备份, 再依序还原星期三、星期四的累积备份才算完全复原!那如果你是经过了九次的累积备份, 就得要还原到第九次的阶段, 才是最完整的还原程序!
- 累积备份使用的备份软件
完整备份常用的工具有 dd, cpio, xfsdump/xfsrestore 等等。因为这些工具都能够备份装置与特殊文件! dd 可以直接读取磁盘的扇区 (sector) 而不理会文件系统,是相当良好的备份工具!不过缺点就是慢 很多! cpio 是能够备份所有档名,不过,得要配合 find 或其他找文件名的指令才能够处理妥当。 以上两个都能够进行完整备份, 但累积备份就得要额外使用脚本程序来处理。可以直接进行累积备 份的就是 xfsdump 这个指令啰!
# 1. 用 dd 来将 /dev/sda 备份到完全一模一样的 /dev/sdb 硬盘上:
[root@study ~]# dd if=/dev/sda of=/dev/sdb
# 由于 dd 是读取扇区,所以 /dev/sdb 这颗磁盘可以不必格式化!非常的方便!
# 只是你会等非常非常久!因为 dd 的速度比较慢!
# 2. 使用 cpio 来备份与还原整个系统,假设储存媒体为 SATA 磁带机:
[root@study ~]# find / -print | cpio -covB > /dev/st0 <==备份到磁带机
[root@study ~]# cpio -iduv < /dev/st0 <==还原
假设 /home 为一个独立的文件系统,而 /backupdata 也是一个独立的用来备份的文件系统,那如何 使用 dump 将 /home 完整的备份到 /backupdata 上呢?可以像底下这样进行看看:
# 1. 完整备份
[root@study ~]# xfsdump -l 0 -L 'full' -M 'full' -f /backupdata/home.dump /home
# 2. 第一次进行累积备份
[root@study ~]# xfsdump -l 1 -L 'full-1' -M 'full-1' -f /backupdata/home.dump1 /home
除了这些指令之外,其实 tar 也可以用来进行完整备份啦!举例来说,/backupdata 是个独立的文件 系统, 你想要将整个系统通通备份起来时,可以这样考虑:将不必要的 /proc, /mnt, /tmp 等目录不 备份,其他的数据则予以备份:
[root@study ~]# tar --exclude /proc --exclude /mnt --exclude /tmp
> --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /
完整备份之差异备份 (Differential backup)
差异备份与累积备份有点类似,也是需要进行第一次的完整备份后才能够进行。只是差异备份指的是: 每次的备份都是与原始的完整备份比较的结果。所以系统运作的越久,离完整备份时间越长, 那么 该次的差异备份数据可能就会越大!差异备份的示意图如下所示:
差异备份常用的工具与累积备份差不多!因为都需要完整备份嘛!如果使用 xfsdump 来备份的话, 那么每次备份的等级 (level) 就都会是 level 1 的意思啦!当然啦,你也可以透过 tar 的 -N 选项来 备份喔!如下所示:
[root@study ~]# tar -N '2015-09-01' -jpcv -f /backupdata/home.tar.bz2 /home
# 只有在比 2015-09-01 还要新的文件,在 /home 底下的文件才会被打包进 home.bz2 中!
# 有点奇怪的是,目录还是会被记录下来,只是目录内的旧文件就不会备份。
此外,你也可以透过 rsync 来进行镜像备份喔! 这个 rsync 可以对两个目录进行镜像 (mirror) ,算 是一个非常快速的备份工具!简单的指令语法为:
[root@study ~]# rsync -av 来源目录 目标目录
# 1. 将 /home/ 镜像到 /backupdata/home/ 去
[root@study ~]# rsync -av /home /backupdata/
# 此时会在 /backupdata 底下产生 home 这个目录来!
[root@study ~]# rsync -av /home /backupdata/
# 再次进行会快很多!如果数据没有更动,几乎不会进行任何动作!
关键数据备份
完整备份虽然有许多好处,但就是需要花费很多时间!所以,如果在主机提供的服务并不是一定要 24 小时提供的前提下, 我们可以仅备份重要的关键数据即可。由于主机即使当机个一两天可能也不会 影响到你的正常生活时, 仅备份关键数据就好啦!不需要整个系统都备份。仅备份关键资料是有许多好处的! 由于完整备份可能是在系统运作期间进行,不但会花费非常多时间,而且如果备份当时
系统已经被攻破, 那你备份的数据是有问题的,那还原回去也是有问题的系统啊!
如果仅是备份关键数据而已,那么由于系统的绝大部分执行档都可以后来重新安装,因此若你的系统 不是因为硬件问题, 而是因为软件问题而导致系统被攻破或损毁时,直接捉取最新的 Linux distribution ,然后重新安装, 然后再将系统数据 (如账号/密码与家目录等等) 与服务数据 (如 www/email/crontab/ftp 等等) 一个一个的填回去!
不过,备份关键数据最麻烦的地方其实就是在还原啦!上述的还原方式是你必须要很熟悉系统运作, 否则还原得要花费很多时间的!尤其近来的 Linux 强调安全性,所以加入 SELinux 了,你如果要从 旧版的 Linux 升级到新版时, 原本若没有 SELinux 而换成新版则需要启动 SELinux 时,那个除错 的时间会花很长一段日子哩! 这是仅备份关键数据的一些优缺点。
备份关键数据使用 tar 来处理了!如果想要分门别类的将各种不同的服务在不同的时间备份 使用不同档名, 配合 date 指令是非常好用的工具!例如底下的案例是依据日期来备份 mariadb 的 数据库喔!
[root@study ~]# tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql
备份是非常重要的工作,你可不希望想到才进行吧?交给系统自动处理就对啦!请自己撰写 script , 配合 crontab 去执行吧!这样子,备份会很轻松。