红联Linux门户
Linux帮助

使用tar和cron定期备份数据

发布时间:2008-10-12 10:40:30来源:红联作者:Around
原文:http://blog.fedorachina.cn/linux/rhce/basic_config_admin/backup_using_tar_cron.html

有一次很不小心地删除了一个/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
文章评论

共有 2 条评论

  1. 14cheese 于 2008-10-13 08:09:31发表:

    嗯……学习。

  2. Around 于 2008-10-12 10:41:36发表:

    以下是脚本文件:[code]#!/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[/code]