zoukankan      html  css  js  c++  java
  • tar备份系统

    一、概述

    前几天我通过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小时)

  • 相关阅读:
    序列&权限&索引&视图的语句
    currval &nextval的差异理解
    数据库表的创建、修改、清空、数据的插入、更新、删除 语句
    数据库(日期、字符大小写控制、转换)函数
    数据库的相关语句(where,order by)
    多线程的两种方法(卖票系统展示)
    杨辉三角的几种方法
    网络编程的基础代码
    文件的复制(逐字节/整体)
    gui小计算器的程序写法
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3835546.html
Copyright © 2011-2022 走看看