前言
在使用 Docker 部署 MySQL 时,很多开发者习惯进入容器内部进行操作,然而这常常带来以下痛点:
- 备份文件默认保存在容器内部,容器一旦停止或删除,备份随之丢失
- 操作步骤繁琐,需要在容器内外反复切换终端
- 不利于自动化脚本编写,手动操作易出错
- 使用磁盘目录映射,要更加方便一些,但依然不够优雅
本文将系统介绍如何在 Docker 环境中安全、高效地备份和查看 MySQL 数据库,并提供”不进容器”的最佳实践方案,同时提供完整的自动化备份和恢复脚本。
一、备份操作
1.1 容器内部备份(不推荐但需了解)
如果你已经进入 MySQL 容器(docker exec -it mysql bash),备份流程如下:
1 | # 备份单个数据库到容器内临时目录 |
关键问题:备份文件在容器内部,容器删除则文件丢失。
解决方法:将文件从容器复制到宿主机
1 | # 在宿主机执行(另一个终端窗口) |
完整工作流示例:
1 | # 1. 容器内备份 |
1.2 推荐方案:不进容器直接备份
直接在宿主机执行,一步到位:
1 | # 备份单个数据库到宿主机 |
为什么这是最佳实践?
- ✅ 简单:单条命令完成备份
- ✅ 安全:备份直接保存在宿主机
- ✅ 自动化:易于集成到脚本和定时任务
- ✅ 资源友好:不占用容器内磁盘空间
1.3 自动化备份脚本
对于生产环境,建议使用自动化备份脚本。以下是一个功能完整的双重备份脚本,可保存为 backup-mysql.sh:
1 |
|
设置定时任务:
1 | # 编辑 crontab |
二、查看操作(不进容器)
无需进入容器,直接在宿主机通过 docker exec 调用 MySQL 客户端。
2.1 查看数据库信息
1 | # 查看所有数据库 |
2.2 查看表结构
1 | # 查看指定数据库的所有表 |
2.3 数据查询
1 | # 查询数据(限制5条) |
2.4 交互式模式
如需连续执行多条 SQL 命令,使用交互式模式:
1 | # 进入 MySQL 交互命令行 |
输入密码后,进入 mysql> 提示符,可执行任何 SQL 命令:
1 | USE mydb; |
三、恢复操作
3.1 手动恢复
1 | # 恢复完整备份 |
3.2 交互式恢复脚本
对于复杂的恢复需求,可以使用以下交互式恢复脚本,保存为 interactive-restore.sh:
1 |
|
使用方式:
1 | # 1. 给执行权限 |
四、参数说明与安全提示
4.1 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-u |
用户名 | -u root |
-p |
密码(注意无空格) | -p123456 |
-e |
执行 SQL 语句 | -e "SHOW DATABASES;" |
-it |
交互式终端 | -it |
4.2 安全建议
密码安全:避免在命令行明文显示密码
1
2
3
4
5
6# 方式1:手动输入(推荐)
docker exec -it mysql-container mysql -u root -p
# 方式2:使用环境变量
export MYSQL_PWD=your_password
docker exec mysql-container mysql -u root -e "SHOW DATABASES;"容器状态:确保容器正在运行
1
docker ps | grep mysql
权限控制:使用最小权限账户进行操作
定期测试恢复:定期验证备份文件的可用性
五、快速测试指南
1 | # 1. 测试备份功能 |
六、总结与建议
核心原则:尽量不进容器
| 场景 | 推荐操作 | 命令示例 |
|---|---|---|
| 手动备份 | 宿主机直接执行 | docker exec mysql容器 mysqldump -u 用户 -p密码 数据库 > 备份.sql |
| 已进容器 | 备份到 /tmp/ 后复制 |
容器内备份 → docker cp 复制 → 清理临时文件 |
| 自动化备份 | 使用备份脚本 + crontab | backup-mysql.sh + 定时任务 |
| 日常查看 | 宿主机查询 | docker exec mysql容器 mysql -u 用户 -p密码 -e "SQL语句" |
| 数据恢复 | 使用恢复脚本 | ./interactive-restore.sh |
最佳实践
- 自动化备份:使用提供的
backup-mysql.sh脚本实现定时双重备份 - 交互式恢复:使用
interactive-restore.sh脚本安全恢复数据 - 定期验证:至少每月测试一次备份文件的恢复流程
- 版本控制:对备份和恢复脚本进行版本管理
- 监控告警:监控备份任务的执行状态和磁盘空间
提示:所有命令中的容器名、用户名、密码、数据库名请替换为你的实际值。对于生产环境,建议将备份脚本化并定期测试恢复流程。
本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站