IT技术互动交流平台

shell进行完整和增量备份mysql数据库

作者:平凡的日子  发布日期:2013-03-26 21:05:10
文档介绍

本文档采用mysqldump 对数据库进行备份,mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法,mysqldump 比直接拷贝要慢些。

本文描述Mysql数据库的自动备份,包括完全备份和增量备份。其中,完全备份每周执行一次,增量备份每天都会执行。备份成功后会自动上传到FTP服务器。mysql需要开启二进制日志。

 

备份策略布置

把脚本放到/usr/bin 目录下面

1)、启用二进制日志

采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。

启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 /etc/my.cnf,加入以下几行:

[mysqld]

log-bin

然后启动 mysqld 就可以了。运行过程中会产生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于binlog 的更详细信息请查看手册。

2)、设置crontab任务,每天执行备份脚本

shell> vi /etc/crontab

添加以下:

0 00 * * * root /usr/bin/backap_mysql.sh

脚本如下:


#!/bin/bash  
#set -x  
#此脚本的主要用途是备份mysql服务器上的数据库。并且自动通过FTP上传到服务器。备份完后都会发送一封邮件。  
echo -e "此脚本的主要用途是备份mysql服务器上的数据库.并且自动通过FTP上传到服务器。"  
Host=www.chlinux.net  
pass=chenqibin  
name=root  
DATE=`date +"%Y%m%d"`  
WAN_DIR="/wan_dir"  
ZENG_BACK="/backup"  
DATA_DIR="/usr/local/mysql/data"  
MYSQL_BIN="/usr/local/mysql/bin"  
error_log="$WAN_DIR/backup_error_$DATE.log"  
backup_log="$ZENG_DIR/backup_$DATE.log"  
gzdumpfile="$DATE.sql.tar.gz"  
db="/var/log/backup_$DATE.txt"  
  
cd $DATA_DIR  
  
ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}' >>$db  
  
function wan() {  
#检测完全备份目录是否存在,如果不存在就创建。  
if [ -d $WAN_DIR ]  
then  
    echo "完全备份目录存在" >>$backup_log  
else  
    echo "完全备份目录不存在,开始创建......."  
    /bin/mkdir $WAN_DIR  
fi  
  
eMailFile="$WAN_DIR/mail.log"  
email=kelly@r2games.net  
    echo "       " > $eMailFile  
    echo "-----------------------" >> $eMailFile  
    echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile  
    echo "-------------------------" >> $eMailFile  
cd $WAN_DIR  
    for dbname in $(cat $db)  
    do  
       mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql  
        if [ $? = 0 ]  
        then  
             find $ZENG_BACK -name "*.log" -mtime +32 -exec rm {} \; >/dev/null 2>&1  
             cd $WAN_DIR   
             tar -zcvf $dbname.$gzdumpfile $dbname.sql  
             echo "Backup MySQL succeed" >>$eMailFile  
             mail -s "MySQL Backup" $email < $eMailFile  
        else  
             echo "Backup MySQL fail" >>$eMailFile  
             mail -s "MySQL Backup fail" $email < $eMailFile  
        fi  
    done  
#完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件  www.it165.net
find $ZENG_BACK -name "*.sql.tar.gz"  --mtime +7 -exec rm -rf {} \; >>$backup_log   
  
#将备份好的上传到FTP服务器  
cd $WAN_DIR  
for db_back in $(cat $db)  
do  
    ftp -nv $Host <<EOF  
    user wolf "wolf#123"  
    put $db_back.$gzdumpfile  
    quit  
EOF  
done  
}  
function zeng() {  
/bin/mkdir /zeng_dir  
  
eMailFile="$ZENG_DIR/mail.log"  
email=kelly@r2games.net  
  
echo "       " > $eMailFile  
echo "-----------------------" >> $eMailFile  
echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile  
echo "-------------------------" >> $eMailFile  
  
TIME=$(date "-d 10 day ago" +%Y-%m-%d %H:%M:%S)   
StartTime=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")  
Start="--start-datetime"  
#删除10天前的二进制文件  
mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile  
filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/" '{print $2}'`  
cd /zeng_dir  
  
for i in $filename  
do  
     echo "$StartTime start backup binlog" >> $eMailFile  
  
     for db_name in $(cat $db)  
     do  
           mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql  
        if [ $? = 0 ]  
        then  
             cd /zeng_dir  
             tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql  
             echo "Backup MySQL succeed" >>$eMailFile  
             mail -s "MySQL Backup" $email < $eMailFile  
        else  
             echo "Backup MySQL fail" >>$eMailFile  
             mail -s "MySQL Backup fail" $email < $eMailFile  
        fi  
     done  
done  
find $ZENG_BACK -name "*.log" -name +32 -exec rm {} \; >/dev/null 2>&1  
cd /zeng_dir  
#删除上次备份的完整备份的文件  
find $WAN_DIR -name "*.tar.gz"  --mtime +7 -exec rm -rf {} \;  
  
#将备份好的上传到FTP服务器  
for db_back in $(cat $db)  
do  
    ftp -nv $Host <<EOF  
    user wolf "wolf#123"  
    put $db_back.$gzdumpfile  
    quit  
EOF  
done  
}  
backfile=`ls -l /wan_dir | wc -l`  
if [ $backfile != 0 ]  
then  
    echo "完整备份已经存在,现在进行增量备份"  
    sleep 10  
    zeng  
else  
    echo "还没进行完整备份,现在进行完整备份"  
    sleep 30  
    wan  
fi  

主要变量说明:
Host     #FTP的IP
pass     #FTP的密码
name     #FTP和mysql的用户名
DATE     #时间
WAN_DIR  #完整备份的目录
ZENG_BACK  #增量备份的目录
DATA_DIR   #mysql数据目录
error_log  #错误日志
gzdumpfile #压缩后的后缀名
db          #mysql数据库名

Tag标签: 增量备份   mysql数据库  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规