【原创实践】使用 Docker 在 MySQL 容器中批量导出所有数据库

在使用 Docker 部署 MySQL 的场景中,经常会遇到这样的需求:
一次性导出容器内除系统库以外的所有数据库 ,并分别生成 .sql 文件,用于备份或迁移。

本文介绍一种无需进入交互式容器 、通过一条 docker exec 命令,在容器内生成并执行导出脚本的实现方式。


一、整体思路

实现流程如下:

  1. 通过 docker exec 在 MySQL 容器中执行 Bash
  2. 动态创建一个数据库导出脚本 export_dbs.sh
  3. 使用 mysql 命令获取所有数据库列表
  4. 过滤掉系统数据库
  5. 循环调用 mysqldump,将每个数据库导出为独立的 .sql 文件
  6. 将导出文件保存到容器内 /tmp 目录

二、完整命令示例

bash 复制代码
docker exec -it mysql-container bash -c "cat << 'EOF' > /tmp/export_dbs.sh
#!/bin/bash

PASSWORD=\"root\"

mysql -uroot -p\${PASSWORD} --socket=/var/run/mysqld/mysqld.sock -e \"SHOW DATABASES;\" | \
  grep -v \"Database\" | \
  grep -v \"information_schema\" | \
  grep -v \"mysql\" | \
  grep -v \"performance_schema\" | \
  grep -v \"sys\" | \
  while read db; do
    echo \"Exporting database: \$db\"
    mysqldump -uroot -p\${PASSWORD} \
      --socket=/var/run/mysqld/mysqld.sock \
      --databases \"\$db\" > \"/tmp/\$db.sql\"
  done

echo \"Export completed.\"
EOF

chmod +x /tmp/export_dbs.sh
/tmp/export_dbs.sh"

三、关键部分详解

1. docker exec 执行容器内命令

bash 复制代码
docker exec -it mysql-container bash -c "..."
  • mysql-container:MySQL 容器名称
  • bash -c:在容器中执行一段 Bash 命令
  • -it:支持交互与终端输出

2. 使用 Here Document 生成脚本

bash 复制代码
cat << 'EOF' > /tmp/export_dbs.sh
  • 使用 Here Document 写入多行脚本
  • 'EOF' 使用单引号可避免变量在宿主机侧被提前展开
  • 脚本被写入容器内 /tmp/export_dbs.sh

3. MySQL 认证方式

bash 复制代码
PASSWORD="root"
mysql -uroot -p${PASSWORD} --socket=/var/run/mysqld/mysqld.sock
  • 使用 root 用户连接
  • 通过 Unix Socket 连接 MySQL(适用于官方 MySQL Docker 镜像)
  • 避免 TCP 连接带来的端口问题

4. 获取并过滤数据库列表

bash 复制代码
SHOW DATABASES;

配合 grep -v 过滤系统数据库:

  • information_schema
  • mysql
  • performance_schema
  • sys

最终只保留业务数据库。


5. 循环导出数据库

bash 复制代码
while read db; do
  mysqldump --databases "$db" > "/tmp/$db.sql"
done

特点:

  • 每个数据库生成一个独立的 SQL 文件
  • 文件命名规则:数据库名.sql
  • 便于单库恢复与管理

四、导出结果说明

导出完成后:

  • SQL 文件位于容器内:

    text 复制代码
    /tmp/*.sql

如需拷贝到宿主机,可使用:

bash 复制代码
docker cp mysql-container:/tmp/dbname.sql .

或批量拷贝整个目录。


五、适用场景

✔ MySQL Docker 容器备份

✔ 数据迁移前批量导出

✔ CI / 自动化备份脚本

✔ 测试环境数据库快照


六、注意事项

  • ❗ 不建议在生产环境明文写密码(可改用 .my.cnf
  • ❗ 大库导出时注意磁盘空间
  • ❗ 可根据需要添加 --single-transaction 以减少锁表

七、总结

通过一条 docker exec 命令,我们实现了:

  • 在容器内动态生成脚本
  • 自动过滤系统数据库
  • 批量导出所有业务库
  • 无需手动进入容器操作
相关推荐
海山数据库5 分钟前
移动云大云海山数据库(He3DB)postgresql_anonymizer插件原理介绍与安装
数据库·he3db·大云海山数据库·移动云数据库
云飞云共享云桌面9 分钟前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
2501_9279935317 分钟前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
星火s漫天18 分钟前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
xcLeigh23 分钟前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特24 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
xu_yule25 分钟前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
一灰灰blog42 分钟前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
Fleshy数模1 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
Nandeska1 小时前
15、基于MySQL的组复制
数据库·mysql