• 完整和增量备份MySQL脚本


    本文档采用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任务,每天执行备份脚本
    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
    #完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件
    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数据库名

  • 相关阅读:
    @codeforces
    @总结
    @总结
    @codeforces
    @topcoder
    @codeforces
    @codeforces
    @codeforces
    @codeforces
    @codeforces
  • 原文地址:https://www.cnblogs.com/chenshoubiao/p/5092679.html
Copyright © 2020-2023  润新知