文章目录
前言
数据库定时备份是开发中的刚需,就如同我们公司之前数据库植入病毒勒索比特币…
一、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
脚本里注释写的也很清楚 同学们可以细细看一下
#ipdbserver='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#正式备份数据库fortablein$dbname;dosource=`mysqldump -h ${dbserver} -u ${dbuser} -p${dbpasswd} ${table}> ${logpath}/${table}/${table}_${backtime}.sql`2>>${logpath}/logs/mysql-back.log;#备份成功以下操作if["$?"==0];thencd${logpath}#删除七天前备份,也就是只保存7天内的备份find$logpath -name "*.sql" -type f -mtime +7 -exec rm -rf {}\;>${logpath}2>&1echo"数据库表 ${dbname} 备份成功!!">>${logpath}/logs/mysql-back.log
else#备份失败则进行以下操作echo"数据库表 ${dbname} 备份失败!!">>${logpath}/logs/mysql-back.log
fidoneecho"完成备份"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
#写入该命令
0000*** 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、方法一: 备份是通过如下命令实现
dockerexec -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
# 如果需要压缩dockerexec 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、方法二: 进入容器执行
#获取容器idmysqlid=`/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文件导出到服务器dockercp${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--------------------------------" >> $LOGFILEecho"${time} START BACKUP"echo"${time} START BACKUP ">> $LOGFILEecho"${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' >> $LOGFILEexit
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"];thenmkdir -p $backup_locationfi# 设置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=7backup_time=`date +%Y%m%d%H%M`backup_dir=$backup_locationwelcome_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--------------------------------">>$LOGFILEecho"${time} START BACKUP"echo"${time} START BACKUP ">>$LOGFILEecho"${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”这个参数
dockerexec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database>$backup_dir/$mysql_database_backup_filetime=$(date"+%Y-%m-%d %H:%M:%S")if[$? -ne 0];thenecho'${time} FINISH ERROR'echo'${time} FINISH ERROR'>>$LOGFILEexit
EOF
fiecho"${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"];thenmkdir -p $backup_locationfi# 设置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=7backup_time=`date +%Y%m%d%H%M`backup_dir=$backup_locationwelcome_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--------------------------------">>$LOGFILEecho"${time} START BACKUP"echo"${time} START BACKUP ">>$LOGFILEecho"${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”这个参数
dockerexec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database>$backup_dir/$mysql_database_backup_filetime=$(date"+%Y-%m-%d %H:%M:%S")if[$? -ne 0];thenecho'${time} FINISH ERROR'echo'${time} FINISH ERROR'>>$LOGFILEexit
EOF
fiecho"${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
版权归原作者 汪杰杰杰杰 所有, 如有侵权,请联系我们删除。