✨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

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

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

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪杰杰杰杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值