Linux服务器使用tar与cron定期备份数据
有一次很不小心地删除了一个/etc/下的系统配置文件,很是吓了一跳!我是不太习惯在bashrc中设置alias rm=’rm -i’的,因为那样删除的东西多的时候会很烦人。虽然rm删除文件只是删除一个入口,文件仍然处于磁盘上,在被其他数据覆盖之前是可以找回来的,但是俗话说“防患于未燃”,不是更好吗?
其实我也是很少有备份的习惯的,过去也有过删错东西的时候,也不知道怎么的这次就想起来了,其实过去自己总结学习RHCE还是挺有用的,自己总结过的东西毕竟印象深得多。现在要用了,觉得很自然地想到了cron进行周期性地备份。
虽然Linux上也有一些很庞大很复杂的备份程序,不过感觉上,tar+cron对我来说已经很足够了。有人说Unix能力就是组合使用工具的能力,感觉不无道理的,在Unix的世界里,数不清的小工具,随你信手去用,只有你想不到的,没有你做不到的。
以下的脚本基于GNU 的tar和cron,使用差异备份(differential backup)的方法备份/etc/中的所有数据。每周日一次完整备份,完整备份前会删除目录中的所有备份以节约空间;每周其余各天实行差异备份,被刺差异备份前会删除前次差异备份。
这个脚本自然是可以继续更加完善的,比如留出之前的N个备份,每一次完整备份和基于它的差异备份分别放在各个文件夹中等,但这里没有这么做了。注释中有部分英文,也就是因为但是用了英文而已。用了大量的变量,只是为了修改起来方便,比如要备份的位置,备份时间,文件名等等,使用变量存储就是为了如果需要修改的话,不会牵扯到脚本主体。
要使用它,可以将这个脚本放在任意位置,然后在crontab中引用它。注意,必须以root权限运行脚本,因为待备份的目录中可能出现需要root权限才能查看的文件。例如,我将这个脚本命令为backup.sh,放在~/bin/中,所以我可以在crontab中添加如下内容:
20 13 * * * root /home/kimia/bin/backup.sh
以下是脚本文件:backup.sh
#!/bin/bash
#use this bash script to backup /etc every week
#you can add other location after it begin with a space
targets=”/etc/”
#这是当前时间,用作备份文件的文件名用的
now=`/bin/date`
#这是完整备份文件的全名
backup_file=”/home/kimia/Backup/etcbak/$now.tar.gz”
#这是所有备份文件的目录
backup_dir=”/home/kimia/Backup/etcbak/”
#这是需要执行完整备份的每周的时间,每周一次
full_backup_day=”Sun”
#这是压缩的每个备份文件的时间标签
label=`date +%Y%m%d`
#这里是存储上一次完整备份的日期的文件
last_full_backup_date_file=”/var/tmp/last_full_backup_date”
#这是上一次的完整备份的时间
last_full_backup_date=`/bin/cat $last_full_backup_date_file`
#这里是存储上一次差异备份的日期的文件
last_diff_backup_date_file=”/var/tmp/last_diff_backup_date”
#这是上一次的差异备份的时间
last_diff_backup_date=`/bin/cat $last_diff_backup_date_file`
#这是上一次的差异备份的文件名
last_diff_backup=$backup_dir$last_diff_backup_date.tar.gz
#Check fully backup date
if ( `echo $now | grep $full_backup_day > /dev/null` )
then
/bin/echo $now > $last_full_backup_date_file
/bin/chmod 600 $last_full_backup_date_file
#以免积累的备份消耗空间,每个星期清空一次备份
rm -rf $backup_dir/*
/bin/tar -cvzf “$backup_file” \
-V “Full backup $label” \
$targets
sleep 1
else
/bin/echo $now > $last_diff_backup_date_file
/bin/chmod 600 $last_full_backup_date_file
echo “$last_diff_backup”
rm -f “$last_diff_backup”
/bin/tar -cvzf “$backup_file” \
-V “Differential backup $label” \
-N “$last_full_backup_date” \
$targets
sleep 1
fi