1、备份规则:

  在生产环境中有若干服务器需要定时将服务器中应用程序,以及数据库等进行备份。要求在本地服务器中保存近一周的备份,备份服务器中保存最近一月的备份文件。

                               

  以服务器A为例:在服务器A上有应用程序业务及(/ucap/UServer_V5.5.1_5002),有数据库业务(mongodb和mysql)需要将以上三个业务进行备份,且在A服务器上创建backup-dir将备份文件存放在目录下,每日凌晨进行备份,并将备份文件上传至备份服务器(NFS),在平时备份服务器与服务器A不会有联系,即只是在上传备份文件,服务器A自动挂载备份文件共享目录,备份完成卸载目录。本地服务器保存近一周文件,备份服务器保存近30日备份文件。

2、具体实现如下步骤:

  

 #delet backup when is sunday   周日删除上周文件。
WEEK=$(date +%w)
BACKUP_ROOT=/backup
BACKUP_DIR=/backup/backup_full_`date +%F`
if [ -e $BACKUP_ROOT ]
then
cd $BACKUP_ROOT #如果/backup目录存在,进入目录。
if [ $WEEK -eq ]
then
rm -rf $BACKUP_ROOT/* #如果进入是星期天(0表示星期天)执行删除/backup下所有的备份文件。
fi
if [ $? -eq 0 ] #判断是否删除成功
then
action "old-backup is remove." /bin/true
fi fi
####mkdir backup-dir #创建本地备份目录。如果目录存在则输出目录已经存
#在,否则表示不存在目录则创建包含时间的目录文件目录
if [ -e $BACKUP_DIR ]
then
action "$BACKUP_DIR had been created." /bin/true
else
#含当前时间的目录文件实际可以用$BACKUP_DIR
mkdir -p /backup/backup_full_`date +%F`
action "$BACKUP_DIR is creating." /bin/true
fi

本地创建备份目录及周日删除

  注意:周日删除必须在创建当天目录之前。因为一旦先创建目录在删除文件由于使用的是rm -rf $BACKUP_ROOT/*意思是将本地备份目录下的所有文件删除,所有新创建的目录也会被删除。因此应该执行先删除再创建。

 ###tar backup  /ucap/UServer_V5..1_5002
CMSP=/ucap
cd $CMSP
FILE_UCM=UServer_V5..1_5002
#使用tar -g快照功能进行备份将快照snapshot.cms也存放在备份目录下,然后将备份文件按照ip地址以及日期进行打包存放在备份目录下的当日文件目录下。
tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null >& if [ $? = ] #判断是否执行成功。
then
action "$FILE_UCM is backup." /bin/true
else
action "$FILE_UCM is no been backuped." /bin/true
fi
###tar backup /ucap/mongodb
CMSP=/ucap
cd $CMSP
FILE_UCM=mongodb
#备份规则同上。
tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null >& if [ $? = ]
then
action "$FILE_UCM is backup." /bin/true
else
action "$FILE_UCM is no been backuped." /bin/true
fi

备份文件及mongodb

 #parameter defined
BAKDATE=`date +%F`
MYSQL_PATH=/usr/local/mysql/bin
MYUSER=root
MYPASS="Ucap7890&*()"
#DBNAME=`mysql -uroot -p'Ucap7890&*()' -e "show databases;"|grep cpmdb`
DATA_FILE=${BACKUP_DIR}/mysql_backup_${BAKDATE}.sql.gz
[ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR}
#command defined
#定义mysqldump命令备份cpmdb库并进行行锁
MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u$MYUSER -p$MYPASS -S /tmp/mysql.sock -F -B cpmdb --single-transaction -e"
#backup command#执行命令并用GZI打包至备份目录当前日期下的文件中。
${MYSQL_DUMP} | gzip > $DATA_FILE

Mysql备份

 #####copye backup_tar to backup_server
BACKUP_SERVER=23.202.1.23:/backup/Search #NFS备份服务器
LOCAL_DIR=/backup1 #本地挂载点
RPC_PID=`/etc/init.d/rpcbind status|wc -l` #判断RPC
MOUNT_STATUS=`df -h | grep backup1 | wc -l` #判断是否已经挂载
BACKUP_FILEDIR=backup_full_`date +%F`
SERVER_IP=`ifconfig| grep Bcast|awk '{print $2}'` #本机IP
if [ ! -e ${LOCAL_DIR} ] #判断挂载点目录是否存在
then
mkdir ${LOCAL_DIR}
fi if [ ${RPC_PID} -eq ] #判断RPC-BIND是否启动没有启动执行启动
then
/etc/init.d/rpcbind start
fi
if [ $MOUNT_STATUS -eq ] #判断NFS是否挂载没有挂载执行挂载
then
mount -t nfs ${BACKUP_SERVER} ${LOCAL_DIR}
cd ${LOCAL_DIR} #进入挂载目录
find ${LOCAL_DIR} -mtime + -exec rm{} \; #删除30天以前文件
if [ `find ${LOCAL_DIR} -mtime + -exec ls{} \;|wc -l` -eq ] #如果没有了30天前的文件将本地备份目录下的备份文件备份至备份服务器。
then
cd $BACKUP_ROOT
cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/
fi
if [ $? -eq ] #判断执行是否成功,成功后卸载挂载目录。
then
umount -l ${LOCAL_DIR}
fi
else #表示已经挂载了NFS备份服务器执行删除备份卸载。
cd ${LOCAL_DIR}
find ${LOCAL_DIR} -mtime + -exec rm{} \;
cd $BACKUP_ROOT
cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/
umount -l ${LOCAL_DIR}
exit
fi

本地备份存放至本分服务器并删除30日前的备份文件

3、整个脚本,由于本分脚本中含有数据库密码所有在最好做判断只有root用户才能执行脚本。

 #!/bin/bash
##########################################
# this script is created by xuxuedong. #
# e_mail:***@qq.com #
# qqinfo:*** #
# This is backup the fiel for the server. #
# version:1.1 #
##########################################
. /etc/init.d/functions
#set env
export PATH=$PATH:/bin:/sbin:/usr/sbin
export LANG="zh_CN.GB18030" # Require root to run this script. 判断是否是root用户执行。
if [[ "$(whoami)" != "root" ]]; then
echo "Please run this script as root." >&
exit
fi # Source function library.
#. /etc/init.d/functions
WEEK=$(date +%w)
BACKUP_ROOT=/backup
BACKUP_DIR=/backup/backup_full_`date +%F`
if [ -e $BACKUP_ROOT ]
then
cd $BACKUP_ROOT
if [ $WEEK -eq ]
then
rm -rf $BACKUP_ROOT/*
fi
if [ $? -eq 0 ]
then
action "old-backup is remove." /bin/true
fi
else
echo "Time is not, cannot be deleted." /bin/false fi
####mkdir backup-dir
if [ -e $BACKUP_DIR ]
then
action "$BACKUP_DIR had been created." /bin/true
else
mkdir -p /backup/backup_full_`date +%F`
action "$BACKUP_DIR is creating." /bin/true
fi
###tar backup /ucap/UServer_V5.5.1_5002
CMSP=/ucap
cd $CMSP
FILE_UCM=UServer_V5.5.1_5002
tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 if [ $? = 0 ]
then
action "$FILE_UCM is backup." /bin/true
else
action "$FILE_UCM is no been backuped." /bin/true
fi
###tar backup /ucap/mongodb
CMSP=/ucap
cd $CMSP
FILE_UCM=mongodb
tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 if [ $? = 0 ]
then
action "$FILE_UCM is backup." /bin/true
else
action "$FILE_UCM is no been backuped." /bin/true
fi
#parameter defined
BAKDATE=`date +%F`
MYSQL_PATH=/usr/local/mysql/bin
MYUSER=root
MYPASS="Ucap7890&*()"
#DBNAME=`mysql -uroot -p'Ucap7890&*()' -e "show databases;"|grep cpmdb`
DATA_FILE=${BACKUP_DIR}/mysql_backup_${BAKDATE}.sql.gz
[ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR}
#command defined
MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u$MYUSER -p$MYPASS -S /tmp/mysql.sock -F -B cpmdb --single-transaction -e"
#backup command
${MYSQL_DUMP} | gzip > $DATA_FILE #####copye backup_tar to backup_server
BACKUP_SERVER=23.202.1.23:/backup/Search
LOCAL_DIR=/backup1
RPC_PID=`/etc/init.d/rpcbind status|wc -l`
MOUNT_STATUS=`df -h | grep backup1 | wc -l`
BACKUP_FILEDIR=backup_full_`date +%F`
SERVER_IP=`ifconfig| grep Bcast|awk '{print $2}'`
if [ ! -e ${LOCAL_DIR} ]
then
mkdir ${LOCAL_DIR}
fi if [ ${RPC_PID} -eq 0 ]
then
/etc/init.d/rpcbind start
fi
if [ $MOUNT_STATUS -eq 0 ]
then
mount -t nfs ${BACKUP_SERVER} ${LOCAL_DIR}
cd ${LOCAL_DIR}
find ${LOCAL_DIR} -mtime +30 -exec rm{} \;
if [ `find ${LOCAL_DIR} -mtime +30 -exec ls{} \;|wc -l` -eq 0 ]
then
cd $BACKUP_ROOT
cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/
fi
if [ $? -eq 0 ]
then
umount -l ${LOCAL_DIR}
fi
else
cd ${LOCAL_DIR}
find ${LOCAL_DIR} -mtime +30 -exec rm{} \;
cd $BACKUP_ROOT
cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/
umount -l ${LOCAL_DIR}
exit 1
fi

所有脚本

shell脚本实现自动化备份的更多相关文章

  1. Shell脚本,自动化发布tomcat项目【转载】

    Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...

  2. Shell脚本,自动化发布tomcat项目【转】

    Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...

  3. 使用shell脚本定时执行备份mysql数据库

    使用shell脚本定时执行备份mysql数据库 #!/bin/bash ############### common file ################ #本机备份文件存放目录 MYSQLBA ...

  4. Centos上通过shell脚本实现数据库备份和还原

    最近有个这样的需求,通过shell脚本实现数据库备份还原,最后通过网上查询自己测试实现,将脚本分享给大家 1.数据库备份脚本 #!/bin/bash ds=`` list=`date +%Y`/`da ...

  5. 用shell脚本实现定时备份数据库

    1.备份数据库的方法 可以使用命令查看 ls  /usr/local/mysql/bin 这个mysqldump就是系统内置的用来备份数据库的工具. 2.实现方法 ①先随便进入一个位置创建一个目录 ② ...

  6. shell脚本每天自动备份mysql数据库

    一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...

  7. 使用shell脚本来自动化处理我们的工作,解放双手

    Shell脚本介绍 1.Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. 2.Shell可以直接使用在wi ...

  8. shell脚本实现定时备份某文件

    1:目标       实现在图像化界面输入需要备份的源文件路径.目标路径,定时的时间.然后通过输入的信息,把需要备份的源文件打包放到指定的目标路径下以执行定时任务的时间为子目录       把/she ...

  9. 使用shell脚本完成自动化部署及秒级回滚

    一.部署机代码目录结构 使用www用户进行代码部署,所有部署机上需要创建www用户,并赋予根目录权限,同时配置公私钥认证建立信任关系. [www@ansible-node1 deploy]$ tree ...

随机推荐

  1. hdu 1753 大明A+B(大数)

    题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...

  2. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  3. ORA-32001:write to SPFILE requested but no SPFILE is in use

    oracle报错: ORA-32001:write to SPFILE requested but no SPFILE is in use 解决方法: 1.查看是否有spfile sql> sh ...

  4. swoole异步redis安装前置条件和流程

    ---恢复内容开始--- 1.redis服务 确认redis在服务器中已经安装了 2.hiredis库 第二步安装hiredis 下载位置 2.1获取 安装包https://github.com/re ...

  5. C语言中数组做函数参数的问题

    数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...

  6. 12306.cn网站自动登录器源代码

    去年过年放假的时候写了一个12306.cn网站的自动登录器,刚好那时候放假了,所以没把源代码放出来,现在将代码发出来,由于编写得比较仓促(从放假的下午19:00左右到晚上到00:00左右),很多细节问 ...

  7. docker集群管理

    docker集群管理 ps:docker machine     docker swarm       docker compose  在Docker Machine发布之前,你可能会遇到以下问题: ...

  8. linux学习 三 redhat

    1: 查看redhat版本号. 2:   防火墙中加入8080 查看防火墙状态,root用户登录,执行命令systemctl status firewalld 开启防火墙:systemctl star ...

  9. CodeForces 1110G. Tree-Tac-Toe

    题目简述:给定$n$个节点的树,其中一些节点被染成了白色(其余节点未染色).黑白双方博弈,白先动.轮到黑(白)方时,选择树上的一个未染色的节点并将其染成黑(白)色.率先达成三连色(即存在三个节点$a, ...

  10. Flutter实战视频-移动电商-08.Dio基础_伪造请求头获取数据

    08.Dio基础_伪造请求头获取数据 上节课代码清楚 重新编写HomePage这个动态组件 开始写请求的方法 请求数据 .但是由于我们没加请求的头 所以没有返回数据 451就是表示请求错错误 创建请求 ...