千家信息网

MySQL自动化(全量+增量)备份脚本

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、MySQL的日常备份方案:全备+增量备份:1、周日凌晨三点进行全备;2、周一到周日增量备份。不是往常的周日全备份,周一到周六增量备份,这样如果周日数据库在完全备份前出问题,恢复完成后,会少周日一天
千家信息网最后更新 2026年11月01日MySQL自动化(全量+增量)备份脚本

一、MySQL的日常备份方案:

全备+增量备份:

1、周日凌晨三点进行全备;

2、周一到周日增量备份。

不是往常的周日全备份,周一到周六增量备份,这样如果周日数据库在完全备份前出问题,恢复完成后,会少周日一天的数据量,所以七天增量备份,周日全备可以更好的保全数据。

这是备份周期演示表:

Sun 3:00------Mon 3:00-----------------Tue 3:00----------Wed 3:00----------Thu 3:00----------Fri 3:00----------Sat 3:00----------Sun 3:00(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full

二、备份脚本:

模块化定制,可以随意移动,调节备份策略!

变量栏的帐号密码,文件路径根据自己实际环境可以进行修改,自由度比较高,模块函数全变量,适用度较高,但是可能还有不完善的地方,欢迎提出,谢谢!

vim /root/mysql_bakup.sh#!/bin/bash#Date:2017/5/2#Author:wangpengtai#Blog:http://wangpengtai.blog.51cto.com#At Sunday, we will backup the completed databases and the incresed binary log during Saturday to Sunday.#In other weekdays, we only backup the increaing binary log at that day!#################################the globle variables for MySQL#################################DB_USER='root'DB_PASSWORD='123456'DB_PORT='3306'BACKUPDIR='/tmp/mysqlbakup'BACKUPDIR_OLDER='/tmp/mysqlbakup_older'DB_PID='/data/mysql/log/mysqld.pid'DB_SOCK='/data/mysql/log/mysql.sock'LOG_DIR='/data/mysql/log'BACKUP_LOG='/tmp/mysqlbakup/backup.log'DB_BIN='/usr/local/mysql/bin'#time variables for completed backupFULL_BAKDAY='Sunday'TODAY=`date +%A`DATE=`date +%Y%m%d`############################time variables for binlog#############################liftcycle for saving binlogDELETE_OLDLOG_TIME=$(date "-d 14 day ago" +%Y%m%d%H%M%S)#The start time point to backup binlog, the usage of mysqlbinlog is --start-datetime, --stop-datetime, time format is %Y%m%d%H%M%S, eg:20170502171054, time zones is  [start-datetime, stop-datetime)#The date to start backup binlog is yesterday at this very moment!START_BACKUPBINLOG_TIMEPOINT=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")#BINLOG_LIST=`cat /data/mysql/log/mysql-bin.index`#注意在my.cnf中配置binlog文件位置时需要使用绝对路径,一定想成好习惯,不要给别人挖坑!!#####################举例#########################[mysqld]#log_bin = /var/lib/mysql/mysql-bin#####################举例########################BINLOG_INDEX='/data/mysql/log/mysql-bin.index'###############################################Judge the mysql process is running or not.  ##mysql stop return 1, mysql running return 0.###############################################function DB_RUN(){    if test -a $DB_PID && test -a $DB_SOCK;then        return 0    else        return 1    fi}####################################################################################################Judge the bacup directory is exsit not.                                                          ##If the mysqlbakup directory was exsited, there willed return 0.                                  ## If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.####################################################################################################function BACKDIR_EXSIT(){    if test -d $BACKUPDIR;then#        echo "$BACKUPDIR was exist."        return 0    else        echo "$BACKUPDIR is not exist, now create it."        mkdir -pv $BACKUPDIR        return 1    fi}####################################################################################################Judge the binlog is configed or not.                                                          ##If the mysqlbakup directory was exsited, there willed return 0.                                  ## If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.####################################################################################################function BINLOG_EXSIT(){    if test -f $BINLOG_INDEX;then#        echo "$BACKUPDIR was exist."        return 0    fi}####################################################The full backup for all Databases                ##This function is use to backup the all databases.####################################################function FULL_BAKUP(){    echo "At `date +%D\ %T`: Starting full backup the MySQL DB ... "#    rm -fr $BACKUPDIR/db_fullbak_$DATE.sql  #for test !!    $DB_BIN/mysqldump --lock-all-tables --flush-logs --master-data=2 -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -A |gzip > $BACKUPDIR/db_fullbak_$DATE.sql.gz    FULL_HEALTH=`echo $?`    if [[ $FULL_HEALTH == 0 ]];then        echo "At `date +%D\ %T`: MySQL DB incresed backup successfully"    else        echo "MySQL DB full backup failed!"    fi}#python# >>> with open('/data/mysql/log/mysql-bin.index','r') as obj:# ...    for i in obj:# ...       print os.path.basename(i)# ...# mysql-bin.000006# mysql-bin.000007# mysql-bin.000008# mysql-bin.000009function INCREASE_BAKUP(){    echo "At `date +%D\ %T`: Starting increased backup the MySQL DB ... "    $DB_BIN/mysqladmin -u$DB_USER -p$DB_PASSWORD -P$DB_PORT flush-logs    $DB_BIN/mysql -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -e "purge master logs before ${DELETE_OLDLOG_TIME}"    for i in `cat $BINLOG_INDEX | awk -F'/' '{print $NF}'`    do        $DB_BIN/mysqlbinlog -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime="$START_BACKUPBINLOG_TIMEPOINT" $LOG_DIR/$i |gzip >> $BACKUPDIR/db_daily_$DATE.sql.gz    done    # $DB_BIN/mysqlbinlog -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime="$START_BACKUPBINLOG_TIME" $LOG_DIR/mysql-bin.[0-9]* |gzip >> $BACKUPDIR/db_daily_$DATE.sql.gz    INCREASE_HEALTH=`echo $?`    if [[ $INCREASE_HEALTH == 0 ]];then        echo "At `date +%D\ %T`: MySQL DB incresed backup successfully"    else        echo "MySQL DB incresed backup failed!"    fi}function OLDER_BACKDIR_EXSIT(){    if test -d $BACKUPDIR_OLDER;then#        echo "$BACKUPDIR_OLDER was exist."        return 0    else        echo "$BACKUPDIR_OLDER is not exist, now create it."        mkdir -pv $BACKUPDIR_OLDER#        return 1    fi}function BAKUP_CLEANER(){    #move the backuped file that created time out of 7 days to the BACKUPDIR_OLDER directory    returnkey=`find $BACKUPDIR -name "*.sql.gz" -mtime +7 -exec ls -lh {} \;`    returnkey_old=`find $BACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec ls -lh {} \;`    if [[ $returnkey != '' ]];then        echo "----------------------"        echo "Moving the older backuped file out of 7 days to $BACKUPDIR_OLDER."        echo "The moved file list is:"        find $BACKUPDIR -name "*.sql.gz" -mtime +7 -exec mv {} $BACKUPDIR_OLDER \;        echo "-----------------------"    elif [[ $returnkey_old != '' ]];then        #delete the backuped file that created time out of 14 days from BACKUPDIR_OLDER directory.        echo "Delete the older backuped file out of 14 days from $BACKUPDIR_OLDER."        echo "The deleted files list is:"        find $BACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec rm -fr {} \;    fi}#####################################--------------main----------------#####################################function MAIN(){    DB_RUN #Judge the process is run or not, if not run, the script will not bakup db    Run_process=`echo $?`    echo $?    if [[ $Run_process == 0 ]];then        BINLOG_EXSIT        binlog_index=`echo $?`        if [[ $binlog_index == 0 ]];then            echo "**********START**********"            echo $(date +"%y-%m-%d %H:%M:%S %A")            echo "~~~~~~~~~~~~~~~~~~~~~~~"            if [[ $TODAY == $FULL_BAKDAY ]];then                echo "Start completed bakup ..."                INCREASE_BAKUP                FULL_BAKUP    #full backup to all DB                BAKUP_CLEANER            else                echo "Start increaing bakup ..."                INCREASE_BAKUP            fi            echo "~~~~~~~~~~~~~~~~~~~~~~~"            echo $(date +"%y-%m-%d %H:%M:%S %A")            echo "**********END**********"        else            echo "**********START**********"            echo $(date +"%y-%m-%d %H:%M:%S %A")            echo "~~~~~~~~~~~~~~~~~~~~~~~"            echo "Sorry, MySQL binlog was not configed, please config the my.cnf firstly!"            echo "~~~~~~~~~~~~~~~~~~~~~~~"            echo $(date +"%y-%m-%d %H:%M:%S %A")            echo "**********END**********"        fi    else        echo "**********START**********"        echo $(date +"%y-%m-%d %H:%M:%S %A")        echo "~~~~~~~~~~~~~~~~~~~~~~~"        echo "Sorry, MySQL was not running, the db could not be backuped!"        echo "~~~~~~~~~~~~~~~~~~~~~~~"        echo $(date +"%y-%m-%d %H:%M:%S %A")        echo "**********END**********"    fi}#starting runingBACKDIR_EXSIT $BACKUP_LOGOLDER_BACKDIR_EXSIT $BACKUP_LOGMAIN >> $BACKUP_LOG


三、测试方法:

使用了一个测试脚本,修改日期,达到一个月的演示效果。

#!/bin/bashfor day in {1..30}do    date -s "2017-06-$day 12:00:00"    /bin/bash /root/bakup/mysql_backup.shdone

四、脚本使用方法:

crontab -e0 3 * * *  /bin/bash /root/bakup/mysql_bakup.sh > /dev/null 2>&1 空格#加个空格,不然有些机器不能执行脚本


备份 增量 脚本 数据 全备 变量 文件 方法 模块 空格 路径 测试 演示 自由 位置 使用方法 函数 周期 地方 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 深圳九邦互联网科技有限公司 中关村互联网科技集团 互联网科技公司的优势 互联网与新科技 互联网科技上市公司 广州凡科互联网科技 新华互联网科技校企合作 昭通云南众福互联网科技有限公司 武汉健翔互联网络科技有限公司 厦门千工互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 互联网在线教育科技创业 怎样加入科技互联网 每天都有哪些好的互联网科技 张召忠谈中国互联网科技 互联网风格科技公司名称 容联科技互联网电商 科技互联网专业工作会议发言稿 互联网科技创新创业项目 上海喔噻互联网科技有限公司 互联网系的金融科技公司 荆州市昕露互联网络科技有限公司 中和天地互联网科技有限公司 群盈汇互联网科技有限公司 互联网硬科技公司 绵阳真晨互联网科技有限公司 华人运通互联网科技公司 互联网科技自媒体灵感 如何强化互联网金融科技
0