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

标签: linux tar 数据备份 | 发表时间:2014-12-12 12:44 | 作者:seanlook
出处:http://segmentfault.com/blogs

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无论是备份数据还是文件系统,需要考虑是在原系统上恢复还是另一个新的系统上恢复。

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

参考


原文链接地址: http://seanlook.com/2014/12/08/tar_backup_filesystem/


相关 [tar 命令 备份] 推荐:

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

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

Linux wget命令

- - CSDN博客推荐文章
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径. 例如: # wget  http://www.linuxsense.org/xxxx/xxx.tar.gz. 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载.

lsof命令

- - Dutor
  lsof, LiSt Opened Files, 列出打开的文件, 听起来很简单的样子. 但想*nix中很多其他工具一样, lsof把这件简单的事情做到了炉火纯青. 因为Unix认为”一切皆文件”, 那么”打开的文件”就不仅仅是传统意义上打开的文件了, 还可以是网络/Unix域套接字, 匿名/具名管道, 共享库文件, 目录文件, 设备文件等等.

sqlite3命令

- - 移动开发 - ITeye博客
转载自: http://www.cnblogs.com/frankliiu-java/archive/2010/05/18/1738144.html. SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令. 本文档提供一个样使用sqlite3的简要说明.

Linux iostat命令

- - CSDN博客系统运维推荐文章
iostat用于输出CPU和磁盘I/O相关的统计信息. . iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [. iostat各个参数说明:. -c 仅显示CPU统计信息.与-d选项互斥. -d 仅显示磁盘统计信息.与-c选项互斥.

tcpdump命令

- - CSDN博客推荐文章
英文原意是dump traffic on a network ,即截获网络上的数据报,可以根据指定的网络接口来截获不同的数据报. 它会输出在某个网络接口上符合匹配表达式的报内容的描述. 当tcpdump完成抓包后,会打印出类似下面的内容: . 当然,在读取网络上的数据包时,得需要特权,比如linux上的超级用户.

linux命令locate

- - 操作系统 - ITeye博客
    locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息. Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件.

xtrabackup 增量备份和部分备份

- - CSDN博客推荐文章
① 首先进行0级备份,记录此时LSN. ② 当进行1级备份时,比较表空间中每个页的LSN是否大于0级备份的LSN,如果是,则备份该页,并记录当前的LSN. 0级备份完,xtrabackup会在备份保存点下的xtrabackup_checkpoints文件里记录一个to_lsn值,该值是备份结束后全库的LSN.

oracle定时备份-增量备份

- - 数据库 - ITeye博客
在进行数据库维护的过程中经常会遇到数据库备份的问题. 先介绍一种常用的数据备份操作. 系统执行计划+批处理命令;. 在win的系统中存在 任务计划程序 选项;新建任务选中你写好的程序,设定好时间,就可以按照设定的时间执行程序了. 在备份oracle时写一个导入命令,例如. 把它考到文件中,扩展名改为.bat.

@lsof命令小节@

- - CSDN博客推荐文章
卸载移动存储时经常提示device busy,也可能误删了一个正在打开的文件.      lsof(list open files)是一个列出当前系统打开文件的工具. 在linux环境下,任何事物都以 文件的形式存在,通过文件不仅仅可以访问 常规数据,还可以访问 网络连接和硬件. 所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口.