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

前言

最近公司在进行数据备份计划,所以我编写了“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/bash  server="$(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/bash  back="$(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/bash  a="$(cat /tmp/server_log)" ##定义a为查看服务端日志里文件名  b="$(cat /tmp/back_log)" ##定义b为查看备份端日志里文件名   for a in $b;             ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。  do   rm -rf $b  done

四、部署脚本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/bash  server="$(ls -l /tmp/test|awk ‘{print $9}‘)"    ###此为查看要备份的目录,并把他的文件名复制到server_log日志里  echo $server > /tmp/server_log

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

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

#!/bin/bash    back="$(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目录下

[[email protected] tmp]# scp back_log 172.16.6.2:/tmp  back_log                                                                100%   10     0.0KB/s   00:00

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

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

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

时间: 2024-08-10 23:28:07

备份文件自动对比、删除脚本的相关文章

写了一个批处理,可以实现文件备份,自动对比删除冗余文件。

替换的原则是按照文件修改时间,替换掉修改时间教早的. set desdir=D:set filetypes=pdf uvproj bat c h s lib cpp txt rar del /s /q s:\backtempsrc.t>nul del /s /q s:\backtempdes.t>nul del /s /q s:\dellist.t>nul cls @echo off&setlocal enabledelayedexpansion set /p sels=&quo

linux mysql自动备份删除脚本

创建备份目录       /bak/mysqlbak 编写运行脚本 vim /home/bakmysql.sh 代码: #!/bin/bash backupdir=/bak/mysqlbak time="$(date +"%Y%m%d%H%M")" /usr/local/mysql/bin/mysqldump -u XXXX(用户名) -pXXXX(密码) XXXX(数据库名称) | gzip > $backupdir/XXXX(自定义标识)$time.sql

atitit.提升备份文件复制速度(3) ----建立同步删除脚本

atitit.提升备份文件复制速度(3) ----建立同步删除脚本 1. 建立同步删除脚本两个方法.. 1 2. 1从回收站info2文件... 1 3. 清理结束在后snap比较 1 4. Npp replace  gene del from lst 1 5. Code 2 1. 建立同步删除脚本两个方法.. 2. 1从回收站info2文件... Copy info2 {String s="G:\\RECYCLER\\S-1-5-21-602162358-1284227242-68200333

windows bat脚本实现ftp自动下载 删除

现在有一个需求就是把远程某个文件下面的图片,下载到本地,并且删除下载成功的的文件,而且远程目录下的那个图片会随时增加.假设一下如果所有的脚本都写好了,那么就需要调用windows上的计划任务定时执行脚本就ok了,Linux上利用cronjob 同样可以做到.大体的实现思路如下,当然了不止这一种方式. 在远程服务器上搭建ftp server ,例如这里在远程服务上的 images 作为下载目录.搭建ftp server 最简单的方式就是用FileZilla Server 这个工具去搭建,很方便,零

sql server编写archive通用模板脚本实现自动分批删除数据

博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常使用.然后就对delete语句进行按均匀数据量分批delete的改写,这样的话,原来的删除一个表用一个语句,就可能变成几十行,如果archive的表有十几个甚至几十个,那我们的脚本篇幅就非常大了,增加了开发和维护的成本,不利于经验比较少的新入职同事去开发archive脚本,也容易把注意力分散到所谓分

debian mysql 定时自动备份的脚本

#!/bin/sh LOG=/var/log/mysql-backup.log # mysql db info USER_ROOT=XXXXXX USER_PWD=XXXXXXX # mysql data stored dir TODAY=`date +%F` STOREDIR=/mnt/tf-card/mysql-back/$TODAY mkdir $STOREDIR echo "*** PATH:$STOREDIR mysql-backup ***" >> $LOG #

应用maven自动部署的脚本

@(编程) 最近写了一个自动部署的脚本,可以一键部署到测试服务器或者生产服务器上,包括一个函数脚本和一个调用脚本,比较简单,记录如下. 特点如下: 部署前自动备份 可以部署tomcat项目和java项目 支持参数,可以部署测试环境和生产环境 function.sh #!/bin/bash ##author:zch ##date:20171116 host=192.168.163.50 if [ "$1"x = "online"x ]; then host=111.1

安全删除脚本

干掉一个公司,其实只需要一条命令.而rm -rf / 就是比较好使的一条... 那么我们在生产环境到底该如何操作才能让自己不背锅呢?咱们今天就用一个自定义的脚本来避免使用rm命令酿成大错. 波哥写了个简单的小例子,以供大家参考. 例如我们要删除这个文件: 那么我们只需要执行脚本加上我们要删除的目录名字: 这样会在/data里面创建一个日期为名,然后同名称的文件夹,并且会把相关内容先备份过来.再删除目标文件,如果我们忽然发现啥删错了.只需要把这个备份文件还原回去就好了. 那么如果真的不想要呢?那你

经典实用的自动创建Bash脚本文件头的脚本

今天给大家展示一下,我自己写的一个自动创建Bash脚本文件头的脚本(名为create),希望能对初学脚本者带来一定的思维提示.毕竟对于一个经常写脚本的运维人员来说,每次写脚本的时候都需要重复的去写一遍文件头,也是一件很累赘的事情,既然我们学了脚本,为什么不让它来为我们减轻一下负担了.所以一个自动创建Bash脚本文件头的想法在我脑海里面产生了. 本脚本所需要实现的功能: 1,能够自动创建一个标准的Bash脚本文件头,带有详细注释信息 2,能够给新建完成的Bash脚本文件自动添加执行权限 [[ema