当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、Linux中定时备份mysql
    • 1.先上效果图
    • 2.创建目录
    • 3.开写==shell==脚本
    • 4.==定时执行==
      • 1、crond和crontab
      • 2、新建任务
      • 3、查看任务
      • 4、删除所有任务
  • 二、Docker中定时备份mysql
    • 1、方法一: 备份是通过如下命令实现
    • 2、方法二: 进入容器执行
    • 3、实现
      • 1、执行脚本
      • 2.看效果
      • 3.定时执行(同是使用==crontab==命令,可参考上方)
    • 4、我把Nacos和XxlJob的备份脚本文件也贴出来,可以直接Copy使用
      • 1、创建Nacos shell脚本文件
      • 2、创建XxlJob shell脚本文件
      • 3、添加定时任务


前言

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


一、Linux中定时备份mysql

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

1.先上效果图

在这里插入图片描述

2.创建目录

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

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

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

3.开写shell脚本

//创建shell脚本文件

vim jeecgboot-back.sh

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

#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} #############################"

代码如下(示例):

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

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

sh jeecgboot-back.sh

备份成功 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

3、查看任务

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

4、删除所有任务

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

二、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

参考: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

参考: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

脚本内容(如遇到问题注意看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、执行脚本

#给脚本文件赋权限
chmod +x LIFE_jeecg_backup.sh
#执行脚本方法一
sh LIFE_jeecg_backup.sh
#执行脚本方法二
./LIFE_jeecg_backup.sh

2.看效果

在这里插入图片描述

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

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

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

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

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

1、创建Nacos shell脚本文件

vim LIFE_nacos_backup.sh

脚本代码

#!/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

2、创建XxlJob shell脚本文件

vim LIFE_xxljob_backup.sh

脚本代码

#!/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

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

相关文章:

  • 文件操作安全之-文件上传原理篇
  • 这就是为什么美联储加息 0.75% 可能对比特币有利的原因
  • 冒泡排序算法-python实现
  • 嵌入式分享合集61
  • MySQL进阶语句
  • MySQL:备份与恢复
  • Spring MVC
  • MySQL 日志管理
  • 机器学习之特征选择
  • 高薪程序员面试题精讲系列149之你熟悉单点登录吗?说说单点登录的实现原理及流程
  • 【Unity3D】顶点和片段着色器
  • jmeter实战
  • 【零基础学QT】第十章 项目打包,利用Inno Setup制作软件安装包
  • LeetCode合并有序数组
  • 微信小程序分享一个视频给好友
  • @jsonView过滤属性
  • CEF与代理
  • Idea+maven+scala构建包并在spark on yarn 运行
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java中的hashCode
  • Median of Two Sorted Arrays
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 阿里云前端周刊 - 第 26 期
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • UI设计初学者应该如何入门?
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​linux启动进程的方式
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)elasticsearch 源码之启动流程分析
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)菜鸟学数据库(三)——存储过程
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET BackgroundWorker
  • .NET CF命令行调试器MDbg入门(一)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ SNOI 2013 ] Quare
  • [CF226E]Noble Knight's Path
  • [COI2007] Sabor
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [Head First设计模式]策略模式