当前位置: 首页 > 编程日记 > 正文

[转帖]tar高级教程:增量备份、定时备份、网络备份

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

作者: lesca 分类: Tutorials, Ubuntu 发布时间: 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  command1 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

转载于:https://www.cnblogs.com/jinanxiaolaohu/p/10442611.html

相关文章:

C# 异步读取数据库里面的数据与绑定UI的解决办法

异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码 首先按习惯的方法&#xff0c;设定线程更新UI a2.CheckForIllegalCrossThreadCalls false; //a2为窗体名称 下面的代码就是从数据库里取得数据并绑定 private vo…

类、抽象类、接口之间的区别

目录 1、类与抽象类的异同之处 &#xff08;1&#xff09;类和抽象类的区别 &#xff08;2&#xff09;类和抽象类的相同之处 2、接口与类的异同之处 &#xff08;1&#xff09;接口与类相似点 &#xff08;2&#xff09;接口与类的区别 &#xff08;3&#xff09;接口…

(ASA) Cisco Web ××× 配置详解 [三部曲之一]

(ASA) Cisco Web 配置详解 [三部曲之一] 注意&#xff1a;本文仅对Web特性和配置作介绍&#xff0c;不包含SSL 配置&#xff0c;SSL 配置将在本版的后续文章中进行介绍。 首先&#xff0c;先来谈一谈ASA7.X系统中的默认隧道组和组策略。ASA/PIX 7.x系统默认在show run时不显示…

IDEA和Eclipse设置文件编码格式

1、IDEA设置已有文件的编码格式 在页面右下角可以看到文件的编码方式&#xff0c;如果编码方式的图标为灰色&#xff0c;则无法修改编码格式&#xff1b;如果其颜色不是灰色且其右侧有上下方向的三角形形状&#xff0c;点击它&#xff0c;可以修改编码方式。 注意&#xff1a;该…

关于运行ssm,web请求出现HTTP415错误

HTTP415错误&#xff1a;如果controller中用到了json传值&#xff0c;那么就必须加入 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <jackson.version>2.…

堆和栈浅析【转】

引用&#xff1a; 一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区&#xff…

JS-只能输入中文和英文

<span style"font-family:KaiTi_GB2312;">转自&#xff1a;<a target_blank href"http://www.cnblogs.com/liupeizhi/articles/2487472.html">http://www.cnblogs.com/liupeizhi/articles/2487472.html</a></span> </pre>&l…

SQL Server中读取XML文件的简单做法

SQL Server 2000使得以XML导出数据变得更加简单&#xff0c;但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦。本文介绍在SQL Server中读取XML文件的简单做法。SQL Server 2000使得以XML导出数据变得更加简单&#xff0c;但在SQL Server 2000中导入XML数据并对其进行…

Calling Oracle stored procedures from Microsoft.NET

摘自&#xff1a;http://www.c-sharpcorner.com/UploadFile/john_charles/CallingOraclestoredproceduresfromMicrosoftdotNET06222007142805PM/CallingOraclestoredproceduresfromMicrosoftdotNET.aspxIntroduction This article is intended to illustrate how to illustrate…

Https的底层原理

Http协议&#xff1a; 转载于:https://www.cnblogs.com/auldlangsynezh/p/10469587.html

【Linux笔记(002) 】-- centos7 文档操作基本命令

索引&#xff1a; 目录索引 一、cd -- ChangeDirectory a) 切换到 /DemoLM/ 文件夹 b) 回到用户 Home 根目录&#xff1a;是哪个账户登录的就会进入哪个用户的根目录 二、pwd -- PrintWorkingDirectory a) 查看当前工作目录 三、mkdir -- MakeDirectory a) 创建一个 /test/ 目录…

JDBC操作数据库实例

返回目录&#xff1a;《学生信息管理系统&#xff08;JavaJSP&#xff09;》 这里以JDBC操作MySQL数据库为例。 假设有一个名为test的数据库&#xff0c;里面有一张学生表&#xff0c;表名称为student&#xff0c;表结构如下&#xff1a; student表结构表中数据如下&#xff1…

面向JavaScript开发人员的Adobe AIR与Dreamweaver

入门教程&#xff0c;非常详细&#xff0c;CS4里面应该可以省略前面几步直接开发了。 Adobe AIR对于HTML/JavaScript应用程序与桌面的集成有着出色的支持&#xff0c;但除了所有附加功能之外&#xff0c;还需要一些其他工具和技术。这篇文章探讨了使用HTML/JavaScript的Web开发…

在数据显示页面增加按姓名查询功能

在上一章内容《将数据库中表格信息输出到页面上》的基础上&#xff0c;增加按姓名查询功能。 问&#xff1a;怎么在显示学生信息的页面增加按照姓名查询的功能&#xff1f; 答&#xff1a;在显示学生信息的页面&#xff0c;使用<form>标签为用户创建表单&#xff0c;表单…

Spring AOP的一些概念

切面&#xff08;Aspect&#xff09;&#xff1a; 一个关注点的模块化&#xff0c;这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中&#xff0c;切面可以使用通用类&#xff08;基于模式的风格&#xff09; 或者在普通类中…

有关于Matlab的regionprops函数的PixelIdxList和PixelList的一点解释

上一篇文章&#xff08;点击这里&#xff09;的最后一点说到了regionprops的相关参数的意思&#xff0c;但是总感觉不够明确 现在重新对PixelIdxList和PixelList的内容经过实验之后得到了点启发 1.首先用excel建立了一个如下的表格&#xff0c;然后用mat保存为mat的方式进行加载…

windows 系统无法启动windows event log 服务

windows 系统无法启动windows event log 服务 关键词&#xff1a;无法启动系统事件日志 尝试解决步骤 【1】权限&#xff1a;把如图中logsfile文件等都给local service 【2】把C:\Windows\System32\winevt\Logs下面的文件全部移走到其他文件夹&#xff0c;再启动服务试试看 【…

移动互联网漫谈(3)

1.1WIFI WIFI是无线局域网的一种&#xff0c;全称Wireless Fidelity&#xff0c;又称802.11b标准&#xff0c;它的最大优点就是传输速度较高&#xff0c;可以达到11Mbps&#xff0c;另外它的有效距离也很长&#xff0c;同时也与已有的各种802.11 DSSS设备兼容。今夏最流行的笔…

实现对学生表的删除操作

在上一章内容《数据显示页面》的基础上&#xff0c;增加删除超链接&#xff0c;实现删除功能&#xff1b; 修改内容&#xff1a; 在数据显示页面的表格中&#xff0c;增加一列&#xff0c;列名为“删除”&#xff0c;用来显示删除超链接&#xff1b;为表格的行标签&#xff08…

FRAME与IFRAME

FRAME与IFRAME框架概念 &#xff1a; 所谓框架便是网页画面分成几个框窗&#xff0c;同时取得多个 URL。只需要转载于:https://www.cnblogs.com/vibratea/archive/2009/07/24/1530098.html

react实现全选、取消全选和个别选择

react里面实现全选和取消全选&#xff0c;个别选择等操作&#xff0c;效果如下 代码&#xff1a; import React, {Component} from react export default class Demo extends React.Component{constructor(props,context){super(props,context);this.state {checklist:[{name:…

PAT1036:Boys vs Girls

1036. Boys vs Girls (25) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueThis time you are asked to tell the difference between the lowest grade of all the male students and the highest grade of all the female students. Input …

NERO7光雕功能

找到NERO 7 PREMIUM的这个版本&#xff1a;Nero-7.10.1.0_chs_trial.exe百度中搜这个文件就找到了&#xff0c;用下面的序列号&#xff1a;1C80-0000-19E5-MA2X-4004-9268-7320&#xff0c;再装上最新版的官方光雕程序&#xff08;集成了加深标签的插件&#xff09;&#xff1a…

hive函数 get_json_object的使用

hive提供了json的解析函数&#xff1a;get_json_object 使用方法 对于jsonArray&#xff08;json数组&#xff09;&#xff0c;如person表的xjson字段有数据&#xff1a; [{"name":"王二狗","sex":"男","age":"25"…

实现对学生信息的增加操作

上一篇博客&#xff1a;《实现对学生表的删除操作》返回目录&#xff1a;《学生信息管理系统&#xff08;JavaJSP&#xff09;》本篇博客将介绍如何实现学生表中学生信息的增加操作。 1、在test1模块的web目录下&#xff0c;新建一个stuAddForm.jsp文件&#xff08;文件内容如…

【BZOJ 3879】SvT

【链接】h在这里写链接 【题意】 给你一个长度为n的字符串以及m个询问。 每个询问询问你所给的一些后缀,所有任意两个后缀之间的lcp的总和; n<5*10^5 ∑t<3*10^6【题解】 按照这些后缀的rank值升序排 ->利用Sa数组 即输入一个x,x--; sort(a1,…

快速计算表达式树

前言 .NET 3.5中新增的表达式树&#xff08;Expression Tree&#xff09;特性&#xff0c;第一次在.NET平台中引入了“逻辑即数据”的概念。也就是说&#xff0c;我们可以在代码里使用高级语言的形式编写一段逻辑&#xff0c;但是这段逻辑最终会被保存为数据。正因为如此&#…

随手拈来尽是折劲额事体

昨天中午&#xff0c;justina同学请我去港丽吃饭&#xff0c;世界顿时美好了&#xff01; 猛地发现&#xff0c;港丽的酸菜鱼竟然非常好吃&#xff0c;除了价钱贵&#xff0c;基本没有缺点了。 吃饭的时候&#xff0c;看到两件有劲的事情&#xff0c;一件比一件更折劲&#xff…

06 面向对象之:反射,双下方法

一、反射 反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力&#xff08;自省&#xff09;。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象…

实现对学生信息的修改操作

返回目录&#xff1a;《学生信息管理系统&#xff08;JavaJSP&#xff09;》 本篇博客主要实现对学生信息的修改操作&#xff1b; 步骤1、在学生信息的显示页面&#xff08;即student.jsp页面&#xff09;中&#xff0c;在表格最后增加一列“修改”超链接&#xff0c;在<tr&…