mysql docker 数据库定时备份 保留7天的数据

1.普通的数据库备份

#!/bin/bash
mysqldump -uusername -ppassword DatabaseName > /home/dbback/DatabaseName_$(date +%Y%m%d_%H%M%S).sql
对备份进行压缩:
#!/bin/bash
mysqldump -uusername -ppassword DatabaseName | gzip > /home/dbback/DatabaseName_$(date +%Y%m%d_%H%M%S).sql.gz

2.docker下备份mysql

docker exec -it mysql mysqldump -uuser -ppassword databasename| gzip > /your/bak/file/path/databasename_$(date +%Y%m%d_%H%M%S).sql.gz

3.删除7天外 的数据

find $path -name "*.sql.gz" -type f -mtime +7 -exec rm {} \;

4.crontab 添加定时任务

  crontab -e 进入编辑状态添加定时任务,每天凌晨两点执行,日志输出到指定文件中。

00 02 * * * /your/path/for/bak/***.sh >> /your/path/for/bak/**.log 2>&1

备注:

 脚本写正确后会正确备份,定时任务执行可能备份数据是空,由于mysqldump存在于全局环境变量mysql的bin下面,故在直接运行时可以识别到mysqldump命令,而在crontab里面无法识别到mysqldump命令。(ps:crontab运行失败问题基本都是环境变量引起的)

解决方案1:

在备份脚本里面的mysqldump命令前加上绝对路径可以解决,find / -name mysqldump 命令查看命令所在路径

解决方案2:

修改docker导出命令:

docker exec mysql sh -c "exec /usr/bin/mysqldump  -uuser -ppassword databasename | gzip " > /your/path/for/bak/databasename_$(date +%Y%m%d_%H%M%S).sql.gz

 

<think>好的,用户现在想了解如何在Docker容器中备份MySQL数据库的最佳实践。根据之前的对话历史,用户之前询问的是关于NAS存储的高可用性问题,现在转向了Docker中的MySQL备份。需要结合提供的引用内容来整理最佳实践步骤。 首先,用户提供的引用中有多个关于Docker备份MySQL的方法,包括使用脚本、crontab定时任务、备份路径设置、权限管理和恢复步骤。需要将这些信息整合成一个结构化的指南,确保涵盖所有关键点。 接下来,需要确定最佳实践的核心要素。根据引用内容,主要涉及以下几个方面:脚本编写、定时任务配置、存储路径管理、权限设置、备份恢复流程以及日志记录和清理策略。每个部分都需要详细说明,确保用户能够按步骤操作。 另外,用户可能关心数据的一致性和安全性,比如如何避免备份过程中数据被修改,或者在容器故障时如何快速恢复。引用中提到使用mysqldump,但需要确认是否有更好的方法,比如使用卷备份或者数据库的热备份工具。 还需要注意权限问题,比如在脚本中硬编码密码可能存在安全隐患,引用中有的示例直接在命令行中使用密码,这可能不够安全。最佳实践应该建议使用配置文件或环境变量来管理敏感信息,如引用4提到的在my.cnf中配置用户和密码,并通过docker cp复制到容器中,这样可以避免密码暴露在脚本中。 此外,定时任务的配置方式也有不同,有的使用系统级crontab,有的使用用户级。需要说明两者的区别,并推荐最佳方式,比如使用系统级任务以确保执行权限,同时注意路径和环境变量的设置,如引用2中的例子。 备份文件的存储位置和命名规则也很重要,引用5中提到了按日期时间命名,并自动删除旧备份,这有助于管理存储空间。需要建议用户设置合理的保留策略,例如保留最近7备份。 最后,恢复流程是备份的重要组成部分,必须详细说明如何将备份文件导入到容器中,包括docker cp和source命令的使用,如引用2和引用3中的步骤。同时,提醒用户在恢复前验证备份文件的完整性。 总结来说,最佳实践需要涵盖从备份脚本的编写、定时任务的配置、安全措施、存储管理到恢复流程的全流程,确保用户能够安全、高效地备份和恢复MySQL数据库。</think>### Docker容器MySQL数据库备份最佳实践指南 #### 一、核心原则 1. **数据一致性**:使用`FLUSH TABLES WITH READ LOCK`确保备份期间数据完整性[^2] 2. **双重存储**:备份文件应同时存储在容器外宿主机和远程NAS[^1] 3. **自动化**:通过crontab实现定时备份[^4] 4. **安全隔离**:敏感信息(密码)通过配置文件管理[^4] #### 二、标准操作流程 ##### 1. 脚本编写(推荐方案) 创建`/opt/mysql_backup/mysql_backup.sh`: ```bash #!/bin/bash # 容器配置 CONTAINER_NAME="mysql8" BACKUP_DIR="/opt/mysql_backup/data" LOG_FILE="/opt/mysql_backup/backup.log" # 数据库配置(建议改用my.cnf) MYSQL_USER="root" MYSQL_PASSWORD=$(docker exec $CONTAINER_NAME bash -c 'cat /etc/mysql/conf.d/my.cnf | grep password | cut -d= -f2') # 备份执行 TIMESTAMP=$(date +"%Y%m%d%H%M") BACKUP_FILE="$BACKUP_DIR/${CONTAINER_NAME}_${TIMESTAMP}.sql.gz" echo "[$(date +'%F %T')] 开始备份" >> $LOG_FILE docker exec $CONTAINER_NAME mysqldump \ --single-transaction \ --flush-logs \ --all-databases \ -u$MYSQL_USER \ | gzip > $BACKUP_FILE 2>> $LOG_FILE echo "[$(date +'%F %T')] 备份完成,大小:$(du -h $BACKUP_FILE | cut -f1)" >> $LOG_FILE # 清理旧备份保留7) find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete ``` ##### 2. 安全配置(关键步骤) 1. 在容器内创建配置文件: ```bash # my.cnf 内容 [mysqldump] user=root password="your_secure_password" ``` 2. 复制到容器: ```bash docker cp my.cnf $CONTAINER_NAME:/etc/mysql/conf.d/ ``` ##### 3. 定时任务配置 ```bash # 系统级定时任务(推荐)[^2] sudo vim /etc/crontab # 每凌晨2点执行 0 2 * * * root /opt/mysql_backup/mysql_backup.sh >> /opt/mysql_backup/cron.log 2>&1 # 容器内定时任务(备选方案) docker exec $CONTAINER_NAME bash -c 'echo "0 2 * * * root /backup_script.sh" >> /etc/crontab' ``` ##### 4. 备份验证 ```bash # 检查备份文件完整性 zcat backup_file.sql.gz | grep "Dump completed on" # 模拟恢复测试 docker cp backup_file.sql.gz $CONTAINER_NAME:/tmp/ docker exec -it $CONTAINER_NAME bash -c "zcat /tmp/backup_file.sql.gz | mysql -u$MYSQL_USER" ``` #### 三、高级优化方案 1. **增量备份**:结合二进制日志 ```bash docker exec $CONTAINER_NAME mysql -e "FLUSH BINARY LOGS" cp $(docker inspect --format='{{.LogPath}}' $CONTAINER_NAME) $BACKUP_DIR ``` 2. **多版本管理**: ```bash # 使用btrfs子卷快照 sudo btrfs subvolume snapshot /var/lib/docker/volumes/mysql_data $BACKUP_DIR/snapshot_$(date +%s) ``` 3. **云存储集成**: ```bash # 添加rclone同步到云存储 rclone copy $BACKUP_DIR remote:mysql_backups --log-file=$LOG_FILE ``` #### 四、灾难恢复流程 1. **创建新容器**: ```bash docker run -d --name mysql_restore \ -v mysql_data_restore:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=new_password \ mysql:8 ``` 2. **恢复数据**: ```bash zcat latest_backup.sql.gz | docker exec -i mysql_restore mysql -uroot -pnew_password ``` 3. **验证恢复**: ```bash docker exec mysql_restore mysqlcheck -uroot -pnew_password --all-databases ``` #### 五、监控指标建议 | 监控项 | 健康阈值 | 检查命令 | |----------------|----------------|-----------------------------| | 备份文件大小 | 不小于昨日90% | `ls -lh $BACKUP_DIR` | | 备份持续时间 | <30分钟 | `grep "备份完成" $LOG_FILE` | | 备份成功率 | 100% | `grep "失败" $LOG_FILE` | #### 六、常见问题解决方案 1. **锁表超时**:添加`--lock-wait-timeout=60`参数 2. **内存不足**:使用`--quick`参数禁用缓存 3. **编码问题**:指定`--default-character-set=utf8mb4` 4. **容器崩溃恢复**:结合`docker commit`保存状态[^5] --相关问题--: 1. 如何实现MySQL增量备份与全量备份的组合策略? 2. Docker备份数据库逻辑备份的区别及适用场景? 3. 如何验证MySQL备份文件的完整性和可恢复性? 4. 在Kubernetes环境中如何调整此备份方案? 5. 备份加密的最佳实践有哪些?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值