Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

时间:2024-04-01 07:19:03

背景:数据库备份异地备份本地备份服务尤为重要,本文记录自己的电脑备份远程数据库

Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

首先脚本数据库备份sh脚本:mysql-beifen_db.sh 远程的话更改保存路径和远端的数据登录配置就好(mysql-beifen_db-dev.sh)

脚本概览Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

脚本源码: 

#!/bin/bash
#主机地址可以是远程
HOSTNAME="localhost"
USER="root"
PASSWORD="root"
PORT="3306"
#全库备份 放开该注释
#DATABASE_ARR=("--all-databases")

#备份的库的名称
DATABASE_ARR=("qboa-admin" "qboa-oa" "qboa-pubapp" "mysql")
#长度减一循环到下标
db_length=`expr ${#DATABASE_ARR[@]} - 1`
DATE=`date '+%Y%m%d_%H%M%S'` #日期格式(作为文件名) 
day=`date '+%Y%m%d'` #日期格式(作为文件名)
BACKUP_DIR=/home/zddts/mysql/beifen #备份文件存储路径
LOGFILE=$BACKUP_DIR/log/"$day"_mysql_beifen.log #日记文件路径
#切换至备份目录
cd $BACKUP_DIR
echo " " >> $LOGFILE
echo " " >> $LOGFILE
echo "———————————————–" >> $LOGFILE
echo "------begin----BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
#按库来进行备份
for i in $(seq 0 ${db_length}); do
    # do something....
    DATABASE=${DATABASE_ARR[$i]}
    OPTIONS="-h$HOSTNAME -u$USER -p$PASSWORD $DATABASE -P$PORT"
    if [ "$DATABASE" = "--all-databases" ];then
        DATABASE="all-databases"
    fi
    DUMPFILE=$DATE-$DATABASE.sql #备份文件名
    ARCHIVE=$DATE-$DATABASE.tar.gz #压缩文件名
    
    
    #mysqldump --help
 
    #判断备份文件存储目录是否存在,否则创建该目录
    if [ ! -d $BACKUP_DIR ] ;
    then
            mkdir -p "$BACKUP_DIR"
    fi
    #开始备份之前,将备份信息头写入日记文件
    #echo " " >> $LOGFILE
    #echo " " >> $LOGFILE
    #echo "———————————————–" >> $LOGFILE
    #echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
    #echo "———————————————– " >> $LOGFILE    
    #使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
    mysqldump $OPTIONS > $DUMPFILE
    #判断数据库备份是否成功
    if [[ $? == 0 ]]; then
        #创建备份文件的压缩包
        tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
        #输入备份成功的消息到日记文件
        echo "        [$ARCHIVE] Backup Successful!" >> $LOGFILE
        #删除原始备份文件,只需保 留数据库备份文件的压缩包即可
        rm -f $DUMPFILE
        
    else
        echo "        Database Backup Fail!" >> $LOGFILE
    fi
    #输出备份过程结束的提醒消息
    echo "        Database  Done" $DATABASE  $i  >> $LOGFILE
done
    #删除超时备份文件 5天
    #find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +14 -exec rm -rf {} \; > $BACKUP_DIR/null 2>&1
    for file in `find $BACKUP_DIR -name "*.tar.gz" -type f -mtime +14` ;
    do
        echo "        delete file " $file >> $LOGFILE
        rm -rf $file
    done
    #清理超时日志
    for file in `find $BACKUP_DIR -name "*.log" -type f -mtime +14` ;
    do
        echo "        delete log " $file >> $LOGFILE
        rm -rf $file
    done
    #输出备份过程结束的提醒消息
    echo "----end----BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
    echo "———————————————–" >> $LOGFILE

 

二、由于我的mysql是用docker的容器,所以不能使用linux下的cron来定时跑该脚本(如果mysql是直接装在宿主机下可以使用),所有我只能在docker 的mysql容器中安装cron

如果已安装忽略安装步骤:docker中安装

Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

docker exec  -it mymysql /bin/bash #进入mysql容器

apt-get update #更新
apt-get install cron #安装cron
/etc/init.d/cron status #查看状态
/etc/init.d/cron restart #启动服务

 

修改/etc/pam.d/cron文件 注释session required pam_loginuid.so(不能编辑安装vi:apt-get install vim)

然后重启cron服务:/etc/init.d/cron restart

 

 

 

安装好cron设置定时任务

crontab -e

Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

如图我设置了两个sh脚本 一个是备份本地数据库 ,一个是备份远端的数据库 将两个都定时备份到我的本地电脑上。

注:我sh存放路径是容器/home/zddts/mysql/sh/ 下,我将/home/zddts/mysql映射到宿主机linux下的/home/zddts/mysql/ 这个按照个人来,需要建好目录beifen以及log用来存放文件

新上传的sh可能没有执行权限用chmod a+x /home/zddts/sh/mysql-beifen_db.sh 执行授权;同时可以设置定时间提早执行已验证脚本是否执行。备份效果如下图,对应的库压缩包和log文件日志

Docker 中mysql容器定时备份(远程和本地)及清理备份sh脚本

cron 语法:

.crontab文件格式:

 *           *          *        *          *             command

minute   hour    day   month   week      command

分          时         天      月        星期       命令

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。

逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。

中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。