Linux备份策略
常用的备份策略有完全备份和增量备份,而增量备份有可细分为累计增量备份和差异增量备份。下面来分别讲述不同备份策略以及之间的区别。
完全备份
完全备份是指把所有需要备份的数据全部备份。当然,完全备份可以备份整块硬盘、整个分区或某个具体的目录。对于 Linux 操作系统来说,完全备份指的就是将根目录下的所有文件进行备份。
完全备份的好处是,所有数据都进行了备份,系统中任何数据丢失都能恢复,且恢复效率较高。如果完全备份备份的是整块硬盘,那么甚至不需要数据恢复,只要把备份硬盘安装上,服务器就会恢复正常。
完全备份的缺点也很明显,那就是需要备份的数据量较大,备份时间较长,备份了很多无用数据,占用的空间较大,所以完全备份不可能每天执行。
我们一般会对关键服务器进行整盘完全备份,如果出现问题,则可以很快地使用备份硬盘进行替换,从而减少损失。我们甚至会对关键服务器搭设一台一模一样的服务器,这样只要远程几个命令(或使用 Shell 脚本自动检测,自动进行服务器替换),备份服务器就会接替原本的服务器,使故障响应时间大大缩短。
累计增量备份
在一个数据量很大的业务应用中,每天对 Linux 系统进行完全备份是不现实的,这就需要用到增量备份策略。
累计增量备份是指先进行一次完全备份,服务器运行一段时间之后,比较当前系统和完全备份的备份数据之间的差异,只备份有差异的数据。服务器继续运行,再经过一段时间,进行第二次增量备份。在进行第二次增量备份时,当前系统和第一次增量备份的数据进行比较,也是只备份有差异的数据。第三次增量备份是和第二次增量备份的数据进行比较,以此类推。
因此,累计增量备份就是只备份每天增加或者变化的数据,而不备份系统中没有变动的数据。我们画一张示意图,如图 1 所示。
图 1 累计增量备份
采用累计增量备份的好处是,每次备份需要备份的数据较少,耗时较短,占用的空间较小;坏处是数据恢复比较麻烦,如果是图 1 的例子,那么当进行数据恢复时,就要先恢复完全备份的数据,再依次恢复第一次增量备份的数据、第二次增量备份的数据和第三次增量备份的数据,最终才能恢复所有的数据。
差异增量备份
差异增量备份(后续简称差异备份)也要先进行一次完全备份,但是和累计增量备份不同的是,每次差异备份都备份和原始的完全备份不同的数据。也就是说,差异备份每次备份的参照物都是原始的完全备份,而不是上一次的差异备份。我们也画一张示意图,如图 2 所示。
图 2 差异增量备份
假设我们在第一天也进行一次完全备份。第二天差异备份时,会备份第二天和第一天之间的差异数据,而第二天的备份数据是完全备份加第一次差异备份的数据。第三天进行差异备份时,仍和第一天的原始数据进行对比,把第二天和第三天所有的数据都备份在第二次差异备份中,第三天的备份数据是完全备份加第二次差异备份的数据。第四天进行差异备份时,仍和第一天的原始数据进行对比,把第二天、第三天和第四天所有的不同数据都备份到第三次差异备份中,第四天的备份数据是完全备份加第三次差异备份的数据。
相比较而言,差异备份既不像完全备份一样把所有数据都进行备份,也不像增量备份在进行数据恢复时那么麻烦,只要先恢复完全备份的数据,再恢复差异备份的数据即可。不过,随着时间的增加,和完全备份相比,变动的数据越来越多,那么差异备份也可能会变得数据量庞大、备份速度缓慢、占用空间较大。
一个比较的备份策略是,对于数据量不大,并且每天数据量增加不多的系统,优先选择完全备份;对于数据量巨大,每天新增数据也很多的系统,视情况选择差异备份或者增量备份。
六、Linux tar命令备份数据
作为 Linux 系统管理员,最经常使用的备份工具就是 tar 和 cpio 命令。前面在介绍备份介质时,已经使用了 tar 命令,此命令其实是一个文件打包命令,经常在备份文件的场合中使用。
使用 cpio 命令进行数据备份,请阅读《Linux提取RPM包文件(cpio命令)》。
有关 tar 命令的基本用法,请阅读《Linux tar压缩命令》一节,这里不再过多赘述。下面通过 tar 命令做的一个 Web 服务器的备份脚本,详细了解 tar 命令作为备份工具时的具体用法。
以下是一个有关 Web 服务器的备份脚本:
#!/bin/sh
BAKDATE=`date +%y%m%d`
DATA3=`date -d "3 days ago" +%y%m%d`
osdata=/disk1
userdata=/disk2
echo "backup OS data starting"
tar -zcvf /$osdata/etc.data/etc_$BAKDATE.tar.gz /etc
tar -zcvf /$osdata/boot.data/boot_$BAKDATE.tar.gz /boot
tar -zcvf /$osdata/home.data/home_$BAKDATE.tar.gz /home
tar -zcvf /$osdata/root.data/root_$BAKDATE.tar.gz /root
tar -zcvf /$userdata/usr_data/usrlocal_$BAKDATE.tar.gz /usr/local
tar -zcvf /$userdata/var_www/www_$BAKDATE.tar.gz /var/www
cp -r /$osdata/* /$userdata
cp -r /$userdata/* /$osdata
echo "Backup OS data complete!"
echo "delete OS data 3 days ago"
rm -rf /$osdata/etc.data/etc_$DATA3.tar.gz
rm -rf /$osdata/boot.data/boot_$DATA3.tar.gz
rm -rf /$osdata/home.data/home_$DATA3.tar.gz
rm -rf /$osdata/root.data/root_$DATA3.tar.gz
rm -rf /$osdata/usr_data/usrlocal_$DATA3.tar.gz
rm -rf /$osdata/var_www/www_$DATA3.tar.gz
rm -rf /$userdata/etc.data/etc_$DATA3.tar.gz
rm -rf /$userdata/boot.data/boot_$DATA3.tar.gz
rm -rf /$userdata/home.data/home_$DATA3.tar.gz
rm -rf /$userdata/root.data/root_$DATA3.tar.gz
rm -rf /$userdata/usr_data/usrlocal_$DATA3.tar.gz
rm -rf /$userdata/var_www/www_$DATA3.tar.gz
echo "delete cws ok!"
上面这段脚本完成的工作是,将系统和用户的备份数据分别保存在两个不同的本地磁盘 disk1 和 disk2 中,并且保留最近 3 天的数据,3 天前的数据自动删除。主要备份的数据有 /etc 目录、/boot 目录、/home 目录、/root 目录、/usr/local 目录和 /var/www 目录。当然这里只是举个例子,凡是存放数据的重要目录,都需要进行备份。
将此脚本放到系统守护进程(类似于 Windows 下的计划任务)crontab 下,设定备份时间,即可实现定时数据备份。有关 crontab 的详细介绍,请阅读《Linux crontab命令》。