一、概述
前几天我通过SSH正在调戏汤姆猫(tomcat)的时候,服务器上CentOS突然挂了。开机grub,使用光盘linux rescue修复提示找不到linux分区,然后想mount硬盘备份系统的时候提示硬盘无法挂载。没有办法只能重装系统。吃一堑长一智,决定定期备份下系统。
何时进行备份?
每天晚上12:00
备份到哪?
显然备份到系统所在磁盘不是明智之举,用户应该备份到外接硬盘或者磁带上面。
为了让文章看上去更简单,本文所做的例子并没有备份到外接设备上,而是在/backup目录下。
要备份什么?
备份整个系统需要占用大量的磁盘空间,所以我决定只有星期天的时候对系统进行全部备份,其他时间备份重要的数据。
备份整个系统,因此这里需要考虑的是不必备份的目录:
/backup
/proc
/lost+found
/sys
/mnt
/media
/dev
/tmp
备份的数据:
/home (你懂的)
/work (我的工作目录)
/opt (软件安装目录)
/var/lib/mysql (mysql数据文件目录)
另外还需要保持一些重要的配置文件:
/etc/profile (各种环境变量)
/etc/bashrc (各种环境变量)
/etc/crontab (设置定时备份)
/etc/fstab (存放文件系统信息,其实我备份文件是存放在其他磁盘的,磁盘的挂载在这里设置)
备份方式
tar支持三种方式进行备份:
1.完整备份:备份指定的所有目标文件或文件夹
2.增量备份:仅备份atime与上次备份不同的文件或文件夹
3.差异备份:与增量备份差不多,只是增加了对Windows文件系统的支持
我这里选择完整备份
何时删除?
系统备份数据保存两周,数据备份保存一周
二、基础知识
atime,ctime,mtime
UNIX系統將时间分为三种:
atime(Access time):文件上次被访问时间。ls -lu查看
ctime(status Change time):文件的属性或内容上次被修改的时间。ls -lc查看
mtime(Modified time):文件的內容上次被修改的时间。ls -l查看
需要说明的是Linux 文件系统从来不存储文件创建时间。
为了方便查看各种时间,这里提供一个脚本
#!/bin/bash
#用法:脚本名 文件
if [ $# != 1 ];then
echo "输入参数不正确,需要输入一个文件"
exit 1
fi
file=$1
if [ ! -f "$file" ]; then
echo "$file 文件不存在"
else
echo "ctime(status Change time): $(ls -lc $file | awk ‘{print $6, $7, $8}‘)"
echo "atime(Access time): $(ls -lu $file | awk ‘{print $6, $7, $8}‘)"
echo "mtime(Modified time): $(ls -l $file | awk ‘{print $6, $7, $8}‘)"
fi
利用cron定时备份
新建cron计划任务非常简单,以下方法都可以完成:
方法一:$ crontab -e
方法二:# vim /etc/crontab
方法一只能以当前用户的权限运行计划的任务;方法二可以指定程序以哪个用户执行,但是必须以root身份编辑该文件。
在此,因为要对整个文件系统进行备份,因此仅以/etc/crontab为例进行介绍:
# m h dom mon dow user command
0 0 * * * root /work/mybin/backup.sh
这行配置表明,在每天0:00分执行/work/mybin/backup.sh这个脚本
这样设置后如果无效,需要service crond reload以及service crond restart命令重读配置文件以及重启服务来生效。
三、脚本
#!/bin/bash
#
#星期天进行系统全部备份,其他时间进行部分数据备份。
DATA="/work /home /opt /var/lib/mysql /etc/profile /etc/bashrc /etc/crontab /etc/fstab "
DATA_VALI=7 #数据文件有效期
SYS_VALI=14 #系统文件有效期
set $(date)
if test "$1" = "Sun" ; then
tar -czvpf "/backup/system_backup_$6-$2-$3.tar.gz" --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/tmp /
else
tar -czpvf "/backup/data_backup_$6-$2-$3.tar.gz" $DATA
fi
find /backup -type f -name "data*" -mtime +$DATA_VALI -exec rm -rf {} \;
find /backup -type f -name "system*" -mtime +$SYS_VALI -exec rm -rf {} \;
这里说明两点
data时间格式问题:
我的linux环境是中文的,shell终端或shell脚本中执行date命令,得出的结果都是这样的:
2013年 05月 21日 星期二 10:13:56 CST
但是在crontab定期执行shell脚本中,得出的结果却是这样的:
Tue May 21 10:13:56 CST 2013
所以判断是否是星期天的是才用”if test “$1″ = “Sun” ; then”
find与mtime
find可以根据时间进行查找。atime,ctime和mtime上面已经讲过了,这里说明下-mtime后面加的数字。
1.直接上数字
表示距离当前时间第几天的文件。需要注意是这个时间不是按照日期的,是根据从当前时间(2013年5月21日13:19:10)向前推24小时表示0.也就是0表示24小时内修改过的文件,1表示24-48小时内修改过的文件,2表示48-72小时修改过的文件。
2.+数字
表示几天以外的修改过的文件,+1表示1天以外修改过的文件(距离现在>48小时),+2表示2天以外修改过的文件(距离现在>72小时)
3.-数字
表示几天以内的修改过的文件,-1表示1天以内修改过的文件(距离现在<24小时),-2表示2天以内修改过的文件(距离现在<48小时)
tar备份系统