Mysql自动备份数据库shell脚本

mysqldump方法:

#!/bin/bash
id="root" 						#用户名
pwd="123456" 					#密码
dbname="zabbix aaa" 			#数据库名字的列表,多个数据库用空格分开。
backuppath="/backup/mysqlbackup" 	#保存备份的位置
day=15  						#保留最近几天的备份
[ ! -d $backuppath ] && mkdir -p $backuppath  			#判断备份目录是否存在,不存时新建目录。
cd $backuppath											#转到备份目录,这句话可以省略。可以直接将路径到命令的也行。

backupname=mysql_$(date +%Y-%m-%d)  				#生成备份文件的名字的前缀,不带后缀。
for db in $dbname;  								#dbname是一个数据名字的集合。遍历所有的数据。
do
  mysqldump -u$id -p$pwd -S /var/lib/mysql/mysql.sock $db >$backupname_$db.sql  #备份单个数据为.sql文件。放到当前位置
  if [ "$?" == "0" ]  															#$?得到上一个shell命令的执行的返回值。0表示执行成功。其他错误将结果写入到日志。
  then
      echo $(date +%Y-%m-%d)" $db  mysqldump sucess">>mysql.log 
  else
      echo $(date +%Y-%m-%d)"  $db mysql dump failed">>mysql.log
      exit 0
  fi
done
tar -czf $backupname.tar.gz *.sql 												#压缩所有sql文件
if [ "$?" == "0" ]
then
  echo $(date +%Y-%m-%d)" tar sucess">>mysql.log
else
  echo $(date +%Y-%m-%d)" tar failed">>mysql.log
  exit 0
fi
rm -f *.sql  												#删除所有的sql文件
delname=mysql_$(date -d "$day day ago" +%Y-%m-%d).tar.gz    #得到要删除的太旧的备份的名字。
rm -f $delname  											#删除文件。

xtrabackup方法:

#!/bin/bash

# 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份
# 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份
# 来源参考:http://blog.csdn.net/yangzhawen/article/details/44857097/

# 每小时执行一次
# echo "0 * * * * root /data/conf/shell/auto_bak_mysql_xtrabackup2.sh" >> /etc/crontab
# service crond restart
# 备份存放的目录/backup  生成/backup/full全量备份、/backup/incre增量备份。

##########################
#	恢复的方法			 #
##########################
#cp -a /data/mysql/ /data/mysql_bak    
#rm -rf /data/mysql/*
#innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --user=root /全量目录/
#innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --user=root /全量目录/ --incremental-dir=/增量一目录/
#innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --user=root /全量目录/ --incremental-dir=/增量二目录/
#有几个增量就操作几个增量
#innobackupex --apply-log /backup/全量目录/
#innobackupex --copy-back /backup/全量目录/
#chown -R mysql.mysql /data/mysql/
#/etc/init.d/mysql start


INNOBACKUPEX_PATH=innobackupex  #INNOBACKUPEX的命令
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX_PATH  #INNOBACKUPEX的命令路径

#mysql目标服务器以及用户名和密码
MYSQL_CMD="--host=192.168.1.2 --user=root --password=123456 --port=61920"  
MYSQL_UP=" --user=root --password='123456' --port=61920 "  #mysqladmin的用户名和密码
TMPLOG="/tmp/innobackupex.$$.log"
MY_CNF=/etc/my.cnf 											#mysql的配置文件
MYSQL=/usr/bin/mysql 
MYSQL_ADMIN=/usr/bin/mysqladmin
BACKUP_DIR=/backup 											# 备份的主目录
FULLBACKUP_DIR=$BACKUP_DIR/full 							# 全库备份的目录
INCRBACKUP_DIR=$BACKUP_DIR/incre 							# 增量备份的目录
FULLBACKUP_INTERVAL=86400 									# 全库备份的间隔周期,时间:秒
KEEP_FULLBACKUP=1 											# 至少保留几个全库备份
logfiledate=backup.`date +%Y%m%d%H%M`.txt					
#开始时间
STARTED_TIME=`date +%s`

#############################################################################
# 显示错误并退出
#############################################################################
error()
{
    echo "$1" 1>&2
    exit 1
}
# 检查执行环境
if [ ! -x $INNOBACKUPEXFULL ]; then
  error "$INNOBACKUPEXFULL未安装或未链接到/usr/bin."
fi

if [ ! -d $BACKUP_DIR ]; then
  error "备份目标文件夹:$BACKUP_DIR不存在."
fi

mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:61920/) {print "Yes";exit 0}}'`
if [ "$mysql_status" != "Yes" ];then
    error "MySQL 没有启动运行."
fi

if ! `echo 'exit' | $MYSQL -s $MYSQL_CMD` ; then
 error "提供的数据库用户名或密码不正确!"
fi

# 备份的头部信息
echo "----------------------------"
echo
echo "$0: MySQL备份脚本"
echo "开始于: `date +%F' '%T' '%w`"
echo

#新建全备和差异备份的目录
mkdir -p $FULLBACKUP_DIR
mkdir -p $INCRBACKUP_DIR

#查找最新的完全备份
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

# 查找最近修改的最新备份时间
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`

#如果全备有效进行增量备份否则执行完全备份
if [ "$LATEST_FULL_BACKUP" -a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
	# 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录
	echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"
	echo "					   "
	NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
	mkdir -p $NEW_INCRDIR

	# 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础
	LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`
		if [ ! $LATEST_INCR_BACKUP ] ; then
			INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
			echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"
			echo "					   "
		else
			INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}
			echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"
			echo "					   "
		fi

	echo "使用$INCRBASEDIR作为基础本次增量备份的基础目录."
	$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1

	#保留一份备份的详细日志

	cat $TMPLOG>/backup/$logfiledate

	if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
	 echo "$INNOBACKUPEX命令执行失败:"; echo
	 echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
	 cat $TMPLOG
	 rm -f $TMPLOG
	 exit 1
	fi

	THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
	rm -f $TMPLOG


	echo -n "数据库成功备份到:$THISBACKUP"
	echo

	# 提示应该保留的备份文件起点
	LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
	NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
	LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`
	RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}
	RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`

	echo
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份."
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo
else
	echo  "*********************************"
	echo -e "正在执行全新的完全备份...请稍等..."
	echo  "*********************************"
	$INNOBACKUPEXFULL --defaults-file=$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1 
	#保留一份备份的详细日志
	cat $TMPLOG>/backup/$logfiledate
	if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
	 echo "$INNOBACKUPEX命令执行失败:"; echo
	 echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
	 cat $TMPLOG
	 rm -f $TMPLOG
	 exit 1
	fi

	 
	THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
	rm -f $TMPLOG

	echo -n "数据库成功备份到:$THISBACKUP"
	echo

	# 提示应该保留的备份文件起点

	LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

	RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}

	echo
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo -e "无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo

fi

#删除过期的全备
echo -e "find expire backup file...........waiting........."
echo -e "寻找过期的全备文件并删除">>/backup/$logfiledate
for efile in $(/usr/bin/find $FULLBACKUP_DIR/ -mtime +6)
do
	if [ -d ${efile} ]; then
	rm -rf "${efile}"
	echo -e "删除过期全备文件:${efile}" >>/backup/$logfiledate
	elif [ -f ${efile} ]; then
	rm -rf "${efile}"
	echo -e "删除过期全备文件:${efile}" >>/backup/$logfiledate
	fi;
	
done

if [ $? -eq "0" ];then
   echo
   echo -e "未找到可以删除的过期全备文件"
fi

echo
echo "完成于: `date +%F' '%T' '%w`"
exit 0

猜你喜欢

转载自my.oschina.net/zhouyuntai/blog/1784846