文档章节

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

雁南飞丶
 雁南飞丶
发布于 2015/10/28 19:23
字数 2379
阅读 810
收藏 16
点赞 0
评论 0

一、概述

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

何时进行备份?

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

备份到哪?

显然备份到系统所在磁盘不是明智之举,用户应该备份到外接硬盘或者磁带上面。
为了让文章看上去更简单,本文所做的例子并没有备份到外接设备上,而是在/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 / )"



© 著作权归作者所有

共有 人打赏支持
雁南飞丶
粉丝 37
博文 124
码字总数 216404
作品 0
西安
运维
xtrabackup的mysql备份脚本(一)

一、安装xtrabackup工具 安装方法见:xtrabackup安装 # wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.1/binary/tarball/percona-xtrabackup-2.4.1-Linux-x86......

zouqingyun ⋅ 2016/08/25 ⋅ 0

Ubuntu如何备份和恢复系统

Ubuntu如何备份和恢复系统 在 使用Ubuntu之前,相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后...

首席安全砖家 ⋅ 2013/03/10 ⋅ 3

jenkins插件安装与升级[三]

标签(linux): jenkins 笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流 默认的插件 jenkins常用插件 SSH plugin GitLab Plugin Pipeline Git plugin Git Parameter Plu...

陈天刚 ⋅ 2017/08/24 ⋅ 0

rsync中如何让软连接与源文件同时被推送备份

rsync的优缺点 优点: 1.优点 可以使用增量进行备份,支持socket,几种(支持推拉,都是以客户端为参照) 2.远程shell同道还可以加密(ssh)传输,socket,需要加密传输,可以利用VPN服务或者ipsec服务....

高蛋白小虫 ⋅ 2017/06/23 ⋅ 0

什么是完全备份、增量备份、差异备份

1.完全备份 完全备份(full backup),这种数据备份方式将每个档案都会被写进备份档去。如上所述,如果两个时间点备份之间,数据没有任何更动,那么所有备份数据都是一样的。这问题出自备份系...

qualityserver ⋅ 2017/07/22 ⋅ 0

马哥linux教程分享之使用Xtrabackup进行MySQL备份

一、安装 1、简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点: (1)备份过程快速、可靠; ...

小小295813080 ⋅ 2014/09/03 ⋅ 0

Xtrabackup与innobackupex热备份MySQL数据

Xtrabackup与innobackupex热备份MySQL数据 一.Xtrabackup 简介及备份原理说明: Xtrabackup是由percona开发的一个开源软件,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时...

烟头网管 ⋅ 2015/12/02 ⋅ 0

服务器备份脚本

服务器里的数据是相当地重要,要是服务器的数据坏了,没有备份那就玩大了。于是老大让做一个服务器数据备份脚本。 我思考了一下备份策略。定时将服务器里的数据打包通过网络存放到另一台服务...

临峰不畏 ⋅ 2014/04/07 ⋅ 0

差异备份、增量备份、完全备份的区别

差异备份、增量备份、完全备份的区别 1、当前主流的备份技术 数据备份: 即针对数据进行的备份,直接复制所要存储的数据,或者将数据转换为镜像保存在计算机中。诸如Ghost等备份软件,光盘刻...

zhailibao ⋅ 2014/02/28 ⋅ 0

Linux和类Unix系统上5个惊艳的开源备份软件

 一个好的备份计划是非常必要的,这样可以有能力恢复被下面几种情形顺坏的数据: 人为损坏 RAID或者磁盘损坏 文件系统损坏 数据中心损毁以及其它   在这篇文章里我会给你列举一些惊艳的开...

Ryan-瑞恩 ⋅ 2014/11/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 23分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 46分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 47分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 55分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部