参考文章:
https://www.jb51.net/article/222493.htm
https://blog.csdn.net/weixin_43757027/article/details/125196989
我的应用场景:
linux服务器+docker mysql容器运行,目标备份mysql数据库到linux本地。
注意:docker在运行容器时,需要将数据备份目录挂载到linux本地。
应用技术:
mysqldump脚本+crontab定时任务
不多说了直接上代码
创建文件夹
mkdir -p /root/mysql_backup_script
新建.sh脚本
cd /root/mysql_backup_script
touch mysqldump_dev.sh
给指定 .sh 脚本添加执行权限
chmod u+x mysqldump_dev.sh
编写sh脚本
-
编辑文件
vi mysqldump_dev.sh
-
编写脚本命令
#!/bin/bash
#保存备份个数
number=5
#容器内备份保存路径
container_backup_dir=/root/mysql_backup
#本地备份保存路径
backup_dir=/root/mysql_backup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=123456
#将要备份的数据库
database_name=db_test
#mysql容器id
container_id=0e470d3f0a33
#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi
#当前生成的sql备份文件路径
currBackupSqlFile=$database_name-$dd.sql
# 进入容器并备份数据库
docker exec -i $container_id bash -c "
#如果文件夹不存在则创建
if [ ! -d $container_backup_dir ];
then
mkdir -p $container_backup_dir;
fi
$tool -u $username -p$password $database_name > $container_backup_dir/$currBackupSqlFile;
"
#写创建备份日志
echo "create $backup_dir/$currBackupSqlFile date=$dd" >> $backup_dir/log.txt;
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile date=$dd" >> $backup_dir/log.txt
fi
-
保存退出:wq
-
注意:sh脚本文件中需要注意变量的值。 尤其注意mysql容器ID,如果mysql容器删除后重建则需要调整sh文件mysql容器ID
-
container_id
-
database_name
-
username
-
password
-
新增crontab定时
-
进入文件目录
/var/spool/cron
-
编辑
crontab -e
-
定时任务命令
*/5 * * * * /root/mysql_backup_script/mysqldump_dev.sh >> /root/mysql_backup_script/mysqldump_dev.log 2>&1 &
即五分钟执行一次.sh文件,并保存日志文件
-
保存退出:wq
到此功能就完了
额外简单使用:crontab
crontab命令的功能是在一定的时间间隔调度一些命令的执行
说明
crontab –e : 修改 crontab 文件. 如果文件不存在会自动创建
crontab –l : 显示 crontab 文件
crontab -r : 删除 crontab 文件
crontab -ir :删除 crontab 文件前提醒用户
crontab文件的含义:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
分 时 日 月 周 [用户] command
例如:
# 每5分钟运行一次命令
*/5 * * * * /root/bin/check-status.sh