备份文件后自动对比、删除脚本

最近公司在进行数据备份计划,所以我编写了“scp自动复制脚本”与“rsync+inotify实现服务器之间文件实时同步”的2个备份文档,2个方案都成功的被使用,领导与同事都认为能解决备份问题,接下来在进行备份的时候,也没用发现问题,证明我弄的备份文档还可以,领导还说我弄的不错 。
但在接下来备份的中途,发现服务端(也就是要做备份的服务器)的磁盘空间满了,在这台服务器的一些服务写不了输入到服务器里(这个是通过nagios监控磁盘空间得到的报警邮件,但我明明设置为磁盘空间超过80%warning报警,超过90%进行crtical报警,但磁盘空间都满了才收到报警,不知道哪里设置错了,还在查找),所以我们打算清理一些文件,获得一些空间。当我登陆服务器就发现没有什么可以删除的文件,但服务器磁盘空间都满了超过5分钟了,领导们都很着急,最后没办法只能在正在进行备份任务的服务端,删除一些已经备份到备份服务器的文件,这个是最后的办法了,但那个备份的目录里有8509个文件夹,每个文件夹里有3000-7000左右的txt文件,我当时进行的是scp自动复制,如果想删除哪些文件的话,还得去备份端查看哪些文件已经在备份端接收了,然后在去服务端删除,这样的话,太浪费时间了,而且工作量太大,每个文件大约能有3-5m,刚开始我清理了20个,获得了83m,这样服务端的应用服务可以写入数据到服务器了,但生成的文件速度太快了(以前磁盘空间大的时候也没用注意 ),比我删除的速度都快,这样的话,过一会磁盘就又满了。没办法,我就打算用脚本来解决此问题,在经过30分钟左右时间,总算写成了一个脚本,在测试机里测试了几遍没用问题发现,就在生产的服务器里运行了这个脚本,发现删除速度很快,没用误删除文件,总算解决了这个问题。下面是我为这个“备份文件自动对比、删除脚本”写的运维人员使用手册,一个技术文档。

备份文件自动对比、删除脚本

一、目的

由于引擎服务器里应用服务每五秒生成一个文件夹,每个文件夹有3000-7000左右的txt文档,所以造成引擎服务器的磁盘空间饱满,不能正常的工作,为了解决这种情况,我编写了“ssh信任与scp自动备份脚本”与“rsync+inotify实时同步服务器文件”这2种解决方法,但发现备份任务可以完成,并符合公司平台的要求,但在做备份的时候,很可能引擎服务器的磁盘空间就满了,没有办法正常工作,或者在备份完成的时候,由于文件数目很多,没有办法知道哪些是备份完成的,哪些是没有备份的,及时做wc -l对比也不行,所以根据这种情况,我又编写了一份“备份文件自动对比、删除脚本”,用自动化的方式来实现备份文件的自动对比、删除,解决了磁盘空间满的问题,为我们运维的工作节省了很多的时间,去解决其他的问题。

二、实现机制

是通过脚本的方式实现自动化,在服务端与备份端都运行此脚本,产生日志,并把备份端的日志传到服务端,并在服务端的要备份目录里,运行rm脚本,实现了备份文件自动对比、删除。

三、脚本内容解释A.服务端server

#!/bin/bashserver="$(ls-l/usr/local/lbs/file/area|awk'{print$9}')"###此为查看要备份的目录,并把他的文件名复制到server_log日志里echo$server>/tmp/server_log

注意:在server脚本里面,server="$(ls -l /usr/local/lbs/file/area|awk '{print $9}')" 这个里面,ls -l /usr/local/lbs/file/area是你做备份的目录(是服务端机器的要做备份的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,如何查询当前服务器使用哪种字体,可以使用cat /etc/sysconfig/i18n命令,查询结果为LANG="en_US.UTF-8",则是英文字体;查询结果为LANG="zh_CN.UTF-8",则为中文字体。

B.备份端back

#!/bin/bashback="$(ls-l/home/beifen/area|awk'{print$9}')"###此为查看做备份的目录,并把它的文件名负责到back_log日志里echo$back>/tmp/back_log

在back脚本里面,ddir="$(ls -l /home/back/area20120208|awk '{print $9}')"这个里面,/home/back/area20120208是你做备份的目录(是备用机器的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,

如何查询当前服务器使用哪种字体,可以使用cat /etc/sysconfig/i18n命令,查询结果为LANG="en_US.UTF-8",则是英文字体;查询结果为LANG="zh_CN.UTF-8",则为中文字体。

C.服务端的rm

#!/bin/basha="$(cat/tmp/server_log)"##定义a为查看服务端日志里文件名b="$(cat/tmp/back_log)" ##定义b为查看备份端日志里文件名 forain$b; ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。dorm-rf$bdone

四、部署脚本1、在备份端

把back上传到备份端,给764权限然后运行sh back,就能在/tmp里看到一个back_log日志文件产生,并把此文件上传到被备份端的/tmp目录下;2、服务端A.把server上传到此服务器上,给764权限然后运行sh server,就能在/tmp里看到一个server_log日志文件产生;B.把rm上传到此服务器,具体路径为/usr/local/lbs/file/area,给764权限;C.运行sh rm,等待一会就能自动的删除area里的文件(只是在存储里删除贵州备用机器里已有的文件)五、备注此脚本只适用与备份端的(/home/beifen/area)与被备份端的(/usr/local/lbs/file/area)之间的文件传输与自动删除area里的文件,其他情况不适用。如果你想进行备份其他目录里的文件的话,需要修改服务端server里的内容与备份端back里的内容,并且把rm上传到服务端中要做备份里的目录下。

以上是我编写的运维手册,可能大家很多地方看不明白,我在下面进行一些操作,可以使大家更明白。

下面是进行操作的2太服务器的结构,分别有主机名、ip地址、备份的身份status(是服务端还是备份端)、系统、内核、位数;

备份文件后自动对比、删除脚本

1、服务端(我这里是savecenter)

把server上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

#!/bin/bashserver="$(ls-l/tmp/test|awk'{print$9}')"###此为查看要备份的目录,并把他的文件名复制到server_log日志里echo$server>/tmp/server_log

2、备份端(我这里是nagios)

把back上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

#!/bin/bashback="$(ls-l/tmp/test|awk'{print$9}')"###此为查看做备份的目录,并把它的文件名负责到back_log日志里echo$back>/tmp/back_log

现在脚本已经上传到服务器里,准备工作完成,下面可以测试我的脚本了。但我还是先说明一下,这次实验的目的,是要在服务端(savecenter)里建立1-10,10个文件夹,然后在备份端(nagios)建立1-5,5个文件夹,在使用我的脚本,查看能否自动的进行对比与删除。

但为什么需要在服务端建立10个文件夹,备份端建立5个文件夹呢?

因为如果服务端在做备份的时候,把文件备份到备份端,但可能备份没有完成,还正在进行备份任务,所以可能服务端里有10个文件夹,但备份端里只接受到了5个,但这时服务端的磁盘空间满了,为了获得空间,需要删除已经做备份的文件,所以我这里是在服务端里建立了10个文件夹,备份端建立了5个文件夹,代表备份没有完成、正在进行,然后使用我的脚本,删除服务端里跟备份端的5个文件夹相同名字的文件夹,如果无误,说明我的脚本能够实现备份的文件自动对比、删除。

3、现在在服务端创建1-10,10个文件夹,结果如下图

备份文件后自动对比、删除脚本

4、在备份端创建1-5,5个文件夹,结果如下图

备份文件后自动对比、删除脚本

5、现在在服务端运行server脚本,就能获得server_log日志,里面内容都是/tmp/test下1-10,10个文件夹的名字;

备份文件后自动对比、删除脚本

6、在备份端运行back脚本,能得到back_log日志,里面的内容为/tmp/test下1-5,5个文件夹的名字

备份文件后自动对比、删除脚本

7、现在把备份端的back_log日志,传到服务端的tmp目录下

[root@nagiostmp]#scpback_log172.16.6.2:/tmpback_log100%100.0KB/s00:00

8、把rm上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

#!/bin/basha="$(cat/tmp/server_log)"##定义a为查看服务端日志里文件名b="$(cat/tmp/back_log)" ##定义b为查看备份端日志里文件名 forain$b; ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。dorm-rf$bdone

9、在服务端运行rm脚本,它自动对比server_log日志与back_log日志,如果server_log日志里的名字在back_log里,就删除back_log日志里的内容,达到自动对比、删除功能

下面是服务端运行rm的情况与结果图

备份文件后自动对比、删除脚本

从图上看,1-5,5个文件夹都已经删除了

下面是备份端的tmp/test下的截图

备份文件后自动对比、删除脚本

从上面可以看见,1-5,5个文件夹没有变化,所以我的这个“备份文件自动对比、删除脚本”实现了备份文件的自动对比并自动删除任务。

总结:我编写的这个“备份文件自动对比、删除脚本”适用于备份的文件数目多,正在进行备份任务,但需要删除已经做备份的文件,或者备份任务完成,但备份的文件很多、很杂,删除需要对比在删除,很浪费时间与人力,使用了此脚本加上我前文写的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”可以实现自动化的、实时的同步或者备份服务器文件,并在正在进行备份任务或者完成备份任务的时候,自动对比、删除已经备份的文件,节省人力与时间。

虽然我写的比较多,而且可能有点复杂,但实现的功能还是很强的,脚本也很容易读懂,如果各位想在自己的环境下运行,需要根据各位的需要进行相应的修改了,如果还有什么不懂的地方,可以留言给我,我会及时的帮各位解答.

下面是原文作者的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”链接:

“ssh信任与scp自动复制脚本” http://dl528888.blog.51cto.com/2382721/769519

“rsync+inotify实时同步服务器文件”http://dl528888.blog.51cto.com/2382721/771533

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


系ubuntu 下面打开终端输入:sudo apt-get install sendmail一般就安装完成噶啦跟住进入 /etc/mail/目录输入:m4 sendmail.mc > sendmail.cf意思系跟住.mc文件 生成 sendmial.cf文件输入呢个命令:ps aux | g
依家我有1个软件goagent目录(大家懂得) 放在/home/gateman/Programs/ 下 1. proxy.py 入面有1个 proxy.py 文件 放在/home/gateman/Programs/goagent/local/ 入面 2.breakwall.sh 我在 proxy.p
其实我想讲的是 cp -L关于-L参数的解释:-L, --dereference always follow symbolic links in SOURCE意思是如果复制目标是1个软链接,则复制链接的目标 不是链接本身做个例子: 例如 ~/tmp/fo1 入面有1个c.txt 文件 和 指向他的软
原地址:http://www.rjgc.net/control/content/content.php?nid=4418 1、将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/do
chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。实例:用live CD ubuntu假设你的
简单解析下, stdin就是标准输入, stdout就是标准。举个例子, 在当前我要打包1个文件夹 /var/log/ 到当前目录下,并用zip压缩,那么我们可以分步执行#tar -cvf log.tar /var/log/#zip -r log.tar.zip log.tar#rm -rf log
转自:http://man.ddvip.com/linux/Mandrakelinuxref/process-priority.html系统中运行的每个进程都有一个优先级(亦称“nice 值”),其范围从 -20 (最高优先级)到 19 (最低优先级)。默认情况下,进程的优先级是 0 (“基本”调度
str="/home/gateman" if [ ${str:0:1} = "/" ]; then echo "yes'fi ${str:0:1} 中0表示从第几个字符开始,1表示截取多长
转自:http://kwokchivu.blog.51cto.com/1128937/694347 在RedHat系统下用usermod 命令可把某用户添加进多个附属组,默认情况下,一次性添加多个附属组可用以下方式来添加: usermod -G 附属组1,附属组2,...,附属组X 用户名 但在添加
有个文件 test.txt 内容如下:bash-3.00$ cat test.txt user user user_hiuser #注:呢行系空行T JGATEMANGATTTTTEMANGABBEMANAAABbash-3.00$下面介绍下常用的通配符 配合grep 命令:1. ".&q
linux系统为每1个文件都分配有i索引节点(inode),系统根据呢d节点从磁盘找出数据。 一般来讲,每1个文件名(包含全路径)实际上都链接住1个i索引节点。inode实际上系乜咧? 其实可以算系1个指向磁盘具体位置(柱面,扇区之类)的指针, 系统分析某个文件的inode,得出磁盘柱面,扇区等数据
grep 可以立即为筛选, 一般的用法系 grep + 要查询的字段 + 文件(或者内容 例如| 传递既内容)1.grep + 要查询的字段 + 文件gateman@GPC:~/shell/SQL_GSI$ grep OID a.sqlWHERE OID=@BuildNOWHERE OID INWH
原文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html开始之前人类大脑对文字的处理是平面式的,所以我们浏览文章、查找资料或者重构代码,要么是横向读,要么是纵向读,要么使用搜索功能,将文字作为一个平面整体。而在
PS:偶很喜欢用scp这个命令来传输数据。scp命令跟cp命令类似,只不过cp命令是在同一台机器上用的,scp是在两台机器上复制传输数据的命令。scp实质相当于利用SSH协议来传输数据的cp命令。 用法举例: 1、复制远程服务器的文件到本地: scp -P888 root@120.18.50.33:
打开终端,进入/bin/ls 一下会见到 bash sh 呢两个文件。其实距地系两个唔同既shell 解析器。如果在脚本a.sh 开头写入#!/bin/sh那么执行./a.sh 时候 就相当于 sh a.sh同理 开头写入#!/bin/bash执行./a.sh 时候 就相当于 bash a.sh如果
find查找文件的时候排除某个或几个文件或目录转自:http://www.cnblogs.com/starspace/archive/2008/10/20/1315380.html比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件find /usr/sam -path "/
假设有变量 var=http://www.google.com/test.htm一 # 号截取,删除左边字符,保留右边字符。echo ${var#*//}其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符即删除 http://结果是 :www.goog
转自: http://edyfox.codecarver.org/html/_vimrc_for_beginners.htmlVIM 中可供用户定制的选项非常非常多,作为初学者,我们没有必要了解这么多东西。下面,滇狐简单列出了一些最常用的配置项,大家可以根据自己的需要将这些内容添加到自己的 .vim
转自:http://www.einit.com/user1/11/archives/2006/3603.htmlUnix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysq
首先, mount是类unix系统, 挂载设备到1个文件夹的操作命令, 注意系设备阿正常来讲,mount 是不能挂在文件夹到文件夹的。例如, 在我的~/tmp/ 目录中有两个文件夹fo1 fo2其中fo1 中有3个文件a.txt b.txt c.txt fo2 有4个 e.txt d.txt e.t