第十章 备份

 

硬件不是绝对可靠的。

软件是绝对不可靠的。

人不是绝对可靠的。

自然是绝对可靠的。

 

本章解释了为什么要备份、如何备份、什么时候进行备份以及如何从备份中恢复数据。

 

备份的重要性

你的数据是有价值的。重建这些数据是要花费你许多的时间和精力的,而且那是需要花费金钱的或者至少是个人的忧伤和泪水;有时它是不可重建的,举例来说,如果它是某些试验的结果的话。由于这是一种投资,你应该保护它并且采取一定的措施来避免数据的丢失。

数据的丢失,主要有四个原因:硬件出错、软件有问题、人操作因素、或者是自然灾难。[1] 尽管现代的硬件越来越可靠,但本质上看来还是会坏的。最重要的存储数据的硬件是硬盘,它依赖于在充满电磁干扰的世界里微小的磁场未被触及的状况。现代的软件甚至并没有趋于更可靠;极其稳固可靠的程序是一个特例,而不是常有的。人的行为是非常不可靠的,他们或者会造成一个错误,或者会有目的地恶意地破坏数据。自然并不是邪恶的,但有时即使是在正常的状态下也会造成巨大的破坏。总的来说,所有的部分都能正常地工作是个小小的奇迹。

备份是保护投资的一种方法。通过对数据拥有几个拷贝,那么有一个被损坏的话也无所谓(代价只是从备份中恢复丢失的数据)。

正确地作好备份是很重要的。正如与实际世界相关的所有事情一样,备份迟早也会失效。要做好备份的部分工作是确信它是有效的、可用的;你不会想知道你的备份是不可用的。[2] 让人感到雪上加霜的是,当你正在做备份时数据突然坏掉了;如果你只有一个备份的话,它也许同样会损坏,给你留下的只是辛勤工作的烟尘。[3] 或者在你恢复数据时,发现有些重要数据忘记备份了,就象有个15000个用户站点上的用户数据库。最好的情况是,你的所有备份都能正常的工作,但是你所用的最后一个磁带驱动器所读的那类的磁带肯定是含有水分的。

当说到备份工作时,常要用到偏执狂这种工作态度。

 

选择备份的介质

有关备份的最重要的决定是备份介质的选择。你必须考虑到成本、可靠性、速度、实用性和可用性。

成本是重要的,因为你应该有所需数据的几个时间的多个备份存储着。所以便宜的介质常常是必须的。

可靠性是极其重要的,因为一个坏的备份能够使一个成年人叫爹喊娘。备份介质必须能够在多年里保持数据。你所使用介质的方法影响其作为备份介质的可靠性。硬盘通常是非常可靠的,但如果硬盘是在要备份的同一台计算机上,那么作为备份介质它并不能说是最可靠的。

如果备份不用交互地进行,那么速度就不是非常重要的。只要无需监督,就不用关心备份是否要进行两个小时。从另一方面来说,如果备份一定要在计算机空闲时才能进行的话,那么速度就成为一个要考虑的问题了。

实用性显然是需要的,因为你不可能使用一种不存在的介质。不太明显的是即使在将来对备份介质的需求是否能满足,并且在其它的计算机上是否能用。否则的话,灾难之后你也许不可能恢复你的备份了。

可用性对于是否经常做备份是个大要素。越容易做备份越好。一种备份介质一定不要太难于使用。

典型的可供选择的办法是使用软盘和磁带。软盘非常便宜,还算可靠,不太快,到处都有,但不适用于备份大量的数据。磁带有便宜的也有稍贵一些的,相当可靠,相当快,基本上到处都有,并且,就磁带容量大小而言,十分适用的。

还有些其它的方法可选择。它们常常没有很好的实用性,但是如果这不是个问题的话,它要比其它的方法好。例如,磁光盘既有软盘(它们是随机访问的,使得恢复单个文件速度很快)的好处,也有磁带(能含有大量的数据)的优点。

 

选择备份工具

有许多工具可用于制作备份。传统的UNIX备份工具是tarcpio、以及dump。另外,还有许多第三方的软件包(有免费的也有商业版的)可供使用。对备份介质的选择会影响对备份工具的选择。

tarcpio是相似的,而且从备份的观点来看,这两者几乎是相同的。这两者都能将文件存储于磁带上,以及从磁带上恢复文件。都几乎可以使用任何介质,因为内核的设备驱动程序处理低级的设备操作,并且对于用户级程序来说这些设备看上去都是一样的。有些UNIX版的tarcpio在处理不寻常的文件时可能会碰上问题(符号连接、设备文件、有很长的路径名的文件等等),但是,Linux版的就可以正确地处理所有这些文件。

dump有些不同,它是直接读取文件系统而非通过文件系统来读取其中的文件。它也是特定为备份的用途而编写的;tarcpio其实是用于文件归档的,尽管它们也同样用于备份操作。

直接读取文件系统有某些优点。这使得它可以在不影响文件时间标签的情况下备份文件;而对于tarcpio来讲,你就必须首先以只读方式来加载文件系统。如果所有的东西都要备份,那么直接读取文件系统也就更有效,因为这样可以减少磁头的运动。主要的缺点是特定的文件系统类型要求特定的备份程序;Linuxdump程序只能对ext2文件系统进行操作。

dump也同样支持备份级别(levels)(这将在下面讨论);而对于tarcpio来讲,这需要用其它的工具来实现了。

有关第三方备份工具的比较不在本书范围内。Linux软件图(Linux Software Map,LSM)列出了许多着方面的自由软件。

 

简单备份

一个简单备份方案是指一次备份所有的东西,然后在上次备份以后,再备份所有作过修改的东西。以上所指的第一个备份称为完全备份(full backup),接下来的一系列备份称为增量备份(incremental backups)。完全备份经常比增量备份要花更多的劳动,因为有很多的数据要写入磁带并且一个完全备份有可能一个磁带(或软盘)还不够。从增量备份中进行恢复要比从完全备份进行恢复需要多次和更多的工作量。恢复能够进行优化,这样自从前次的完全备份后,你总可以备份所有的东西;这样,备份可能需要多花上一点工作量,但是就不会再需要恢复比完全备份以及增量备份更多的数据量。

如果你需要每天都制作备份并且你有六盒磁带的话,你可以使用第一盒磁带做第一个完全备份(比如说,在星期五),用第二盒至第五盒做增量备份(星期一到星期四)。接下来用第六盒磁带做一个新的完全备份(第二个星期五),再用第25盒重做增量备份。直到你又有了一个完全备份之前,你无需重写磁带1上的备份,免得当你在做完全备份时发生什么问题。在磁带6上做过完全备份之后,可将磁带1保存在其它什么地方,这样当你的其它备份磁带在火灾中毁坏时,你起码还有些备份留下。当你需要制作下一个完全备份时,把磁带1拿出来做,而把磁带6保存在其它地方。

如果你有多于六盒的磁带,可以使用多余的磁带作完全备份。每次拿最早用的磁带做完全备份。这样你就能有从几个星期前到现在的几个完全备份,如果你想找出一个老文件或一个文件的老版本,但是现在这个文件已被删掉了的话,那就能派上用处了。

 

使用tar进行备份

完全备份能够很容易地使用tar来做:

# tar --create --file /dev/ftape /usr/src

tar: Removing leading / from absolute path names in the archive

#

上面的例子使用了GNUtar版本以及它的长选项名。传统的tar版本只能使用单字符的选项。GNU的版本也能够处理备份超过一个磁带或一张软盘的情况,当然也能够处理很长的路径;并不是所有传统的版本都能做到这些的。(Linux只使用GNUtar。)

如果你的备份在一盒磁带上放不下,你就需要使用—multi-volume -M)选项:

# tar -cMf /dev/fd0H1440 /usr/src

tar: Removing leading / from absolute path names in the archive

Prepare volume \#2 for /dev/fd0H1440 and hit return:

#

注意,在备份之前你应该先格式化你的软盘,或者在tar要求一张新软盘时用另一个窗口或虚拟终端来做格式化。

在做好了一个备份之后,你应该使用选项—compare-d)来检查它是否正确:

# tar --compare --verbose -f /dev/ftape

usr/src/

usr/src/linux

usr/src/linux-1.2.10-includes/

....

#

忽略了对所做备份进行检查就意味着直到在你已经丢失原始数据之前,你不会注意到你所做的备份是否可用。

增量备份可以使用tar来做,使用—newer -N)选项:

# tar --create --newer '8 Sep 1995' --file /dev/ftape /usr/src --verbose

tar: Removing leading / from absolute path names in the archive

usr/src/

usr/src/linux-1.2.10-includes/

usr/src/linux-1.2.10-includes/include/

usr/src/linux-1.2.10-includes/include/linux/

usr/src/linux-1.2.10-includes/include/linux/modules/

usr/src/linux-1.2.10-includes/include/asm-generic/

usr/src/linux-1.2.10-includes/include/asm-i386/

usr/src/linux-1.2.10-includes/include/asm-mips/

usr/src/linux-1.2.10-includes/include/asm-alpha/

usr/src/linux-1.2.10-includes/include/asm-m68k/

usr/src/linux-1.2.10-includes/include/asm-sparc/

usr/src/patch-1.2.11.gz

#

不幸的是,当一个文件的i节点信息已经改变时,tar不可能知道,例如,它的权限位已经改变或者当它的文件名已经改变时。这可以用find以及比较当前文件系统与以前备份的文件系统的文件列表的方法来应付。有关做这些事的描述文件以及程序可以在Linuxftp站点上找到。

 

使用tar进行备份恢复

tar –extract -x)选项用于提取文件:

# tar --extract --same-permissions --verbose --file /dev/fd0H1440

usr/src/

usr/src/linux

usr/src/linux-1.2.10-includes/

usr/src/linux-1.2.10-includes/include/

usr/src/linux-1.2.10-includes/include/linux/

usr/src/linux-1.2.10-includes/include/linux/hdreg.h

usr/src/linux-1.2.10-includes/include/linux/kernel.h

...

#

你也可以通过在命令行上给出名字来只抽取指定的文件或目录(包括它的所有文件以及子目录):

# tar xpvf /dev/fd0H1440 usr/src/linux-1.2.10-includes/include/linux/hdreg.h

usr/src/linux-1.2.10-includes/include/linux/hdreg.h

#

如果你只想看看备份卷上有些什么文件时可以使用—list-t)选项:

# tar --list --file /dev/fd0H1440

usr/src/

usr/src/linux

usr/src/linux-1.2.10-includes/

usr/src/linux-1.2.10-includes/include/

usr/src/linux-1.2.10-includes/include/linux/

usr/src/linux-1.2.10-includes/include/linux/hdreg.h

usr/src/linux-1.2.10-includes/include/linux/kernel.h

...

#

请注意,tar顺序地读取备份卷,所以对于大的卷,它是很慢的。然而,当使用磁带驱动器或其它一些顺序介质时,不可能使用随机访问数据库技术的。

tar不能恰当地处理已删除的文件。如果你需要从完全备份以及增量备份上恢复一个文件系统时,并且你已经在两次备份之间删除了一个文件,这个文件在你做完恢复的操作后又将存在。如果该文件含有敏感数据并且本应不该再存在的话,就可能成为一个大问题。

 

多级备份

前节所述的简单备份方法常适用于个人使用或小站点使用,对于有重大责任的使用,采用多级备份方法将更为适用。

简单的方法有两个备份级别:完全备份和增量备份。这可以通用化到任何数量的级别。一个完全备份可看作是级别0,增量备份的不同级就是备份级123等等。在每个增量备份级操作中,要备份从本级或前一级的前次备份以来所有已经改变过的东西。

这样做的目的是可以方便地有一个更长的备份记录史(backup history)。在上节的例子中,备份记录史可以追溯到上一个完全备份。若有更多的磁带,但每盒新磁带记录一星期,就能再延伸备份历史,不过这样可能太昂贵了点。较长的备份历史是有用的,因为被删除的或已毁坏的文件经常长期得不到注意。即使不是一个最新版的文件也总比没有的好。

10-1显示出了每天使用那一个备份级别,以及哪些备份在月底可以用于恢复操作。

 

10-1. 多级备份方案的例子。

备份级也能用于使得文件系统的恢复工作时间达到最短。如果你有许多增量备份,并且这些增量备份的级别一个比一个高而不一样,那么当你需要重建整个文件系统时,你就需要恢复所有这些备份。然而,你可以使用级别不是顺序递增的备份级,这样就可以减少恢复操作时要用到的备份数量。

为了减少用于恢复操作时的已备份磁带数量,你可以对每个增量磁带使用更小的级别。然而,这样的话制作备份所用的时间就增加了(自从上次完全备份以来,每个备份要拷贝所有的东西)。一个更好的备份方案是在dumpmanual page中提出的,并在表XX中进行了叙述(有效备份级别)。使用下面的连续备份级别:325476989等等。这样可使得备份和恢复操作的时间都较少。你所需要的备份时间最多是抵两个工作日。一次恢复操作要用到的备份好的磁带的数量依赖于两次完全备份之间的时间长短,但数量要比在简单备份中用的要少。

 

10-1. 使用多备份级的有效备份方案。

磁带

级别

备份(天数)

恢复用到的备份磁带数

1

0

n/a

1

2

3

1

1, 2

3

2

2

1, 3

4

5

1

1, 2, 4

5

4

2

1, 2, 5

6

7

1

1, 2, 5, 6

7

6

2

1, 2, 5, 7

8

9

1

1, 2, 5, 7, 8

9

8

2

1, 2, 5, 7, 9

10

9

1

1, 2, 5, 7, 9, 10

11

9

1

1, 2, 5, 7, 9, 10, 11

. . .

9

1

1, 2, 5, 7, 9, 10, 11, . . .

一个好的备份方案能够减少所需的工作总量,但这也意味着要明了许多事情。你必须判定这样是否值得。

dump有内建的对备份级的支持。而对于tarcpio来说,则还需要用shell描述语言来实现。

 

需要备份些什么

你当然想尽可能多备份些东西。主要的例外是那些很容易重装的软件,[4] 但即使是这些软件,也可能含有一些配置文件,这些文件是备份操作的重要对象;以免从头开始重新配置所有这些软件。另一个例外是/proc文件系统;因为它只含有内核总是自动产生的数据,所以没有必要备份它。尤其没有必要备份/proc/kcore文件,因为它只是当前物理内存的一个映像;而且它也非常大。

可备份也可不备份的部分包括news spoollog文件、以及/var中的许多数据。你必须决定什么数据对你来说是重要的。

显然要备份的数据包括用户文件(/home)以及系统配置文件(/etc,但很可能其它一些散布在整个文件系统中)。

 

压缩备份

备份会占用大量的介质空间,这些会花费很多钱。为了减少所需的空间,备份能够被压缩。这有几种方法来做到。有些程序支持内建的压缩功能;例如,GNUtar程序的—gzip-z)选项在把数据写入备份介质前,将整个备份数据输送到gzip压缩程序进行压缩。

不幸的是,压缩的备份可能会带来麻烦。由于压缩操作的本性,如果一个比特错了,那么其余所有的压缩数据都将毫无用处。有些备份程序含有内建的纠错功能,但并没有处理大量错误数据的办法。这意味着如果备份使用GNU tar的方法压缩,整个输出是一个压缩好的单元(文件),那么只要有一丁点错,整个备份都玩完。备份必须可靠,因此压缩的办法并不是个好主意。

另一种方法是独立地压缩每个文件。这仍然意味着一个文件要是出错,那么该文件整个地就会坏掉了,但不伤及其它文件。这个文件可能是由于各种原因毁坏的,所以,这种办法要比一点也不压缩好一些。afio程序(cpio的一个变种)可用来做这个工作。

压缩操作需要花费一些时间,这可能使得备份程序不能尽可能快地将数据写到磁带驱动器中。[5] 这可以用输出缓冲来避免(如果备份程序编制的很好的话可以编成内部的缓冲,或者用其它的程序来做到),但即使这样,运行工作也并不一定足够好。应该只是在很慢的计算机上才会有这个问题。

 

 

 

 

注释

 

  1. 第五个原因是“其它一些原因”。
  2. 不要笑,这已经发生在一些人身上。
  3. 在那里,但又不是
  4. 你必须决定怎样做对你来说容易些,有些人觉得从几打软盘上安装来的简单。
  5. 如果磁带驱动器没有得到足够快的数据,它就会暂停;这会使得备份更慢,而且对磁带和驱动器都不利。