Docker容器定时备份MySQL数据库

1. 系统环境

mysql8、centos7.9

2. 创建mysql_backup.sh文件

#!/bin/bash #获取容器id container_id=`/usr/bin/docker ps -aqf "name=mysql-8.0"` echo "mysql的镜像ID is $container_id" #登录用户名 mysql_user="xxx" #登录密码(注意 如果密码包含特殊符号 前面要用'\') mysql_password="xxx" mysql_port="xxx" #备份的数据库名 #mysql_database="db1" #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3") backup_db_arr=("xxx") # 是否删除过期数据 expire_backup_delete="true" #过期天数 expire_days=4 # 备份文件存放地址(根据实际情况填写) backup_location="/home/data/mysqldata/backup" #定义备份详细时间 backup_time=`date +%Y%m%d%H%M` #定义备份目录中的年月日时间 backup_Ymd=`date +%Y-%m-%d` #3天之前的日期 backup_3ago=`date -d '4 days ago' +%Y-%m-%d` #备份文件夹全路径 backup_dir=$backup_location/$backup_Ymd flag=`echo $?` # 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份 if [ "$backup_db_arr" != "" ];then for dbname in ${backup_db_arr[@]} do echo "开始执行数据库 $dbname 备份..." `mkdir -p $backup_dir` # 备份指定数据库中数据 `docker exec $container_id mysqldump --defaults-extra-file=/etc/my.cnf -F -B --default-character-set=utf8 $dbname > $backup_dir/bak-$dbname-$backup_time.sql` flag=`echo $?` if [ $flag == "0" ];then echo "数据库 $dbname 成功备份到 $backup_dir/bak-$dbname-$backup_time.sql" else echo "数据库 $dbname 备份失败!" fi done else echo "没有待备份的数据库,停止数据库备份" exit fi # 删除过期数据 if [ "$expire_backup_delete" == "true" -a "$backup_dir"!="" ];then `find $backup_dir/ -type f -mtime +$expire_days | xargs rm -rf` echo "删除失效的数据库备份信息!" fi echo "所有的数据库已完成备份" exit fi

3. 容器内部配置my.cnf

3.1 进入容器

docker exec -it <container_id_or_name> /bin/bash vim /etc/my.cnf

3.2 编辑my.cnf,添加如下

[mysqldump] user=xxx password="xxx"

3.3 或者在宿主机上编辑my.cnf复制文件至容器内部

docker cp my.cnf mycontainer:/etc/

4.赋予shell文件可执行权限

#设置拥有者可读写,其他人不可读写执行 chmod 600 /home/data/mysqldata/backup/mysql_backup.sh #赋予“可执行”权限 chmod +x /home/data/mysqldata/backup/mysql_backup.sh

5. 配置定时任务,每天凌晨1:00执行文件

#便捷编辑定时任务 crontab -e #配置 00 01 * * * /home/data/mysqldata/backup/mysql_backup.sh >> /home/data/mysqldata/backup/mysql_backup.log 2>&1

6. 开启定时任务

#重载一遍crond systemctl reload crond.service #查看任务 crontab -l

7. 遇到问题

7.1 “/bin/bash^M: bad interpreter: No such file or directory”

原因:在执行 shell 脚本时提示这样的错误主要是由于 shell 脚本文件是 dos 格式,即每一行结尾以 \r\n 来标识,而 unix 格式的文件行尾则以 \n 来标识

解决方法:

使用 sed 命令 sed -i "s/\r//" filename 或者 sed -i "s/^M//" filename 直接替换结尾符为 unix 格式;

查看脚本文件是 dos 格式还是 unix 格式的几种办法。
cat -A filename 从显示结果可以判断,dos 格式的文件行尾为 ^M$,unix 格式的文件行尾为 $;
————————————————

原文链接:https://blog.csdn.net/jinchunzhao123/article/details/130139439


__EOF__

本文作者fanfan
本文链接https://www.cnblogs.com/fanwenyan/p/18186325.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   MaskerFan  阅读(687)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示