#!/bin/bash DB=abc MUSER=root MPASS=Dfsc123321 MHOST=localhost MSQL=/application/mysql/bin/mysql BAKFILE=/application/mysql/bin/mysqldump MCMD="create database $DB charset=utf8;" BAKDIR=/bak_mysql Date=$(date +%F) SQLFILE=${BAKDIR}/$DB\_$Date.sql GTIDCMD="show variables like '%gtid_mode%';" GTIDPAR="--flush-logs --set-gtid-purged=OFF" function chkdata() { #检验Rsync传过来的备份数据,是否完整。 clear date echo -e "\033[31m 开始检验数据.............\033[0m" sleep 2 cd $BAKDIR md5sum -c md5_$DB\_$Date 2>/tmp/md5_mysql.log if [ $? -ne 0 ];then echo "数据不完整,请重新同步数据。" exit else echo "数据完整,可以还原。" fi } function bakdata() { echo -e "\033[31m 开始备份旧数据库...........\033[0m" sleep 2 #查看是否存在要还原的数据库,并先备份。 $MSQL -u$MUSER -p$MPASS -h$MHOST -e 'show databases;' 2>/tmp/sec.log|grep "$DB" >/dev/null if [ $? -ne 0 ];then echo -e "\033[31m 数据库中没有旧数据库。\033[0m" DATANUM=0 #用于恢复的时判断有无旧数据 0,不存在,1存在。 return else DATANUM=1 fi #检测Mysql 有没有开启GTID $MSQL -u$MUSER -p$MPASS -h$MHOST -e "$GTIDCMD" 2>/tmp/se.log|grep "ON" >/dev/null #判断GTID是否开启,分别执行不同的备份命令。 if [ $? -eq 0 ];then $BAKFILE -u$MUSER -p$MPASS -h$MHOST $GTIDPAR $DB >/tmp/$DB\_old$Date.sql 2>/tmp/bak.log if [ $? -ne 0 ];then echo "备份有问题,日志文件 /tmp/bak.log 。" exit else echo -e "\033[31m 旧数据备份完成。\033[0m" fi else $BAKFILE -u$MUSER -p$MPASS -h$MHOST $DB >/tmp/$DB\_old$Date.sql 2>/tmp/bak.log if [ $? -ne 0 ];then echo "备份有问题,日志文件 /tmp/bak.log 。" exit else echo -e "\033[31m 旧数据备份完成。\033[0m" fi fi } function resdata() { echo -e "\033[31m 开始还原新数据...........\033[0m" sleep 2 #判断需要恢复的数据库是否存在。 if [ $DATANUM -eq 1 ];then #如果旧数据库存在,直接还原。 $MSQL -u$MUSER -p$MPASS -h$MHOST $DB <$SQLFILE 2>/tmp/mrestore.log if [ $? -ne 0 ];then echo "数据还原有问题,日志文件 /tmp/mrestore.log 。" exit else echo -e "\033[31m 新数据还原完成。\033[0m" fi fi if [ $DATANUM -eq 0 ];then #不存在旧数据库,创建后再还原。 $MSQL -u$MUSER -p$MPASS -h$MHOST -e "${MCMD}" 2>/tmp/mcreate.log if [ $? -ne 0 ];then echo "创建数据库有问题,日志文件 /tmp/mcreate.log 。" exit else $MSQL -u$MUSER -p$MPASS -h$MHOST $DB <$SQLFILE 2>/tmp/mrestore.log echo -e "\033[31m 新数据还原完成。\033[0m" fi fi date } chkdata bakdata resdata