一、概念

方法一:备份是通过如下命令实现

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

方法二:或者进入容器执行

#获取容器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

二、实现

1、新建脚本

cd /usr/local/mysql
touch mysql_backup_edevp-nacos.sh
vim mysql_backup_edevp-nacos.sh

输入以下内容

#!/bin/bash

# 定义工作路径
BASE_DIR=/usr/local/mysql
 
# 备份文件存放地址(根据实际情况填写)
backup_location=$BASE_DIR/backup
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="123"
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8"
mysql_database=edevp-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

# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
# mysqldump --single-transaction -u root -h 127.0.0.1 --password=123456 --all-databases > /backup/db.sql
#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
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
# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
		#删除7天以上的备份 find /home/ywtg/backup/ -type f -mtime +7 -exec rm {} ;
        `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
        echo ${time}' Expired backup data delete complete!'
fi
  • 注意
    报错解决:the input device is not a TTY 原因是后台linux执行的时候没有终端设备一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数,而在重启过重中或定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数
    docker exec mysql mysqldump -hDocker容器中部署的MySQL每天进行定时自动备份数据库 docker mysql 备份数据库_dockermysql_port -uDocker容器中部署的MySQL每天进行定时自动备份数据库 docker mysql 备份数据库_sql_02mysql_password -B $mysql_database > Docker容器中部署的MySQL每天进行定时自动备份数据库 docker mysql 备份数据库_sql_03mysql_database_backup_file

2、执行脚本

chmod +x mysql_backup_edevp-nacos.sh
./mysql_backup_edevp-nacos.sh

Docker容器中部署的MySQL每天进行定时自动备份数据库 docker mysql 备份数据库_sql_04

三、定时执行

1、crond和crontab

crond和crontab是密不可分的

  • crond

crond 是 Linux 系统下用来周期性地执行某种任务或等待处理某些事件的一个守护进程。当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

  • crontab

linux提供给使用者自己定义任务,crontab依赖crond进程,crond进程每分钟回去扫描crontab中的定时任务

查看crond进程的状态,默认是根据系统自启动的

2、新建任务

  • 00 02 * * * 每天凌晨两点执行一次
#新建定时任务命令
crontab -e

00 11 * * * cd /usr/local/mysql;sh mysql_backup_edevp-nacos.sh >> back_task.log 2>>back_task.log

3、查看任务

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

4、删除所有任务

crontab -r 之间删除任务,没有提示,谨慎操作

#删除所有定时任务命令
crontab -r