黑帽联盟

 找回密码
 会员注册
查看: 992|回复: 0
打印 上一主题 下一主题

[基础服务] tar命令的高级用途(定位原创)

[复制链接]

852

主题

38

听众

3177

积分

白金VIP

Rank: 8Rank: 8

  • TA的每日心情
    开心
    2024-3-7 12:52
  • 签到天数: 1538 天

    [LV.Master]伴坛终老

    tar命令高级用法——备份数据

    Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件和目录备份到磁带中,然后从磁带中提取或恢复文件。现在我们可以使用tar来备份数据到任何存储介质上。它是文件级备份,不必考虑底层文件系统类别,并且支持增量备份。

    部分常用选项

    -z, --gzip:使用gzip工具(解)压缩,后缀一般为.gz
    -c, --create:tar打包,后缀一般为.tar
    -f, --file=:后面立刻接打包或压缩后得到的文件名
    -x, --extract:解包命令,与-c对应
    -p:保留备份数据的原本权限和属性
    -g:后接增量备份的快照文件
    -C:指定解压缩的目录
    --exclude:排除不打包的目录或文件,支持正则匹配
    其他

    -X, --exclude-from:在一个文件中列出要排除的目录或文件(在--exclude=较多时使用)
    -t, --list:列出备份档案中的文件列表,不与-c、-x同时出现
    -j, --bzip2:使用bzip2工具(解)压缩,后缀一般为.bz2
    -P:保留绝对路径,解压时同样会自动解压到绝对路径下
    -v:(解)压缩过程显示文件处理过程,常用但不建议对大型文件使用
    增量备份(网站)数据

    许多系统(应用或网站)每天都有静态文件产生,对于一些比较重要的静态文件如果有进行定期备份的需求,就可以通过tar打包压缩备份到指定的地方,特别是对一些总文件比较大比较多的情况,还可以利用-g选项来做增量备份。

    备份的目录最好使用相对路径,也就是进入到需要备份的根目录下

    具体示例方法如下。

    备份当前目录下的所有文件
    # tar -g /tmp/snapshot_data.snap -zcpf /tmp/data01.tar.gz .

    在需要恢复的目录下解压恢复
    # tar -zxpf /tmp/data01.tar.gz -C .
    -g选项可以理解备份时给目录文件做一个快照,记录权限和属性等信息,第一次备份时/tmp/snapshot_data.snap不存在,会新建一个并做完全备份。当目录下的文件有修改后,再次执行第一条备份命令(记得修改后面的档案文件名),会自动根据-g指定的快照文件,增量备份修改过的文件,包括权限和属性,没有动过的文件不会重复备份。

    另外需要注意上面的恢复,是“保留恢复”,即存在相同文件名的文件会被覆盖,而原目录下已存在(但备份档案里没有)的,会依然保留。所以如果你想完全恢复到与备份文件一模一样,需要清空原目录。如果有增量备份档案,则还需要使用同样的方式分别解压这些档案,而且要注意顺序。

    下面演示一个比较综合的例子,要求:

    备份/tmp/data目录,但cache目录以及临时文件排除在外
    由于目录比较大(>4G),所以全备时分割备份的档案(如每个备份档案文件最大1G)
    保留所有文件的权限和属性,如用户组和读写权限
    # cd /tmp/data

    做一次完全备份
    # rm -f /tmp/snapshot_data.snap
    # tar -g /tmp/snapshot_data.snap -zcpf - --exclude=./cache ./ | split -b 1024M - /tmp/bak_data$(date -I).tar.gz_
    分割后文件名后会依次加上aa,ab,ac,...,上面最终的备份归档会保存成
    bak_data2014-12-07.tar.gz_aa
    bak_data2014-12-07.tar.gz_ab
    bak_data2014-12-07.tar.gz_ac
    ...

    增量备份
    可以是与完全备份一模一样的命令,但需要注意的是假如你一天备份多次,可能导致档案文件名重复,那么就会导致
    备份实现,因为split依然会从aa,ab开始命名,如果一天的文件产生(修改)量不是特别大,那么建议增量部分不
    分割处理了:( 一定要分割的话,文件名加入更细致的时间如$(date +%Y-%m-%d_%H) )
    # tar -g /tmp/snapshot_data.snap -zcpf /tmp/bak_data2014-12-07.tar.gz --exclude=./cache ./

    第二天增备
    # tar -g /tmp/snapshot_data.snap -zcpf /tmp/bak_data2014-12-08.tar.gz --exclude=./cache ./
    恢复过程

    恢复完全备份的档案文件
    可以选择是否先清空/tmp/data/目录
    # cat /tmp/bak_data2014-12-07.tar.gz_* | tar -zxpf - -C /tmp/data/

    恢复增量备份的档案文件
    $ tar –zxpf /tmp/bak_data2014-12-07.tar.gz -C /tmp/data/
    $ tar –zxpf /tmp/bak_data2014-12-08.tar.gz -C /tmp/data/
    ...
    一定要保证是按时间顺序恢复的,像下面文件名规则也可以使用上面通配符的形式
    如果需要定期备份,如每周一次全备,每天一次增量备份,则可以结合crontab实现。

    备份文件系统

    备份文件系统方法有很多,例如cpio, rsync, dump, tar,这里演示一个通过tar备份整个Linux系统的例子,整个备份与恢复过程与上面类似。
    首先Linux(这里是CentOS)有一部分目录是没必要备份的,如/proc、/lost+found、/sys、/mnt、/media、/dev、/proc、/tmp,如果是备份到磁带/dev/st0则不必关心那么多,因为我这里是备份到本地/backup目录,所以也需要排除,还有其它一些NFS或者网络存储挂载的目录。

    创建排除列表文件
    # vi /backup/backup_tar_exclude.list
    /backup
    /proc
    /lost+found
    /sys
    /mnt
    /media
    /dev
    /tmp

    $ tar -zcpf /backup/backup_full.tar.gz -g /backup/tar_snapshot.snap --exclude-from=/backup/tar_exclude.list /

    注意

    使用tar无论是备份数据还是文件系统,需要考虑是在原系统上恢复还是另一个新的系统上恢复。

    1、tar备份极度依赖于文件的atime属性,
    2、文件所属用户是根据用户ID来确定的,异机恢复需要考虑相同用户拥有相同USERID
    3、备份和恢复的过程尽量不要运行其他进程,可能会导致数据不一致
    4、软硬连接文件可以正常恢复


    做计划任务
    每周一凌晨12点20分进行全备
    每天凌晨12点50进行增备

    全备脚本:
    #!/bin/bash

    backdir=/service/nginx/html/bbs
    datadir=/databackup
    bbssnap=/databackup/bbs.snap

    [ ! -d $backdir ] && echo "website data not exist!"
    [ ! -d $datadir ] && mkdir $datadir

    cd $backdir

    if [ -f $bbssnap ]
    then
            rm -rf $bbssnap
            tar -g $bbssnap -zcpf $datadir/bbs_full_$(date +%F-%H-%M-%S).tar.gz ./
    else
            tar -g $bbssnap -zcpf $datadir/bbs_full_$(date +%F-%H-%M-%S).tar.gz ./
    fi


    增备脚本:
    #!/bin/bash

    backdir=/service/nginx/html/bbs
    datadir=/databackup
    bbssnap=/databackup/bbs.snap

    [ ! -d $backdir ] && echo "website data not exist!"
    [ ! -d $datadir ] && mkdir $datadir

    cd $backdir

    if [ -f $bbssnap ]
    then
            tar -g $bbssnap -zcpf $datadir/bbs_increment_$(date +%F-%H-%M-%S).tar.gz ./
    else
            echo "$bbssnap not exist!!!"
    fi


    最后添加计划任务
    crontab -e
    20      0       *       *       1       /sh/bbs_full.sh
    50      0       *       *       *       /sh/bbs_increment.sh

    最后启动计划任务,并开机自启动
    service crond start
    chkconfig crond on
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部