数据库7x24小时不间断运行,并不能保证100%的可靠,如果数据库出现无法恢复的故障,保证业务正常运行就要提前做好措施应对,做好冷备份和热备份非常重要。定期备份,保存文档是冷备份。实时同步,主从复制是热备份。某些大型网站为例应对地震、海啸等灾难,还会在全球范围内部署灾备数据中心。
MySQL备份常用是shell脚本+crontab计划任务来实现
创建两个目录和一个文件:
/data/backup #存放备份文件的目录
/data/backup/daily #存放增量备份文件的目录
/data/backup/bak.log #备份记录的日志
1.全量备份shell脚本
#!/bin/bash
BakDir=/data/backup #备份文件保存目录
LogFile=/data/backup/bak.log #备份日志文件
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tar
/usr/local/mysql/bin/mysqldump -uroot -ppassword**** --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $DumpFile
/bin/tar czvf $GZDumpFile $DumpFile
/bin/rm $DumpFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile success >> $LogFile #记录备份日志
2.增量备份
#!/bin/sh
BakDir=/data/backup/daily #增量文件存放目录
BinDir=/data/mysql #mysql数据存放目录
LogFile=/data/backup/bak.log #备份日志存放目录
BinFile=/data/mysql/iZ28o8261rdZ-bin.index #mysql数据目录下的index文件
/usr/local/mysql/bin/mysqladmin -uroot -pqyt150***** flush-logs
#这个是用于产生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的。
for file in `cat $BinFile`
do
base=`basename $file`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $Counter ]
then
echo $base skip! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BakDir
echo $base copying >> $LogFile
fi
fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LogFile
注意:
1.-p后面的密码部分如果有特殊字符,要加引号或者\