千家信息网

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

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,一、MySQL的日常备份方案:全备+增量备份:1、周日凌晨三点进行全备;2、周一到周日增量备份。不是往常的周日全备份,周一到周六增量备份,这样如果周日数据库在完全备份前出问题,恢复完成后,会少周日一天
千家信息网最后更新 2025年11月07日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安全错误 数据库的锁怎样保障安全 密云区卫星软件开发答疑解惑 c 删除数据库重复数据结构 digsee数据库的使用 软件开发季度述职模板 伊宁互联网科技有限公司 2018央视网络安全大会 服务器网卡聚合联想sr650 跨考西工大网络安全研究生 天一魔兽世界服务器端 ipc610工控机能做服务器吗 关系数据库设计 工具 数据库占用空间大不大 2003数据库下载 嵌入式软件开发商防水桌布 网络安全手抄报五年级图片 长宁区网络软件开发机构整顿 2021年最新的数据库技术 信用卡代还软件开发oem 内科大信息与网络安全 nc系统怎么从数据库取数 期待互联网科技有限公司 用友财务软件数据库如何卸载 数据库备份失败是什么意思 网络安全防护应知应会宣传 华为网络技术网上视频教程 为了保护数据库的安全 我国网络安全定级依据是什么 天天炫斗服务器 春节前信息网络安全大检查 请求服务器前端开始游戏失败
0