• ✨Linux定时备份mysql中的数据库(包括Docker)



    前言

    数据库定时备份是开发中的刚需,就如同我们公司之前数据库植入病毒勒索比特币…


    一、Linux中定时备份mysql

    基本逻辑就是通过定时轮询执行shell脚本去备份数据库形成脚本文件存放在服务器文件夹中

    1.先上效果图

    在这里插入图片描述

    2.创建目录

    先找到自己存放脚本的目录下面,我放在 root/BeiFen文件夹下

    //进入root目录下
    cd /root
    //创建BeiFen文件夹
    mkdir BeiFen
    //因为我备份了三个数据库 所以我创建了三个文件夹
    mkdir jeecg-boot nacos xxl_job 
    //创建存放日志的logs文件夹 我把shell脚本也存放在了该目录下
    mkdir logs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    文件夹创建完毕效果展示
    在这里插入图片描述

    3.开写shell脚本

    //创建shell脚本文件

    vim jeecgboot-back.sh
    
    • 1

    脚本里注释写的也很清楚 同学们可以细细看一下

    #ip
    dbserver='127.0.0.1'
    #数据库用户名
    dbuser='root'
    #数据密码
    dbpasswd='root'
    #数据库,如有多个库用空格分开
    dbname='jeecg-boot nacos xxl_job'
    #备份时间
    backtime=`date +%Y%m%d-%H:%M`
    #备份输出日志路径
    logpath='/root/BeiFen'
    
    
    echo "################## ${backtime} #############################"
    echo "${dbname} 开始备份 备份时间 ${backtime} "
    #日志记录头部
    echo "" >> ${logpath}/logs/mysql-back.log
    #echo "-------------------------------------------------" >> ${logpath}/logs/mysql-back.log
    #echo "备份时间为${backtime},备份数据库表 ${dbname} 开始" >> ${logpath}/logs/mysql-back.log
    #正式备份数据库
    for table in $dbname; do
    source=`mysqldump -h ${dbserver} -u ${dbuser} -p${dbpasswd} ${table} > ${logpath}/${table}/${table}_${backtime}.sql` 2>> ${logpath}/logs/mysql-back.log;
    #备份成功以下操作
    if [ "$?" == 0 ];then
    cd ${logpath}
    #删除七天前备份,也就是只保存7天内的备份
    find $logpath -name "*.sql" -type f -mtime +7 -exec rm -rf {} \; > ${logpath} 2>&1
    echo "数据库表 ${dbname} 备份成功!!" >> ${logpath}/logs/mysql-back.log
    else
    #备份失败则进行以下操作
    echo "数据库表 ${dbname} 备份失败!!" >> ${logpath}/logs/mysql-back.log
    fi
    done
    echo "完成备份"
    echo "################## ${backtime} #############################"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    代码如下(示例):

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    import  ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    # 二、使用步骤
    ## 1.引入库
    代码如下(示例):
    
    ```c
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    import  ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们手动执行一下 看一下效果

    sh jeecgboot-back.sh
    
    • 1

    备份成功 very nice!
    在这里插入图片描述

    4.定时执行

    1、crond和crontab

    crond和crontab是密不可分的

    • crond

    crond 是 Linux 系统下用来周期性地执行某种任务或等待处理某些事件的一个守护进程。当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

    • crontab
      linux提供给使用者自己定义任务,crontab依赖crond进程,crond进程每分钟回去扫描crontab中的定时任务

    查看crond进程的状态,默认是根据系统自启动的

    2、新建任务

    • 00 00 * * * 每天凌晨执行一次
    #新建定时任务命令
    crontab -e
    
    #写入该命令
    00 00 * * * cd /root/BeiFen/logs; sh jeecgboot-back.sh >> mysql-back.log 2>>mysql-back.log
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、查看任务

    #查看定时任务命令
    crontab -l
    
    • 1
    • 2

    4、删除所有任务

    #crontab -r 删除任务 没有提示 谨慎操作! 谨慎操作! 谨慎操作!(重要的事情说三遍!!!)
    crontab -r
    
    • 1
    • 2

    二、Docker中定时备份mysql

    docker中备份数据库的逻辑跟上面的差不多 也是通过定时轮询shell脚本从而实现数据库的备份

    1、方法一: 备份是通过如下命令实现

    docker exec -it mysql(镜像号) mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1(数据库名称)(中间是有一个空格的)> $backup_dir/mysql_backup_test-$backup_time.sql
    # 如果需要压缩
    docker exec 301520ed7b07 mysqldump -uroot -p123456 leyeoa | gzip > ${backup_dir}/leyeoa_${backup_time}.sql.gz
    # 解压gz压缩包
    gzip -d FileName.gz
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考:http://t.zoukankan.com/Hello-TomCat-p-13231783.html

    2、方法二: 进入容器执行

    #获取容器id
    mysqlid=`/usr/local/bin/docker ps -aqf "name=mysql5.7"`
     
    #进入mysql容器
    /usr/local/bin/docker exec -i ${mysqlid} bash<<'EOF'
    # 执行备份
    mysqldump --single-transaction -u root -h 127.0.0.1 --password=123456 --all-databases > /backup/db.sql
    #将容器内sql文件导出到服务器
    docker cp ${mysqlid}:/backup/db.sql ${backup_dir}/db_${now}.sql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考:https://www.cnblogs.com/wangtaobiu/p/15624238.html

    3、实现

    #进入脚本存放文件夹
    cd /root/BeiFen/
    #创建存放备份文件的文件夹
    mkdir LIFETREEBACKUP
    mkdir Jeecg
    #创建脚本文件
    touch LIFE_jeecg_backup.sh
    #编写脚本文件
    vim LIFE_jeecg_backup.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    脚本内容(如遇到问题注意看shell里的注释)

    #!/bin/bash
    
    # 定义工作路径
    BASE_DIR=/root/BeiFen
    
    # 备份文件存放地址(根据实际情况填写)
    backup_location=$BASE_DIR/LIFETREEBACKUP/Jeecg
    echo "$(date "+%Y-%m-%d %H:%M:%S") 备份路径:$backup_location"
    
    # 判断路径是否存在
    if [ ! -d "$backup_location" ]; then
        mkdir -p $backup_location
    fi
    
    # 设置mysql的登录用户名和密码(根据实际情况填写)
    mysql_user="root"
    mysql_password="root"
    mysql_host="172.17.0.1"
    mysql_port="3306"
    mysql_charset="utf8"
    mysql_database=jeecg-boot
    
    # 增加日志路径 #时间格式DATE=`date '+%Y%m%d-%H%M'`
    LOGFILE=$backup_location/$mysql_database-backup.log
    echo "$(date "+%Y-%m-%d %H:%M:%S") 日志路径:$LOGFILE"
    
    # 是否删除过期数据
    expire_backup_delete="ON"
    expire_days=7
    backup_time=`date +%Y%m%d%H%M`
    backup_dir=$backup_location
    welcome_msg="Welcome to use MySQL backup tools!"
    mysql_database_backup_file=${mysql_database}_backup-${backup_time}.sql
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "\r\n\r\n\r\n--------------------------------" >> $LOGFILE
    
    echo "${time} START BACKUP"
    echo "${time} START BACKUP ">> $LOGFILE
    echo "${time} docker exec -it mysql mysqldump -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_password} -B ${mysql_database} > ${backup_dir}/${mysql_database_backup_file}"  >> $LOGFILE
    # docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    # 报错解决:the input device is not a TTY 原因是后台linux执行的时候没有终端设备一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数
    ,而在重启过重中或定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数
    docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    if [ $? -ne 0 ]; then
            echo '${time} FINISH ERROR'
            echo '${time} FINISH ERROR'  >> $LOGFILE
            exit
            EOF
    fi
    echo "${time} FINISH BACKUP"
    echo "${time} FINISH BACKUP" >> $LOGFILE
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    1、执行脚本

    #给脚本文件赋权限
    chmod +x LIFE_jeecg_backup.sh
    #执行脚本方法一
    sh LIFE_jeecg_backup.sh
    #执行脚本方法二
    ./LIFE_jeecg_backup.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.看效果

    在这里插入图片描述

    3.定时执行(同是使用crontab命令,可参考上方)

    00 00 * * * 每天凌晨12点执行一次

    00 00 * * * cd /root/BeiFen;sh LIFE_jeecg_backup.sh >> back_task.log 2>>back_task.log
    
    • 1

    4、我把Nacos和XxlJob的备份脚本文件也贴出来,可以直接Copy使用

    #进入脚本存放文件夹
    cd /root/BeiFen/LIFETREEBACKUP
    #创建用于存放备份Nacos数据库脚本的文件夹
    mkdir Nacos
    #创建用于存放备份Xxljob数据库的文件夹
    mkdir XxlJob
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1、创建Nacos shell脚本文件

    vim LIFE_nacos_backup.sh
    
    • 1

    脚本代码

    #!/bin/bash
    
    # 定义工作路径
    BASE_DIR=/root/BeiFen
    
    # 备份文件存放地址(根据实际情况填写)
    backup_location=$BASE_DIR/LIFETREEBACKUP/Nacos
    echo "$(date "+%Y-%m-%d %H:%M:%S") 备份路径:$backup_location"
    
    # 判断路径是否存在
    if [ ! -d "$backup_location" ]; then
        mkdir -p $backup_location
    fi
    
    # 设置mysql的登录用户名和密码(根据实际情况填写)
    mysql_user="root"
    mysql_password="root"
    mysql_host="172.17.0.1"
    mysql_port="3306"
    mysql_charset="utf8"
    mysql_database=nacos
    
    # 增加日志路径 #时间格式DATE=`date '+%Y%m%d-%H%M'`
    LOGFILE=$backup_location/$mysql_database-backup.log
    echo "$(date "+%Y-%m-%d %H:%M:%S") 日志路径:$LOGFILE"
    
    # 是否删除过期数据
    expire_backup_delete="ON"
    expire_days=7
    backup_time=`date +%Y%m%d%H%M`
    backup_dir=$backup_location
    welcome_msg="Welcome to use MySQL backup tools!"
    mysql_database_backup_file=${mysql_database}_backup-${backup_time}.sql
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "\r\n\r\n\r\n--------------------------------" >> $LOGFILE
    
    echo "${time} START BACKUP"
    echo "${time} START BACKUP ">> $LOGFILE
    echo "${time} docker exec -it mysql mysqldump -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_password} -B ${mysql_database} > ${backup_dir}/${mysql_database_backup_file}"  >> $LOGFILE
    # docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    # 报错解决:the input device is not a TTY 原因是后台linux执行的时候没有终端设备一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数
    ,而在重启过重中或定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数
    docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    if [ $? -ne 0 ]; then
            echo '${time} FINISH ERROR'
            echo '${time} FINISH ERROR'  >> $LOGFILE
            exit
            EOF
    fi
    echo "${time} FINISH BACKUP"
    echo "${time} FINISH BACKUP" >> $LOGFILE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    2、创建XxlJob shell脚本文件

    vim LIFE_xxljob_backup.sh
    
    
    • 1
    • 2

    脚本代码

    #!/bin/bash
    
    # 定义工作路径
    BASE_DIR=/root/BeiFen
    
    # 备份文件存放地址(根据实际情况填写)
    backup_location=$BASE_DIR/LIFETREEBACKUP/XxlJob
    echo "$(date "+%Y-%m-%d %H:%M:%S") 备份路径:$backup_location"
    
    # 判断路径是否存在
    if [ ! -d "$backup_location" ]; then
        mkdir -p $backup_location
    fi
    
    # 设置mysql的登录用户名和密码(根据实际情况填写)
    mysql_user="root"
    mysql_password="root"
    mysql_host="172.17.0.1"
    mysql_port="3306"
    mysql_charset="utf8"
    mysql_database=xxl_job
    
    # 增加日志路径 #时间格式DATE=`date '+%Y%m%d-%H%M'`
    LOGFILE=$backup_location/$mysql_database-backup.log
    echo "$(date "+%Y-%m-%d %H:%M:%S") 日志路径:$LOGFILE"
    
    # 是否删除过期数据
    expire_backup_delete="ON"
    expire_days=7
    backup_time=`date +%Y%m%d%H%M`
    backup_dir=$backup_location
    welcome_msg="Welcome to use MySQL backup tools!"
    mysql_database_backup_file=${mysql_database}_backup-${backup_time}.sql
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "\r\n\r\n\r\n--------------------------------" >> $LOGFILE
    
    echo "${time} START BACKUP"
    echo "${time} START BACKUP ">> $LOGFILE
    echo "${time} docker exec -it mysql mysqldump -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_password} -B ${mysql_database} > ${backup_dir}/${mysql_database_backup_file}"  >> $LOGFILE
    # docker exec -it mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    # 报错解决:the input device is not a TTY 原因是后台linux执行的时候没有终端设备一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数
    ,而在重启过重中或定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数
    docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/$mysql_database_backup_file
    
    time=$(date "+%Y-%m-%d %H:%M:%S")
    if [ $? -ne 0 ]; then
            echo '${time} FINISH ERROR'
            echo '${time} FINISH ERROR'  >> $LOGFILE
            exit
            EOF
    fi
    echo "${time} FINISH BACKUP"
    echo "${time} FINISH BACKUP" >> $LOGFILE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    3、添加定时任务

    00 01 * * * cd /root/BeiFen;sh LIFE_xxljob_backup.sh >> back_task.log 2 >>back_task.log
    00 01 * * * cd /root/BeiFen;sh LIFE_nacos_backup.sh >> back_task.log 2>>back_task.log
    
    • 1
    • 2

  • 相关阅读:
    飞桨模型转ONNX模型教程
    服务器向客户端推送消息之——WebSocket详细使用
    基于WebRTC的开源低延时播放器实践
    【电子通识】USB接口三大类型图册
    SpringCloudAlibaba OpenFeign整合及详解
    ubuntu上运行make menuconfig两种报错
    Treap 原理详解和实战
    整合minio时出现的错误
    MFC Windows 程序设计[261]之选项文档例程(附源码)
    goLang context组件学习笔记
  • 原文地址:https://blog.csdn.net/wj2004071/article/details/126942495