tar高级教程:增量备份、定时备份、网络备份

作者: lesca 分类: TutorialsUbuntu 发布时间: 2012-03-01 11:42 ė浏览 27,065 次 61条评论

一、概述

备份与恢复对于系统维护而言是至关重要的事情。不合理的备份与还原会让你的数据面临丢失的风险。许多用户都在丢失重要数据后才意识到这种风险。而要从这种情况恢复数据将是非常耗时并且困难的。所以我们应该从别人的错误中吸取教训,并确保你的系统处于保护中。先考虑一些问题:

何时进行备份?

如果你可以接受一个星期的数据丢失,那么每周备份一次就足够了。但是如果你只能容忍一天的数据损失,那么你就必须每天晚上进行备份。

备份到哪?

显然备份到系统所在磁盘不是明智之举,用户应该备份到外接硬盘或者磁带上面。
为了让文章看上去更简单,本文所做的例子并没有备份到外接设备上,而是在/backup目录下。

要备份什么?

我们要备份整个系统,因此这里需要考虑的是不必备份的目录:

  • /backup
  • /proc
  • /lost+found
  • /sys
  • /mnt
  • /media
  • /dev
  • /tmp

备份方式

tar支持三种方式进行备份:
1.完整备份:备份指定的所有目标文件或文件夹
2.增量备份:仅备份atime与上次备份不同的文件或文件夹
3.差异备份:与增量备份差不多,只是增加了对Windows文件系统的支持

本文主要阐述如何用tar对系统进行增量备份,以及如何利用cron设置定时备份。

二、基础知识

mtime, atime, ctime

Linux的文件系统会记录以下三种时间
mtime: 文件修改时间。当文件内容呢发生改变时更新。 ls -l默认显示mtime
atime: 文件访问时间。当文件被访问时自动更新。要查看文件的atime,执行ls -lu
    /!\注意:atime可能在tar进行备份时可能发生变化(和文件系统和tar版本有关),可以用–atime-preserve防止这种更新。
ctime: 文件属性修改时间。当文件属性或权限发生变化时更新。要查看文件的atime,执行ls -lc

三、开始增量备份

GNU tar使用--listed-incremental选项(缩写为-g)进行增量备份:

tar -czvpf /backup/backup.tar.gz -g /backup/snapshot.snar \
--exclude=/backup --exclude=/proc --exclude=/lost+found \
--exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev \
--exclude=/tmp /

三、需要了解的

1.最后一个斜杠“/”告诉tar要从根目录进行备份。
2.tar非常依赖atime,以下情况会导致归档数据文件不一致:
 (1)备份期间对文件的任何访问
 (2)备份期间将系统时间调慢
3.tar假设待备份的文件所在磁盘设备ID是不变的,但NFS等某些文件系统并不属于这种情况,可以用--no-check-device阻止tar进行检查
4.除非情况紧急,并且你充分信任tar,否则你最好在备份时使用--verify选项(缩写为-W)以确保数据正确地进行备份。但不幸的是它并不支持所有的存储介质(比如磁带)。

5.–listed-incremental与–incremental(-g与-G)的区别

–listed-incremental(缩写为-G)是该参数是–listed-incremental(缩写为-g)的快捷选项,不需要指定增量文件。它也是旧版本的tar增量备份遗留下来的。现在常常用于解压增量备份,或者列出增量备份的文件列表。
-G与-g相比,-g能通过复制snar文件的方式创建多层次的增量备份文件,而-G却只能用level0

四、列出备份文件列表

tar -tGvvf backup.tar.gz

-t 等价于 –list
-Gvv 一种固定用法,列出文件属性的同时还显示备份属性:
Y – 该文件在归档文件中
N – 该文件不在归档文件中
D – 文件夹

五、数据恢复还原

数据恢复无需为tar指定增量文件snar,因为tar所需的信息已经包含在打包的文件中了。
要恢复数据,以下三种方式都是可行的:

方法一:

将增量文件指定为/dev/null

tar -xzvpf /backup/backup.tar.gz -g /dev/null -C /

方法二:

使用--incremental参数(缩写为-G)

tar -xzvpGf /backup/backup.tar.gz -C /

方法三:

某些情况下,你还可以省略-G选项,但这不是推荐的版本:

tar -xzvpf /backup/backup.tar.gz -C /

六、利用cron定时备份

新建cron计划任务非常简单,以下方法都可以完成:

方法一:

$ crontab -e

方法二:

# vi /etc/crontab

在笔者的Linux上,方法一只能以当前用户的权限运行计划的任务;方法二可以指定程序以哪个用户执行,但是必须以root身份编辑该文件。
在此,因为要对整个文件系统进行备份,因此仅以/etc/crontab为例进行介绍:

# m h dom mon dow user  command
 1 3 *  *  * root /root/scripts/daily_backup

这行配置表明,在每天3:01分执行/root/scripts/daily_backup这个脚本里的文件。

七、讨论

tar, cpio, rsync, dump

之前有人使用cpio进行备份,但是后来发现cpio格式无法提取单个文件。但是tar也有自己的缺点:
1.它过度依赖于atime
2.如果将归档文件恢复到一个新的文件系统中,所有文件的atime和ctime都被刷新。对于新系统,旧的增量备份文件不再适用,得重新做一遍。
相比之下,rsync似乎很好解决这个问题,而且具有较快的速度。
而dump是所有流行的备份软件中对文件完整性表现最好的[3]

八、Script(脚本)

利用tar内置的增量备份功能进行备份

本代码完成以下任务:

  • 找到备份数据库bkdb(记录当前备份的level),如果没有则从level 0开始备份
  • 以当前时间和level为备份文件以及snar文件命名
  • 复制旧版本的snar,从而提升level
  • 将新的snar指定给tar,进行备份

/!\注意:请将本脚本放置在/backup目录下运行
[bash]
#!/bin/bash
# system backup
# Sun Feb 19 00:34:42 CST 2012
# by lesca

# Read db file and config
if [ -f "bkdb" ]; then
eval `grep VER bkdb`
eval `grep NAME bkdb`
OLD=$VER
NEW=$((OLD+1))
else
NEW=0
fi

DATE=`date +%Y%m%d-%H%M%S`
BKFILE=$DATE-$NEW.tar.gz
NEWSNAP=$DATE-$NEW.snar
OLDSNAP=$NAME.snar

# Create new snapshot
if [ -e "$OLDSNAP" ]; then
cp $OLDSNAP $NEWSNAP
fi

tar -czvpf /backup/$BKFILE -g /backup/$NEWSNAP –exclude=/backup –exclude=/proc –exclude=/lost+found –exclude=/sys –exclude=/mnt –exclude=/media –exclude=/dev –exclude=/tmp /

echo VER=$NEW > bkdb
echo NAME=$DATE-$NEW >> bkdb
echo Archived $BKFILE with snapshot $NEWSNAP
[/bash]

恢复增量备份文件

本代码完成以下任务:

  • 找到备份数据库bkdb(记录当前备份的level),如果没有则结束
  • 根据bkdb指定的信息,找到备份文件和snar,进行还原
  • 检查排除备份的文件夹是否存在,不存在则创建

/!\注意:还原会刷新atime和ctime
[bash]
#!/bin/bash

end() {
echo $1
exit
}

nameOf() {
ls -1 | grep $1.tar.gz | cut -c1-15
}

if [ -f "bkdb" ]; then
eval `grep VER bkdb`
if [ $# -eq "1" ] && [ $1 -le $VER ]; then
VER=$1
fi
else
end "Error: No backup archives."
fi

ver=0
while [ $ver -le "$VER" ]; do
ARCHIVE=`nameOf $ver`-$ver.tar.gz
echo $ARCHIVE
tar -xzvpGf $ARCHIVE -C /
ver=$((ver+1))
done
NAME=`nameOf $VER`-$VER
echo VER=$VER > bkdb
echo NAME=$NAME >> bkdb

if [ ! -e /proc ]; then
mkdir /proc
fi

if [ ! -e /lost+found ]; then
mkdir /lost+found
fi

if [ ! -e /sys ]; then
mkdir /sys
fi

if [ ! -e /mnt ]; then
mkdir /mnt
fi

if [ ! -e /media ]; then
mkdir /media
fi

if [ ! -e /dev ]; then
mkdir /dev
fi

if [ ! -e /tmp ]; then
mkdir /tmp
fi
[/bash]

改进版本:利用find仅备份mtime更新的文件

本代码[4]完成以下任务:

  • 载入当前日期到环境变量
  • 每周日进行一次完全备份,删除之前的增量备份
  • 平时进行增量备份

[bash]
#!/bin/bash
#
# creates backups of essential files
#
DATA="/home /root /usr/local/httpd"
LIST="/tmp/backlist_$$.txt"
#
set $(date)
#
if test "$1" = "Sun" ; then
# weekly a full backup of all data and config. settings:
#
tar -czvf "/backup/data/data_full_$6-$2-$3.tgz" $DATA
rm -f /backup/data/data_diff*
else
# incremental backup:
#
find $DATA -depth -type f \( -ctime -1 -o -mtime -1 \) -print > $LIST
tar -czTvf "backup/data/data_diff_$6-$2-$3.tgz" "$LIST"
rm -f "$LIST"
fi
[/bash]

九、tar高级技巧

1.档案分割

创建时分割:

tar -cvpz <put options here> / | split -d -b 3900m - /name/of/backup.tar.gz

创建后分割:

split -d -b 3900m /path/to/backup.tar.gz /name/of/backup.tar.gz

2.通过netcat进行网络备份

发送端

tar -czvp <all other options> / | nc -q 0 <receiving host> 1024

接收端

nc -l 1024 > backup.tar.gz

/!\注意:由于通过网络备份tar不再需要参数-f执行备份档案名称,该名称由接收端的nc重定向指定
{i}参数说明:
-q 0: wait 0 second on QUIT
-l 1024: Listen port 1024

3.通过netcat进行网络恢复

发送端

cat backup.tar.gz | nc -q 0 <receiving host> 1024

接收端

nc -l 1024 | tar -xzvpf - -C /

4.通过SSH进行网络备份与恢复

在安装了SSH服务的主机(SSH Server)上,客户端只需直接发起连接并传送命令到目标计算机(SSH Server),就能完成操作。所有数据通过“管道”传送,用户不需要了解通过哪个端口备份(当然您也可以自行指定),而且所有传输的数据都是加密的。因此通过SSH备份,更安全、更方便、只需一人就能完成备份工作。请在准备备份的计算机上执行以下命令:

tar -cvpz <all other options> / | ssh <backuphost> "( cat > ssh_backup.tar.gz )"

要恢复文件,请执行以下命令:

cat ssh_backup.tar.gz | ssh <receivinng host> "( tar -xzvp -C / )"

想了解更多关于SSH的内容,请参看SSH端口转发(本地端口转发、远程端口转发、动态端口转发)工作原理、应用详解

References

[1] Ubuntu – BackupYourSystem
[2] GNU – Performing Backups and Restoring Files
[3] FreeBSD – 19.12 Backup Basics
[4] Backup script for Linux using tar and find

Copyright

本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

本文永久链接: https://lesca.me/archives/how-to-incrementally-backup-linux-with-gnu-tar.html

[转帖]tar高级教程:增量备份、定时备份、网络备份的更多相关文章

  1. MySQL定时备份(全量备份+增量备份)

    MySQL 定时备份 参考 zone7_ 的 实战-MySQL定时备份系列文章 参考 zmcyu 的 mysql数据库的完整备份.差异备份.增量备份 更多binlog的学习参考马丁传奇的 MySQL的 ...

  2. Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)

    高级教程:如何编写可重用的app (page 13) 本节教程上接第七部分(Page 12).我们会把我们的 web-poll应用转换成一个独立的python包,你可以在新的项目中重用或者把它分享给其 ...

  3. ios cocopods 安装使用及高级教程

    CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...

  4. Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份

    http://www.tektea.com/archives/2163.html. 在<Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份>文章中,我们介绍了使 ...

  5. 【读书笔记】.Net并行编程高级教程(二)-- 任务并行

    前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...

  6. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  7. 分享25个新鲜出炉的 Photoshop 高级教程

    网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...

  8. Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件

    点击进入:Linux shell crontab expdp 定时任务逻辑备份 定时删除旧文件 首先建一个备份数据库用批处理文件,内容如下: rem expdp sz set sz_file=SZ_% ...

  9. Linux shell crontab expdp 定时任务逻辑备份 定时删除旧文件

    点击进入:Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件 创建sh脚本 [oracle@localhost ~]$ vi logicbackup.sh 添加脚本内容 #!/ ...

随机推荐

  1. spark on yarn模式:yarn命令杀除当前的application

    在hadoop/bin目录下有yarn命令 yarn application -kill <applicationId>

  2. 发现一种写法,类似callback&&callback()

    与callback&&callback()异曲同工 return data && { title: `To-do (${data.length})`, componen ...

  3. redis学习笔记(二)-五种数据类型

    string hash hget ks k hset ks k v hgetall ks hdel ks k del ks hmset  ks k v k v list set zset 通用命令 快 ...

  4. Integer判断大于 == 127时的坑

    在一次判断返回Interger类型的code,  用==结果, 没进去 Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说 ...

  5. Python:Day20 模块

    模块是用来组织函数的. 模块一共3种: python标准库 第三方模块 应用程序自定义模块 模块搜索路径:sys.path import sys print(sys.path) import calc ...

  6. apache反向代理出现502调整

    1.问题描述:项目上线后,会在接口调用时客户端出现502异常,而服务端则对该此请求作出处理. 2.问题原因:经过排查后得知是由于请求并发量大,造成超过请求超时间,但是apache中队列已经加载到请求信 ...

  7. Oracle 周相关函数

    Oracle 周相关函数   select trunc(sysdate,'W'), --每月1日作为第一个星期第一天 取当前周第一天对应日期 trunc(sysdate,'WW'), --每年1月1日 ...

  8. ORA-08104

    https://blog.csdn.net/daiqiulong2 create index idx_p_merchant_detail_id on D_ORDER_DETAIL (merchant_ ...

  9. redis学习(一)——redis介绍及安装

    一.redis简介 redis是一个高性能的key-value非关系数据库,它可以存键(key)与5种不同类型的值(value)之间的映射(mapping),支持存储的value类型包括:String ...

  10. 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行

    emo场景,以oracle自带库中的表emp为例: select ename,deptno from emp order by deptno; ENAME DEPTNO CLARK 10 KING 1 ...