mysql 全备+binlog 自动恢复shell脚本
2012-10-26 10:48
441 查看
mysql 全备+binlog自动恢复shell脚本
注意:1、数据库全备的命名规则 bak_dbname_xxx_sql
2、BAKUPDIR存放所有的数据全备的文件的目录
3、BINLOGBAKDIR用与存放所有用到的binlog的目录
该脚本主要用于数据库故障时,进行及时的整库加日志的增量恢复,以求数据损失降低的最小值。
该脚本的主要思想:
1.
首先进行全库导入;
2.
通过查找二进制日志的pos来进行日志的恢复;
1. #!/bin/bash
2. BASEDIR=/data1/xxx/xxx/backuptest
3. BAKUPDIR=$BASEDIR/tmpbak
4. #BAKUPDIR=$BASEDIR/2012-03-27
5. BINLOGBAKDIR=$BASEDIR/binlog
6. LOGDIR=$BASEDIR/log
7. RECOVERY_LOG=$LOGDIR/recovery.log
8. MYSQL=/usr/local/mysql/bin/mysql
9. MYSQLBINLOG=/usr/local/mysql/bin/mysqlbinlog
10.USER=root
11.PASS=123
12.MYSQLIP=localhost
13.
14.mkdir -p $LOGDIR
15.BAKUPSQL=`find$BAKUPDIR
-type f -name"*sql"|xargs-i basename{}`
16.
17.for i
in $BAKUPSQL
18.do
19.cd $BAKUPDIR
20.
21.#########CHECK BINLOG POSITION############
22.BINLOG=`head
-n 50 $i |grep
"CHANGE MASTER TO MASTER_LOG_FILE"|awk
-F "'" '{print$2}'`
23.BINLOGPOS=`head
-n 50 $i |grep
"CHANGE MASTER TO MASTER_LOG_FILE"|awk
-F "=" '{print$3}'|sed's/;//'`
24.DATABASE=`echo $i|awk-F"_"'{print$2}'`
25.# echo $i $DATABASE $BINLOG $BINLOGPOS
26.
27.####BEGINE FULLBAKUP RECOVERY#############
28.echo "#`date +'%Y-%m-%d%H:%M:%S'`: start recover $DATABASE ">>${RECOVERY_LOG}
29.if $MYSQL
-h$MYSQLIP -u$USER-p$PASS< $i>>${RECOVERY_LOG}2>&1;then
30.echo "recovery $DATABASEsucessfully">> ${RECOVERY_LOG}
31.else
32.echo "recovery $DATABASEfail">> ${RECOVERY_LOG}
33.exit;
34.fi
35.echo "#`date +'%Y-%m-%d%H:%M:%S'`: end recover $DATABASE">>${RECOVERY_LOG}
36.
37.
38.#####BEGINE BINLOGBAKUP RECOVERY##########
39.
40.cd $BINLOGBAKDIR
41.find .
-type f -name
"*bin*" |xargs-i basename{}>/tmp/binlog.tmp
42.sort -n
/tmp/binlog.tmp>$LOGDIR/binlog.tmp2
43.sed '/md5/d' $LOGDIR/binlog.tmp2> $LOGDIR/binlog.tmp3
44.sed -n
"/$BINLOG/,\$p" $LOGDIR/binlog.tmp3> $LOGDIR/binlog${DATABASE}.log
45.RECBINLOGS=`awk
'{printf "%s"," "$1}' $LOGDIR/binlog${DATABASE}.log `
46.#echo $DATABASE $BINLOGPOS $RECBINLOGS
47.
48.echo "#`date +'%Y-%m-%d%H:%M:%S'`: start recover $DATABASE binlog ">> ${RECOVERY_LOG}
49.echo " $MYSQLBINLOG--no-defaults --disable-log-bin --start-position=$BINLOGPOS $RECBINLOGS -d$DATABASE |$MYSQL -h$MYSQLIP -u$USER -p$PASS -f ">> ${RECOVERY_LOG}
50.if$MYSQLBINLOG
--no-defaults--disable-log-bin--start-position=$BINLOGPOS$RECBINLOGS-d
$DATABASE |$MYSQL-h$MYSQLIP-u$USER-p$PASS-f
>> ${RECOVERY_LOG} 2>&1;then
51.echo "recover $DATABASEbinlog sucessfully">> ${RECOVERY_LOG}
52.else
53.echo "recover $DATABASEbinlog fail">> ${RECOVERY_LOG}
54.exit;
55.fi
56.echo "#`date +'%Y-%m-%d%H:%M:%S'`:end recover $DATABASE binlog">>${RECOVERY_LOG}
57.
58.
59.done
附脚本源代码:
full_db_log_imp.sh
# !/bin/bash
BASEDIR=/data/bak/test
BAKUPDIR=$BASEDIR/20121024
BINLOGBAKDIR=$BASEDIR/bin-log-bk
LOGDIR=$BASEDIR/log
RECOVERY_LOG=$LOGDIR/recovery.log
MYSQL=/usr/local/mysql/bin/mysql
MYSQLBINLOG=/usr/local/mysql/bin/mysqlbinlog
USER=root
PASS=root@centos
MYSQLIP=localhost
cd $BAKUPDIR
find $BAKUPDIR -name '*.gz'
gunzip $BAKUPDIR *.gz
BAKUPSQL=`find $BAKUPDIR -type f -name"*.sql" |xargs -i basename {}`
for i in $BAKUPSQL
do
cd $BAKUPDIR
#########CHECK BINLOG POSITION############
BINLOG=`head -n 50 $i |grep "CHANGEMASTER TO MASTER_LOG_FILE"|awk -F "'" '{print $2}'`
BINLOGPOS=`head -n 50 $i |grep "CHANGEMASTER TO MASTER_LOG_FILE"|awk -F "=" '{print $3}'|sed 's/;//'`
DATABASE=`echo $i|awk -F"_"'{print $2}'`
echo $i $DATABASE $BINLOG $BINLOGPOS
####BEGINE FULLBAKUP RECOVERY#############
echo "#`date +'%Y-%m-%d %H:%M:%S'`:start recover $DATABASE " >> ${RECOVERY_LOG}
if $MYSQL -h$MYSQLIP -u$USER -p$PASS <$i >> ${RECOVERY_LOG} 2>&1;then
echo "recovery $DATABASE sucessfully">> ${RECOVERY_LOG}
else
echo "recovery $DATABASE fail">> ${RECOVERY_LOG}
exit;
fi
echo "#`date +'%Y-%m-%d %H:%M:%S'`:end recover $DATABASE" >> ${RECOVERY_LOG}
#####BEGINE BINLOGBAKUP RECOVERY##########
cd $BASEDIR
#find ./ -type f -name "*bin*"|xargs -i basename {} > /tmp/binlog.tmp
find ./ -type f -name"*mysql-bin*" >/tmp/binlog.tmp
sort -n /tmp/binlog.tmp >$LOGDIR/binlog.tmp2
sed '/md5/d' $LOGDIR/binlog.tmp2 >$LOGDIR/binlog.tmp3
sed -n "/$BINLOG/,\$p"$LOGDIR/binlog.tmp3 > $LOGDIR/binlog${DATABASE}.log
RECBINLOGS=`awk '{printf"%s"," "$1}' $LOGDIR/binlog${DATABASE}.log `
echo $DATABASE $BINLOGPOS $RECBINLOGS
#exit 0
echo "#`date +'%Y-%m-%d %H:%M:%S'`:start recover $DATABASE binlog " >> ${RECOVERY_LOG}
echo " $MYSQLBINLOG --no-defaults --disable-log-bin--start-position=$BINLOGPOS $RECBINLOGS -d $DATABASE |$MYSQL -h$MYSQLIP -u$USER-p$PASS -f " >> ${RECOVERY_LOG}
if $MYSQLBINLOG --no-defaults--disable-log-bin --start-position=$BINLOGPOS $RECBINLOGS $DATABASE |$MYSQL -h$MYSQLIP -u$USER -p$PASS-f >> ${RECOVERY_LOG} 2>&1;then
echo $BINLOGPOS $RECBINLOGS
echo "recover $DATABASE binlogsucessfully" >> ${RECOVERY_LOG}
else
echo "recover $DATABASE binlogfail" >> ${RECOVERY_LOG}
exit;
fi
echo "#`date +'%Y-%m-%d %H:%M:%S'`:endrecover $DATABASE binlog" >> ${RECOVERY_LOG}
done
脚本执行后,恢复到的数据为:
相关文章推荐
- mysql自动备份、恢复脚本(linux的shell、windows的批处理)
- shell自动连接mysql后进行查询和自动备份脚本
- shell脚本实现mysql自动还原(linux)
- linux上mysql远程备份和自动导入到指定数据库的shell脚本
- Shell脚本: Mysql自动创建库和用户_20160607_七侠镇莫尛貝
- shell脚本_自动安装mysql
- 【shell脚本】ftp自动上传mysql备份文件
- linux下mysql如何自动备份shell脚本
- Shell脚本实现远程MySQL自动查询
- mysql自动备份维护shell脚本 (copy)
- shell脚本:LAMP一键自动安装 (linux,apache,mysql,php)
- shell脚本-自动安装mysql源码包
- 【shell脚本】ftp自动上传mysql备份文件
- mysql最新通用二进制分发版本5.7.16自动安装shell脚本
- 利用Shell脚本实现远程MySQL自动查询
- windows下mysql自动备份恢复脚本文件
- MySQL 自动备份 Shell 脚本
- linux下mysql自动备份shell脚本
- MySQL XtraBackup自动恢复脚本
- mysql 备份与恢复mysqldump命令使用记录并做成脚本自动备份