shell脚本
#!/bin/bash
#先指定备份路径
#BACKUP=/home/back
#显示当前时间
DATATIME=$(date "+%Y-%m-%d_%H%M%S")
BACKUP=/home/back/${DATATIME}
if [ ! -d "${dir}" ]
then
mkdir ${dir}
echo "创建文件夹成功"
else
echo "文件夹已经存在"
fi
#运行数据库的主机IP地址(执行备份的主机和运行数据库的主机可能不是同一台,如果同一台填自己IP即可)
HOST=192.168.0.10
#登录数据库的用户名
DB_USER=root
#数据库该用户名的密码
DB_PW=123456
#备份的数据库名(如需备份所有库,可参考下面步骤直接指定库名为 all)
DATABASE=system_data
#开始备份数据库提示语,仅提示作用,手动执行时方便判断到了哪一步
echo "开始备份数据库${DATABASE}"
#创建备份目录(如果指定的目录不存在,则新建目录,!-d不存在则成立,&&表示左端成立则执行右端动作)
[ ! -d ${BACKUP}/${DATATIME} ] && mkdir -p "${BACKUP}/${DATATIME}"
#sql操作:备份数据库
#备份数据库(这里我按项目实际情况指定all-databases,备份所有库)
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} --all-databases | gzip > ${BACKUP}/${DATATIME}/$DATATIME.sql.gz
#将文件压缩成 tar.gz
cd ${BACKUP}
tar -zcvf $DATATIME.tar.gz ${DATATIME}
#删除已备份的目录,由于压缩了文件,压缩前原有的可以删了
rm -rf ${BACKUP}/${DATATIME}
#结束备份数据库提示语,仅提示作用(!e如果该文件存在,则成立,||左端成立,则执行右端,建议加上这个条件,否则即使上面的数据库备份不成功,下面仍然会提示备份成功,这样就没法有效判断)
[ ! -e ${DATATIME}.tar.gz ] || echo "数据库${DATABASE}备份成功!"
#(可省略)
#推送到钉钉(这个步骤可省略,我根据项目需求想通过钉钉消息,就知道是否备份数据库。!-e数据库文件存在,则执行右端的python脚本,推送消息到钉钉群,钉钉脚本需要填写2个参数,1为用户名(>为了不@我,这里填1,也可填自己实际的钉钉号,这样钉钉机器人发消息就会@我), "DTcenter数据库${DATATIME} 备份成功!"为指定钉钉机器人发送的信息)
#[ ! -e ${DATATIME}.tar.gz ] || ./dingding.py 1 test "DTcenter数据库${DATATIME} 备份成功!"
echo -e " \n ----------------> 删除过期文件 <---------------------------"
# 判断文件夹数量是否大于7,防止程序意外停止,删除所有备份
dirCount=`ls -l /home/back/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ]
then
# 删除超过七天的带"_"的目录
find /home/back/ -mtime +6 -name "*_*" -exec rm -rf {} \;
echo -e " 删除过期文件成功"
else
echo "删除过期文件失败,文件数量小于 7 "
fi
其中路径/home/back/是mysql容器内的路径,就是你要把备份文件存放的位置,后面还加了时间,最后在容器中生成的路径是/home/back/2024-03-15_131501,这个路径下就是生成.sql的备份路径。
把上面的shell脚本放到你要发的路径中,这里我把shell脚本也是放到/home/back路径下。
如果要执行脚本看是否成功,执行命令是,进到shell脚本所在的目录
cd /home/back
执行,databack.sh是我的脚本文件名称
./databack.sh
设置定时任务,网上说的用crontab ,然后重启,
crontab -e #设置定时任务表达式
systemctl restart crond.service #重启命令
我这里是不生效的,我改用下面这个命令来设置定时任务。
vi /etc/pam.d/crond
* * * * * /home/back/databack.sh #定时表达式,每隔一分钟执行一次
然后重启定时任务
/etc/init.d/cron start
上面的这些操作都是在mysql容器内执行。