数据库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后面的密码部分如果有特殊字符,要加引号或者\