Linux系统备份与恢复

序言:前面一篇文章简单地介绍了Linux系统备份与恢复的相关概念,这里接着上一篇介绍两个常用的备份与恢复命令。

1  常见的备份命令

在介绍下面的备份恢复命令之前先简单的说明一下:

如果我们只是要实现完全备份,那我们可以直接使用tar命令,将需要备份的重要数据进行打包压缩,然后使用cp命令进行复制来实现备份。再写一个备份脚本,通过定时任务在指定的时间来运行这个脚本就可以实现完全备份。

但是如果是要想实现增量备份,用自己去写备份脚本的方式来做的话就会非常地麻烦,因为需要判断哪些是备份的新文件等等一些繁琐的操作。

为了更加便捷地使用增量备份,Linux系统提供了非常方便的备份恢复工具。下面就介绍两个比较常用的备份恢复命令dump和restore。

1.1  备份命令:dump命令

注意:dump命令在有些centos系统中默认是没有安装的,需要手动进行安装。那么我们可以通过如下命令事先查询一下系统是否已经安装dump命令。

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# rpm -qa |grep dump  

 

操作结果如图1所示:

图1  查看系统是否已经安装dump命令

如图1所示,在查询结果中,我们只看到有一个tcpdump命令。这个是Linux系统的抓包命令,不是dump命令。所以这里显示的是系统并没有安装dump命令,需要我们手动进行安装。此时,如果确定系统的yum源可以使用的话,只需要执行以下命令,系统就会自动将dump命令默认安装。

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# yum -y install dump  

 

操作结果如图2所示:

图2  安装dump命令

安装完dump命令之后,再来看一下dump命令的基本命令格式:

[root@localhost~]# dump [选项] 备份之后的文件名 原文件或目录

选项说明:

-level:备份级别。(一共十个备份级别,具体格式为“-0”~“-9”:“-”和具体的级别数字之间没有空格。其中0就是完全备份;1就是第一次增量备份;2就是第二次增量备份。。。最多支持9次增量备份。)

-f 文件名:手工指定备份之后的文件名。

-u:备份成功之后,把备份时间记录在/etc/dumpdates文件中。

-v:显示备份过程中国更多的输出信息。

-j:调用bzlib库压缩备份文件,其实就是把备份文件压缩为.bz2格式。

-W:显示允许被dump的分区的备份等级及备份时间。

我们先来看一下备份分区,首先,可以通过如下命令查看系统分区:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# df -h  

 

操作结果如图3所示:

图3  查看系统分区

在这里呢,因为boot的分区容量最小,备份起来更节省时间,所以就用boot分区来做一个备份的演示。但是在实际的工作当中,一般情况下,boot分区是不需要备份的,因为每一个安装的Linux系统,只要版本是一致的,它的boot分区里的内容就都是一样的。这里仅仅只是为了方便演示dump命令,节省备份演示时间,而选用boot分区进行备份。

示例:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# dump -0uj -f /root/boot.bak.bz2 /boot/  

 

说明:备份命令。先执行一次完全备份,并压缩和更新备份时间

操作结果如图4所示:

图4  完全备份分区

注意:压缩文件的时候一定要标明压缩格式(即标明压缩文件名称后面的诸如“.bz2”的信息),避免事后需要手工解压缩的时候因为不清楚压缩格式而造成解压过程的繁琐。

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# cat /etc/dumpdates  

 

说明:查看备份时间文件,了解文件是在什么时间进行备份的,也就是每次执行dump操作的具体时间。

操作结果如图5所示:

图5  查看备份时间文件

注意:上述进行的是一个完全备份,那么要进行增量备份的话,就需要先向原文件中增加新的数据。首先,我们通过如下命令来查看一下备份文件的大小

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# ll -h  

说明:查看备份文件的详细信息

 

操作结果如图6所示:

图6  查看完全备份分区文件的详细信息

可以看到,完全备份后的压缩文件大小为30M,现在我们再来给原文件添加一个新的文件,比如说添加上面显示的安装日志文件install.log。通过如下所示命令,将28K的系统安装日志文件install.log复制到/boot分区中:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#cp install.log /boot/  

 

说明:复制日志文件到/boot分区

当然,对于启动分区boot来说,不建议向其中存放过多的内容,避免造成该分区的内存占用过大,导致系统无法启动。

此处只是为了演示的方便,演示操作完成之后会将添加进去的文件删除的。

数据新增完成之后,我们再来看看1级别的增量备份操作:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#dump -1uj -f /root/boot.bak1.bz2 /boot/  

 

说明:增量备份/boot分区,并压缩。

操作结果如图7所示:

图7  1级别增量备份分区

备份完成之后再来查看一下文件详情:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# ll -h  

 

操作结果如图8所示:

图8  查看1级别备份分区详情

可以看到,1级别备份文件boot.bak1.bz2的大小只有19K,并不包含之前的30M的完全备份的数据内容。同样的。再来查看一下备份时间文件

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# cat /etc/dumpdates  

 

操作结果如图9所示:

图9  查看备份时间文件信息

如图9所示,可以看到很明显的备份级别区分。

此时,如果你需要隔一段时间就进行一次增量备份,就可以写一个脚本,通过定时任务来实现上述的备份操作。

最后再来看看选项“W”的功能:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# dump -W  

 

说明:查询整个分区的备份时间及备份级别的详细信息

操作结果如图10所示:

图10  查询整个分区的备份时间及备份级别的详细信息

可以看到,根分区和home分区显示的是从来没有备份过,而boot分区则显示的是最后一次进行备份的备份级别和备份时间。

以上就是使用dump命令来备份分区的基本操作。接下来需要了解的是如果想要备份文件或者目录,我们应该要怎么操作:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# dump -0j -f /root/etc.dump.bz2 /etc/  

 

说明:完全备份/etc/目录。

操作结果如图11所示:

图11  备份目录

注意:如果是备份目录,则只能使用0级别进行完全备份,而不再支持增量备份。也就是说,dump只有在备份分区的时候才可以执行增量备份,否则如图12所示,系统将会报错:

图12  1级别增量备份目录报错

1.2  恢复命令:restore命令

[root@localhost~]# restore [模式选项] [选项]

模式选项说明:restore命令常用的模式有以下四种,且在使用的时候这四个模式只能择其一,不能混用。

-C:比较备份数据和实际数据的变化。

-i:进入交互模式,手工选择需要恢复的文件。

-t:查看模式,用于查看备份文件中拥有哪些数据。

-r:还原模式,用于数据还原。

选项说明:

-f:指定备份文件的文件名

示例:

(1)比较备份数据和实际数据的变化

首先需要模拟一下原数据毁损或丢失的场景,例如破坏boot分区中的数据或文件。先通过如下命令查看一下boot分区中有哪些文件:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]# ll /boot  

 

操作结果如图13所示:

图13  查看boot分区中的文件

然后通过如下命令来模拟破坏其中的某些文件,例如镜像文件vmlinuz-2.6.32-642.el6.x86_64:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#mv /boot/vmlinuz-2.6.32-642.el6.x86_64/boot/vmlinuz-2.6.32-642.el6.x86_64.bak  

 

说明:把/boot目录中的内核镜像文件改个名字。

注意:在做演示的时候一定要记得演示完成之后要记得将该文件名再更改过来,否则会造成系统关机以后无法启动。

再来演示一下“-C”模式能否比较出现有文件与备份文件之间存在不同(即是否能够发现现有文件发生了变化)。

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#restore -C -f /root/boot.bak.bz2  

 

操作结果如图14所示:

图14  -C模式功能演示

可以看到,系统提示我在前面修改过的镜像文件找不到了,存在一个比较错误。这就是“-C”模式的功能。

这个时候,我们可以通过备份恢复来将boot分区恢复,也可以直接像刚才那样再把文件名称修改过来。在这里,我先直接把文件名修改过来,避免后面忘了恢复导致系统关机后无法启动了,等演示完了所有模式之后再来演示恢复功能,

同样的,我们也可以顺便看看文件名修改正确以后再次使用“-C”进行比较会是个什么效果:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#mv /boot/vmlinuz-2.6.32-642.el6.x86_64.bak/boot/vmlinuz-2.6.32-642.el6.x86_64  
  2. [root@localhost~]#restore -C -f /root/boot.bak.bz2  

 

操作结果如图15所示:

图15  -C模式功能演示2

可以看到,现在系统不会再提示有比较错误了。

(2)查看模式

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#restore -t -f boot.bak.bz2  

 

操作结果如图16所示:

图16  查看备份文件中拥有哪些数据信息

(3)还原模式

下面先演示一下怎么还原boot.bak.bz2分区备份:

首先通过如下命令创建一个目录,然后进入该目录中进行恢复操作,避免恢复的过程中文件解压的到处都是。

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost~]#mkdir bootbak  
  2. [root@localhost~]#cd bootbak/  

 

先还原完全备份的数据:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhostbootbak]# restore -r -f /root/boot.bak.bz2  

 

说明:恢复的同时会进行解压缩。

操作结果如图17所示:

图17  恢复完全备份数据

可以看到,/boot分区的数据文件全部解压到当前目录下了。再恢复增量备份数据:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhostbootbak]# restore -r -f /root/boot.bak1.bz2  

 

操作结果如图18所示:

图18  恢复增量备份数据

可以看到,拷贝到/boot分区的系统日志文件也被解压到当前目录下了。

再来看看怎么还原目录备份,例如现在要还原前面备份的/etc/目录的备份etc.dump.bz2。为了简单一点,我们就在刚刚恢复备份分区时创建的目录中恢复/etc/目录的备份:

首先把该文件中刚刚恢复的分区备份数据都删掉,再来恢复我们的目录备份:

 

[html] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhostbootbak]# rm -rf *  
  2. [root@localhostbootbak]# restore -r -f /root/etc.dump.bz2  

 

操作结果如图19所示:

图19  恢复目录备份

最后,要记得把前面进行演示的时候拷贝到boot分区中的系统日志文件删除。但是,切记,一定不要删错了文件,误删了boot分区的原有的文件!

posted on 2016-11-14 15:37  用代码书写人生  阅读(15441)  评论(0编辑  收藏  举报