20.4 备份的种类、频率与工具的选择

讲了好多口水了,还是没有讲到重点,真是的....好了,再来提到那个备份的种类,因为想要选择什么储存媒体与相关备份工具, 都与备份使用的方式有关!那么备份有哪些方式呢?一般可以粗略分为“累积备份”与“差异备份”这两种 [1]。当然啦,如果你在系统出错时想要重新安装到更新的系统时,仅备份关键数据也就可以了!

20.4.1 完整备份之累积备份 (Incremental backup)

备份不就是将重要数据复制出来即可吗?干嘛需要完整备份 (Full backup) 呢?如果你的主机是负责相当重要的服务, 因此如果有不明原因的死机事件造成系统损毁时,你希望在最短的时间内复原系统。此时,如果仅备份关键数据时, 那么你得要在系统出错后,再去找新的 Linux distribution 来安装,安装完毕后还得要考虑到数据新旧版本的差异问题, 还得要进行数据的移植与系统服务的重新创建等等,等到创建妥当后,还得要进行相关测试! 这种种的工作可至少得要花上一个星期以上的工作天才能够处理妥当!所以,仅有关键数据是不够的!

  • 还原的考虑 但反过来讲,如果是完整备份的话呢?若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倾倒回去硬盘, 所有事情就搞定了!有些时候 (例如使用 dd 指令) 甚至连系统都不需要重新安装!反正整个系统都给他倒回去,连同重要的 Linux 系统文件等,所以当然也就不需要重新安装啊!因此,很多企业用来提供重要服务的主机都会使用完整备份, 若所提供的服务真的非常重要时,甚至会再架设一部一模一样的机器呢!如此一来, 若是原本的机器出问题,那就立刻将备份的机器拿出来接管!以使企业的网络服务不会中断哩!

那你知道完整备份的定义了吧?没错!完整备份就是将根目录 (/) 整个系统通通备份下来的意思! 不过,在某些场合下面,完整备份也可以是备份一个文件系统 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之类的文件系统就是了。

  • 累积备份的原则 虽然完整备份在还原方面有相当良好的表现,但是我们都知道系统用的越久,数据量就会越大!如此一来, 完整备份所需要花费的时间与储存媒体的使用就会相当麻烦~所以,完整备份并不会也不太可能每天都进行的! 那你想要每天都备份数据该如何进行呢?有两种方式啦,一种是本小节会谈到的累积备份,一种则是下个小节谈到的差异备份。

所谓的累积备份,指的是在系统在进行完第一次完整备份后,经过一段时间的运行, 比较系统与备份文件之间的差异,仅备份有差异的文件而已。而第二次累积备份则与第一次累积备份的数据比较, 也是仅备份有差异的数据而已。如此一来,由于仅备份有差异的数据,因此备份的数据量小且快速!备份也很有效率。 我们可以从下图来说明:

累积备份 (incremental backup) 操作示意图图20.4.1、累积备份 (incremental backup) 操作示意图

假如我在星期一作好完整备份,则星期二的累积备份是系统与完整备份间的差异数据;星期三的备份是系统与星期二的差异数据, 星期四的备份则是系统与星期三的差异数据。那你得要注意的是,星期二的数据是完整备份加第一次累积备份, 星期三的数据是完整备份加第一次累积与第二次累积备份,星期四的数据则是星期一的完整备份加第一次加第二次加第三次累积备份。 由于每次都仅与前一次的备份数据比较而已,因此备份的数据量就会少很多!

那如何还原?经过上面的分析,我们也会知道累积备份的还原方面比较麻烦! 假设你的系统在星期五的时候挂点了!那你要如何还原?首先,你必须要还原星期一的完整备份,然后还原星期二的累积备份, 再依序还原星期三、星期四的累积备份才算完全复原!那如果你是经过了九次的累积备份,就得要还原到第九次的阶段, 才是最完整的还原程序!

  • 累积备份使用的备份软件

完整备份常用的工具有 dd, cpio, xfsdump/xfsrestore 等等。因为这些工具都能够备份设备与特殊文件! dd 可以直接读取磁盘的扇区 (sector) 而不理会文件系统,是相当良好的备份工具!不过缺点就是慢很多! cpio 是能够备份所有文件名,不过,得要配合 find 或其他找文件名的指令才能够处理妥当。以上两个都能够进行完整备份, 但累积备份就得要额外使用脚本程序来处理。可以直接进行累积备份的就是 xfsdump 这个指令啰!详细的指令与参数用法, 请前往 第八章、文件与文件系统的压缩,打包与备份 查阅,这里仅列出几个简单的范例而已。

# 1\. 用 dd 来将 /dev/sda 备份到完全一模一样的 /dev/sdb 硬盘上:
[[email protected] ~]# dd if=/dev/sda of=/dev/sdb
# 由于 dd 是读取扇区,所以 /dev/sdb 这颗磁盘可以不必格式化!非常的方便!
# 只是你会等非常非常久!因为 dd 的速度比较慢!
# 2\. 使用 cpio 来备份与还原整个系统,假设储存媒体为 SATA 磁带机:
[[email protected] ~]# find / -print | cpio -covB > /dev/st0  <==备份到磁带机
[[email protected] ~]# cpio -iduv < /dev/st0                  <==还原

假设 /home 为一个独立的文件系统,而 /backupdata 也是一个独立的用来备份的文件系统,那如何使用 dump 将 /home 完整的备份到 /backupdata 上呢?可以像下面这样进行看看:

# 1\. 完整备份
[[email protected] ~]# xfsdump -l 0 -L 'full' -M 'full' -f /backupdata/home.dump /home
# 2\. 第一次进行累积备份
[[email protected] ~]# xfsdump -l 1 -L 'full-1' -M 'full-1' -f /backupdata/home.dump1 /home

除了这些指令之外,其实 tar 也可以用来进行完整备份啦!举例来说,/backupdata 是个独立的文件系统, 你想要将整个系统通通备份起来时,可以这样考虑:将不必要的 /proc, /mnt, /tmp 等目录不备份,其他的数据则予以备份:

[[email protected] ~]# tar --exclude /proc --exclude /mnt --exclude /tmp \
> --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /

20.4.2 完整备份之差异备份 (Differential backup)

差异备份与累积备份有点类似,也是需要进行第一次的完整备份后才能够进行。只是差异备份指的是:每次的备份都是与原始的完整备份比较的结果。所以系统运行的越久,离完整备份时间越长, 那么该次的差异备份数据可能就会越大!差异备份的示意图如下所示:

差异备份 (differential backup) 操作示意图图20.4.2、差异备份 (differential backup) 操作示意图

差异备份常用的工具与累积备份差不多!因为都需要完整备份嘛!如果使用 xfsdump 来备份的话,那么每次备份的等级 (level) 就都会是 level 1 的意思啦!当然啦,你也可以通过 tar 的 -N 选项来备份喔!如下所示:

[[email protected] ~]# tar -N '2015-09-01' -jpcv -f /backupdata/home.tar.bz2 /home
# 只有在比 2015-09-01 还要新的文件,在 /home 下面的文件才会被打包进 home.bz2 中!
# 有点奇怪的是,目录还是会被记录下来,只是目录内的旧文件就不会备份。

此外,你也可以通过 rsync 来进行镜像备份喔! 这个 rsync 可以对两个目录进行镜像 (mirror) ,算是一个非常快速的备份工具!简单的指令语法为:

[[email protected] ~]# rsync -av 来源目录 目标目录
# 1\. 将 /home/ 镜像到 /backupdata/home/ 去
[[email protected] ~]# rsync -av /home /backupdata/
# 此时会在 /backupdata 下面产生 home 这个目录来!
[[email protected] ~]# rsync -av /home /backupdata/
# 再次进行会快很多!如果数据没有更动,几乎不会进行任何动作!

根据分析 [2] ,差异备份所使用的磁盘容量可能会比累积备份来的大,但是差异备份的还原较快, 因为只需要还原完整备份与最近一次的差异备份即可。无论如何,请依据你自己的喜好来选择备份的方式吧!

20.4.3 关键数据备份

完整备份虽然有许多好处,但就是需要花费很多时间!所以,如果在主机提供的服务并不是一定要 24 小时提供的前提下, 我们可以仅备份重要的关键数据即可。由于主机即使死机个一两天可能也不会影响到你的正常生活时, 仅备份关键数据就好啦!不需要整个系统都备份。仅备份关键数据是有许多好处的! 由于完整备份可能是在系统运行期间进行,不但会花费非常多时间,而且如果备份当时系统已经被攻破, 那你备份的数据是有问题的,那还原回去也是有问题的系统啊!

如果仅是备份关键数据而已,那么由于系统的绝大部分可执行文件都可以后来重新安装,因此若你的系统不是因为硬件问题, 而是因为软件问题而导致系统被攻破或损毁时,直接捉取最新的 Linux distribution ,然后重新安装, 然后再将系统数据 (如帐号/密码与主文件夹等等) 与服务数据 (如 www/email/crontab/ftp 等等) 一个一个的填回去! 那你的系统不但保持在最新的状态,同时也可以趁机处理一下与重新温习一下系统设置!是很不错的呦!

不过,备份关键数据最麻烦的地方其实就是在还原啦!上述的还原方式是你必须要很熟悉系统运行, 否则还原得要花费很多时间的!尤其近来的 Linux 强调安全性,所以加入 SELinux 了,你如果要从旧版的 Linux 升级到新版时, 原本若没有 SELinux 而换成新版则需要启动 SELinux 时,那个除错的时间会花很长一段日子哩! 鸟哥认为这是仅备份关键数据的一些优缺点啦~

备份关键数据鸟哥最爱使用 tar 来处理了!如果想要分门别类的将各种不同的服务在不同的时间备份使用不同文件名, 配合 date 指令是非常好用的工具!例如下面的案例是依据日期来备份 MariaDB 的数据库喔!

[[email protected] ~]# tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql

备份是非常重要的工作,你可不希望想到才进行吧?交给系统自动处理就对啦!请自己撰写 script , 配合 crontab 去执行吧!这样子,备份会很轻松喔!

Tips 事实上除了这些基本的 Linux 备份还原工具之外,如果你还想要尝试裸机复原的功能,那可以使用台湾国家高速网络中心开发的再生龙软件! 这个软件相当棒!鸟哥目前服务的单位也是通过这个软件来处理整间计算机教室的复原工作喔!这个软件也有单机版, 也挺好用的!有兴趣的朋友得要自行处理软件的使用喔:http://clonezilla.nchc.org.tw/

下一节:每部主机的任务都不相同,重要的数据也不相同,重要性也不一样,因此,每个人的备份思考角度都不一样! 有些备份策略是非常有趣的,包括使用多个磁带机与磁带来自动备份企业数据哩 [3] 。

就鸟哥的想法来说,鸟哥并没有想要将整个系统完整的备份下来,因为太耗时间了!而且就鸟哥的立场而言,似乎也没有这个必要, 所以通常鸟哥只备份较为重要的文件而已!不过,由于鸟哥需要备份 /home 与网页数据,如果天天都备份,我想,系统迟早会受不了 (因为这两个部分就已经占去数 10 GB 的硬盘空间...),所以鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据, 一个则是每周备份就不常变动的信息。这个时候我就写了两个简单的 scripts ,分别来储存这些数据。

所以针对鸟哥的“鸟站”来说,我的备份策略是这样的:

主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
每日进行:目前仅备份 MySQL 数据库;
每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
异地备援:每月定期的将数据分别 (a)烧录到光盘上面 (b)使用网络传输到另一部机器上面。
那就来看看鸟哥是怎么备份的吧! ^_^