系统备份不管系统是多么可靠,总会发生一些意想不到的事情,致使系统数据丢失。例如硬件故障或人为操作失误等。因此使用备份来保护数据不丢失是一种非常重要的手段,尤其在系统数据非常重要的时候。经常进行数据备份能够减少偶然破坏造成的损失,保证系统能够从错误中恢复正常运行。
备份策略
在进行备份之前,首先要选择使用的备份策略,这将决定何时需要进行备份,以及出现故障时进行恢复的方式。通常使用的备份方式有三种:
完全备份:每隔一定时间就对系统进行一次全面的备份,这样在备份间隔期间出现数据丢失等问题,可以使用上一次的备份数据恢复到前次备份时情况。这是最基本的备份方式,但是每次都需要备份所有的数据,并且每次备份的工作量也很大大,需要太多的备份介质,因此这种备份不能进行的太频繁,只能每隔一段较长时间才进行一次完整的备份,例如以一个月为一个备份周期。但是这样一旦发生数据丢失,只能恢复到上次备份的数据,这个月内更新的数据就有可能丢失。
增量备份:首先进行一次完全备份,然后每隔一个较短时间进行一次备份,但仅仅备份在这个期间更改的内容。当经过一个较长的时间后再重新进行一次完全备份,开始前面的循环过程。由于只有每个备份周期的第一次进行完全备份,其他只进行改变的文件的备份,因此工作量小,就能够进行更频繁的备份。例如以一个月为一个周期,一个月进行一次完全备份,每天晚上0点进行这一天改变的数据备份。这样一旦发生数据丢失,首先恢复前一个完全备份,然后按日期一个一个恢复每天的备份,就能恢复到前一天的情况。这种备份方法比较经济。
更新备份:这种备份方法与增量备份相似,首先每月进行一次完全备份,然后每天进行一次更新数据的备份。但不同在于,增量备份是备份该天更改的数据,而更新备份是备份从上次进行完全备份后更改的全部数据文件。一旦发生数据丢失,可以使用前一个完全备份恢复到前一个月的状态,再使用前一个更新备份恢复到前一天的情况。这样做的缺点是每次作小备份工作的任务比增量备份的工作量要大,但好处在于,增量备份每天都有备份,因此要保存数据备份数量太多,而更新备份则不然,只需保存一个完全备份和一个更新备份就可以恢复故障以前的状态。另外在进行恢复工作时,增量备份要顺序进行多次备份的恢复,而更新备份只需两次恢复,因此它的恢复工作相对简单。
增量备份和更新备份都能以比较经济的方式对系统进行完全备份,在这些不同的策略之间进行选择不但与系统数据更新的方式相关,也依赖于管理员的习惯。通常在系统数据更新不是太频繁的话,可以选用更新备份的方式。但是如果系统数据更新太快,使每个备份周期后面几次更新备份的数据量已经相当大,这样使用更新备份已经不太经济了。这时候可以考虑增量备份或混用更新备份和增量备份的方式,或者缩短备份周期。
操作磁带设备
FreeBSD下SCSI接口的磁带设备文件名为/dev/rsa0或/dev/nrsa0,其中n代表非回卷类型,每次在nrsa0上存储数据之后磁带没有回卷,这样就能在磁带中保存多次备份。而rsa0设备在每次保存数据并关闭磁带时会回卷,这样只能存储一次备份。由于磁带容量大,一次不会用完一个磁带的容量,因此一般使用nrsa0设备,以进行多次备份。
3.1-release之前使用老SCSI驱动程序的磁带设备为st,对应的设备文件就为rst0和nrst0,而非SCSI的磁带设备有rwt0,rft0,分别为IDE和软盘控制器接口的磁带设备。
n表示非回卷模式,r代表raw方式,代表字符设备。而sa为磁带设备的驱动程序名。0表示设备序号,如果有多个磁带,下一个设备将为rsa1。
一般使用/dev/nrsa0作为备份设备,因为这个设备是非回卷的,那么每次备份之后磁带仍然停留在最后移动的位置上,这样就可以在下次备份时接续往磁带中写入,使用一个磁带进行多次备份。但是如果读取具体的备份,必须使磁带卷到具体备份的起始位置才行。需要回卷磁带要使用mt命令来完成。
# mt /dev/nrsa0 rewind
回卷磁带到最开始地方;
# mt /dev/nrsa0 reten
先向前卷到尾部再回卷磁带,保持磁带前后松紧一致;
# mt /dev/nrsa0 fsf 1
跳到下一个备份文件,使用2将跳到下面第二个文件;因此要定位一个磁带上第4次备份的文件,可以使用reten回卷磁带,再使用fsf 4跳到第4个备份。
每次使用mt均需使用mt来确定磁带的位置,一般的应用程序并不能自动确定文件的开头,而在磁带上每两个备份文件当中必然有一段无用的数据,如果再读完一个备份之后立即去读取下一个备份文件,就不能识别这些备份文件之间的无用信息,必然导致报告错误。
使用tar进行备份
选定了备份方式之后,可以使用tar、cpio、dump等备份工具软件将数据备份到磁带上。对于一般的备份,使用tar就足够了。tar的参数有:
参数c是创建备份(Create)
参数v表示回显模式(Verbose),将产生一系列所备份的文件列表
参数f指定使用的备份文件,它后面的参数为输出的备份文件名
参数x是展开备份文件
参数t是显示备份文件的内容
参数T后面跟随一个文件参数,指定从这个文件中读取要备份的各个文件的路径
参数z是使用压缩方式创建和解开备份文件,这是GNU的新版tar的功能,需要同时安装gzip
如果不使用T参数,那么就需要一个参数,指明进行备份文件和目录的路径
这些选项参数可以使用Unix下的标准参数符号 “-” 进行引导,如 “-c” 、 “-f” 等,大部分参数都是单独使用的参数,而有些如 “-f” 、 “-T” ,其后面还要跟随一个文件名作参数。因此可以将单独的参数写在一起,如 “-cv” 就等同于 “-c -v” ,也可以与一个需要参数的选项写在一起,如 “-cvf filenam” 就等同于 “-c -v -f filename” 。如果不使用 “-” 引导参数,tar也能识别这些命令选项。如 “tar tvf filename” 就等同于 “tar -cvf filename” 。tar能够创建备份文档,能够备份到磁带上或者产生一个文件,如:
# tar cf root.tar /root
将/root目录下的所有文档备份到root.tar文件中,root.tar指定输出的备份文件,/root指出要做备份的目录。如果要备份到磁带上,将输出的备份文件指定为磁带设备文件即可:
# tar cf /dev/nrsa0 /root
如果设置了环境变量TAPE,则可以不使用参数f指定输出磁带设备名字。
# TAPE=/dev/nrsa0; export TAPE
# tar c /root
从备份文档中解出所有文件或某个文件,只需要使用x选项替换前面的c选项,例如从磁带中解出hello.c文件:
tar xv hello.c
列出tar备份文档中的内容,可以使用t选项,tar tv将列出磁带上的所有文件内容,而tar tf root.tar将root.tar文件上的内容列出。
tar本身不支持文件压缩,因此创建的文件要比较大。但tar可以和GNU的压缩软件gzip合作,直接生成压缩文件,所需要的是在参数中增加z选项。压缩的备份文件和普通tar备份是不同的,因此凡是压缩的备份操作,均需使用z参数。如:
# tar czvf root.tar.gz /root
# tar xzvf root.tar.gz hello.c
# tar tzvf root.tar.gz
要进行增量备份和更新备份,必须找出那些文件在这个期间进行更新。这个任务可以由程序find来完成,例如查找过去七天更改的文件,并使用tar的-T参数制定进行备份的文件,进行备份:
# find / -mtime -7 -print > /tmp/filelist
# tar -c -T /tmp/filelist -f /dev/nrsa0
由于要使用find来找出需要备份的文件列表,那么就需要使用文件的修改时间进行查询,需要使用-mtime参数。另一个更有用的参数是-newer,可以查找出所有比某个文件更新的文件,由于备份是周期进行的,因此可以在完全备份之后生成一个标记文件,那么所有比这个文件新的文件都需要进行更新备份。
# find / -newer full_back_tag_file -print > /tmp/filelist
进行备份需要定期执行,不能完全依赖于管理员手工进行备份。备份也应该选择在系统比较空闲时进行,以免影响系统的正常处理任务。通常可以选择半夜0:00点之后进行备份,这样更不能将这个任务由管理员手工完成了。Unix提供了定时服务cron,能够在确定的时间中执行一系列任务,因此备份必须和cron合作来完成,或者使用/etc下的daily,weekly,monthly文件定时操作。
未完,待续。。。