Mysql脚本实现增量备份

因为线上数据库有点大,磁盘又没有做个RAID,而且服务器紧缺。本来想用xtrabackup去做增量备份的,但是各种错误,我已经对它失去信心了,遂,自己写一个脚本去实现。

脚本分两部分,一部分是Full backup,这没什么好介绍的,就是全备嘛。另外一部分是Incremental backup,增量备份方面是以天为最少单位去执行的,每一天增量的内容都独立一个sql文件,当然也可以修改一下,追加到同一个文件去,但是我觉得还是分开比较好一点。

脚本刚写出来,简单测试过没问题,有兴趣的同学可以帮忙测试一下,欢迎报告错误,报BUG邮箱:[email protected]

任务计划:

0 3 * * 5 /bin/bash /var/scripts/full-backup.sh &> /dev/null
0 3 * * 1-4,6,7 /bin/bash /var/scripts/inc-backup.sh &> /dev/null

增量脚本:

#!/bin/bash
#################################################################
#     Mysql Backup Shell Script Part 1 (Full backup)		#
#	Completed in sep 2014 22				#
#				Author: Colin Wong		#
#				Email: [email protected]		#
#################################################################
####### BASE_INFO #######
Date=`date +%Y%m%d`
BACK_DIR="/usr/backup/full-backup"
FILE_DIR="/usr/backup"
User=root
DBpw=123456
MysqlBin=/usr/bin/mysql
MysqlDumpBin=/usr/bin/mysqldump

## Check whether Dir exists
[[ -d $BACK_DIR-$Date ]] || mkdir -p $BACK_DIR-$Date

## Start backup
$MysqlDumpBin -u$User -p"$DBpw" --opt --triggers --routines --events --ignore-table=mysql.events --flush-logs --hex-blob --master-data=1 --all-databases > $BACK_DIR-$Date/fullbackup.sql
 
## Get postion
sed -n ‘22p‘ $BACK_DIR-$Date/fullbackup.sql | awk -F"‘|,|=|;" ‘{print $3,$6}‘ > $FILE_DIR/FullBackPostion
 
## Check backup file
if [ ! -s $BACK_DIR-$Date/fullbackup.sql ]; then
        echo "mysqldump backup file faild , please check" | tee -a /var/scripts/full-backup.log
        exit 1
fi

增量备份:

#!/bin/bash
#################################################################
#     Mysql Backup Shell Script	Part 2 (Incremental backup)	#
#	Completed in sep 2014 22				#
#				Author: Colin Wong		#
#				Email: [email protected]		#
#################################################################
########### Increment Backup ##############
Date=`date +%Y%m%d`
OldDate=`date --date=‘1 days ago‘ +%Y%m%d`
MysqlBaseDir="/var/lib/mysql/"
BackupDir="/usr/backup"
StartBinLog=`awk ‘{print $1}‘ $BackupDir/FullBackPostion`
StartPostion=`awk ‘{print $2}‘ $BackupDir/FullBackPostion`
MysqlBin=/usr/bin/mysql
MysqlBinLog=/usr/bin/mysqlbinlog
User=root
DBpw=tianqu

## Starting...
if [ -s $BackupDir/Postion-$OldDate ];then
	# Get Master Info
	$MysqlBin -u$User -p"$DBpw" -e "show master status\G"|awk ‘{print $2}‘ > $BackupDir/Postion-$Date

	# Get the first backup binlog and postion
	LastStartBinLog=`sed -n ‘2p‘ $BackupDir/Postion-$OldDate`
	LastStartPos=`sed -n ‘3p‘ $BackupDir/Postion-$OldDate`

	# Get after the first backup binlog and postion
	AfterStartBinLog=`sed -n ‘2p‘ $BackupDir/Postion-$Date`
	AfterStartPos=`sed -n ‘3p‘ $BackupDir/Postion-$Date`

	# Check  whether the binlog switch
	if [ "$LastStartBinLog" = "$AfterStartBinLog" ];then
		$MysqlBinLog --start-position=$LastStartPos --stop-position=$AfterStartPos $MysqlBaseDir/$LastStartBinLog >> $BackupDir/inc_backup_$Date.sql
	else
		StartLine=`awk "/$LastStartBinLog/{print NR}" "$MysqlBaseDir"mysql-bin.index`
        	StopLine=`wc -l $MysqlBaseDir/mysql-bin.index |awk ‘{print $1}‘`
        
		for i in `seq $StartLine $StopLine`
        	do

		# Get binlog filename from line i
        	BinLogFile=`sed -n "$i"p "$MysqlBaseDir"mysql-bin.index |sed ‘s/.\///g‘`

                case "$BinLogFile" in
                "$StartBinLog")
                $MysqlBinLog --start-position=$StartPostion $MysqlBaseDir$BinLogFile >> $BackupDir/inc_backup_$Date.sql
                ;;
                "$StopBinLog")
                $MysqlBinLog --stop-position=$StopPostion $MysqlBaseDir$BinLogFile >> $BackupDir/inc_backup_$Date.sql
                ;;
                *)
		# Normally, program will not perform here
                	echo -e "$Date\n$StartBinLog to $StopBinLog have other values" >> /var/log/MyBackup.log
                esac
        	done
	fi

	else
	## Get New Postion
	$MysqlBin -u$User -p"$DBpw" -e "show master status\G"|awk ‘{print $2}‘ > $BackupDir/Postion-$Date

	## Get Stop Postion And binlog
	StopBinLog=`sed -n ‘2p‘ $BackupDir/Postion-$Date`
	StopPostion=`sed -n ‘3p‘ $BackupDir/Postion-$Date`

	##
	if [ "$StartBinLog" = "$StopBinLog" ]; then
		$MysqlBinLog --start-position=$StartPostion --stop-position=$StopPostion $MysqlBaseDir/$StartBinLog >> $BackupDir/inc_backup_$Date.sql
	else
		StartLine=`awk "/$StartBinLog/{print NR}" "$MysqlBaseDir"mysql-bin.index`
		StopLine=`wc -l $MysqlBaseDir/mysql-bin.index |awk ‘{print $1}‘`

		for i in `seq $StartLine $StopLine`
		do
		BinLogFile=`sed -n "$i"p  "$MysqlBaseDir"mysql-bin.index |sed ‘s/.\///g‘`

			case "$BinLogFile" in
			"$StartBinLog")
			$MysqlBinLog --start-position=$StartPostion $MysqlBaseDir$BinLogFile >> $BackupDir/inc_backup_$Date.sql
			;;
			"$StopBinLog")
			$MysqlBinLog --stop-position=$StopPostion $MysqlBaseDir$BinLogFile >> $BackupDir/inc_backup_$Date.sql
			;;
			*)
			echo -e "$Date\n$StartBinLog to $StopBinLog have other values" >> /var/scripts/MyBackup.log
			esac
		done
	fi
fi

############################  packing  ################################

cd $BackupDir
if [ -s inc_backup_$Date.sql ];then
	gzip inc_backup_$Date.sql
else 
	echo "$Date backup fail" >> /var/scripts/inc-backup.log
fi
时间: 2024-12-21 09:49:20

Mysql脚本实现增量备份的相关文章

mysql 利用binlog增量备份,还原实例

mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin

innobackupex自动备份脚本(增量备份,自动压缩)

#!/bin/bash #日期转为天数 function date2days { echo "$*" | awk '{ z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3; j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633; print j }' } #说明:脚本执行策略为每天执行一次,执行前需要先建立config文件,并在config文件 #中添加 #backup_

MySQL 利用binlog增量备份+还原实例

一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin=mysql-bin.log默认在datadir目录下面 [[email protected] mysql]

mysql全备、增量备份与还原

参考文章 http://blog.csdn.net/jesseyoung/article/details/37106035 http://www.cnblogs.com/kevingrace/p/6114979.html

Xtrabackup全量备份/增量备份脚本

一.全量备份脚本 1.全量备份脚本 #!/bin/bash #Description:xtrabackup complete #Author:created by michael #2017-08-07 v0.1 # USER=root PASSWD=123456 BACKUP_DIR=/backup/mysql/complete DATE=$(date +"%F_%T") [[ -d $BACKUP_DIR ]] || mkdir $DATE_DIR innobackupex --u

Linux 平台下 RMAN 全备 和 增量备份 shell 脚本

转:http://blog.csdn.net/tianlesoftware/article/details/5740630 全备脚本 以 nocatalog 模式为例: Shell 脚本: ######################################################################## ##   hot_database_backup.sh      ## ##   created by Tianlesoftware   ## ##        

MySQL 利用xtrabackup进行增量备份详细过程汇总

Xtrabackup下载.安装以及全量备份请参考:http://blog.itpub.net/26230597/viewspace-1465772/ 1,创建mysql备份用户 mysql -uroot --password="" -e"CREATE USER 'backup'@'192.168.%' IDENTIFIED BY '123456'"; mysql -uroot --password="" -e"GRANT RELOAD,

svn dump增量备份脚本

svn 增量备份脚本, 环境:系统,centos6.5,svn version 1.6.11,httpd Apache/2.2.15 (Unix) APR 1.3.9, APR-Util 1.3.9,全部为yum编译 一些常用命令 svn ls -v /opt/svn/snn                  查看svn目录文件列表 svn --version                      查看svn版本 svnadmin create /opt/svn/snn          

Percona Xtrabackup实现mysql全量备份和增量备份

###########################################################################        安装mysql或者mariaDB本地也要装mysql或者mariaDB相关的包          ##########################################################################略 #########################################