地娃 發表於 2025-12-23 09:04:23

使用Docker实现MySQL容器中批量导出所有数据库

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、整体思路</a></li><li><a href="#_label1">二、完整命令示例</a></li><li><a href="#_label2">三、关键部分详解</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">1. docker exec 执行容器内命令</a></li><li><a href="#_lab2_2_1">2. 使用 Here Document 生成脚本</a></li><li><a href="#_lab2_2_2">3. MySQL 认证方式</a></li><li><a href="#_lab2_2_3">4. 获取并过滤数据库列表</a></li><li><a href="#_lab2_2_4">5. 循环导出数据库</a></li></ul><li><a href="#_label3">四、导出结果说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">五、适用场景</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">七、总结</a></li><ul class="second_class_ul"></ul></ul></div><p>在使用 Docker 部署 MySQL 的场景中,经常会遇到这样的需求:<strong>一次性导出容器内除系统库以外的所有数据库</strong>,并分别生成 <code>.sql</code> 文件,用于备份或迁移。</p>
<p>本文介绍一种<strong>无需进入交互式容器</strong>、通过一条 <code>docker exec</code> 命令,在容器内生成并执行导出脚本的实现方式。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、整体思路</h2>
<p>实现流程如下:</p>
<ul><li>通过 <code>docker exec</code> 在 MySQL 容器中执行 Bash</li><li>动态创建一个数据库导出脚本 <code>export_dbs.sh</code></li><li>使用 <code>mysql</code> 命令获取所有数据库列表</li><li>过滤掉系统数据库</li><li>循环调用 <code>mysqldump</code>,将每个数据库导出为独立的 <code>.sql</code> 文件</li><li>将导出文件保存到容器内 <code>/tmp</code> 目录</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、完整命令示例</h2>
<div class="jb51code"><pre class="brush:bash;">docker exec -it mysql-container bash -c "cat &lt;&lt; 'EOF' &gt; /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\" &gt; \"/tmp/\$db.sql\"
done

echo \"Export completed.\"
EOF

chmod +x /tmp/export_dbs.sh
/tmp/export_dbs.sh"
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、关键部分详解</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>1. docker exec 执行容器内命令</h3>
<div class="jb51code"><pre class="brush:bash;">docker exec -it mysql-container bash -c "..."
</pre></div>
<ul><li><code>mysql-container</code>:MySQL 容器名称</li><li><code>bash -c</code>:在容器中执行一段 Bash 命令</li><li><code>-it</code>:支持交互与终端输出</li></ul>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>2. 使用 Here Document 生成脚本</h3>
<div class="jb51code"><pre class="brush:bash;">cat &lt;&lt; 'EOF' &gt; /tmp/export_dbs.sh
</pre></div>
<ul><li>使用 <strong>Here Document</strong> 写入多行脚本</li><li><code>&#39;EOF&#39;</code> 使用单引号可避免变量在宿主机侧被提前展开</li><li>脚本被写入容器内 <code>/tmp/export_dbs.sh</code></li></ul>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>3. MySQL 认证方式</h3>
<div class="jb51code"><pre class="brush:bash;">PASSWORD="root"
mysql -uroot -p${PASSWORD} --socket=/var/run/mysqld/mysqld.sock
</pre></div>
<ul><li>使用 root 用户连接</li><li>通过 <strong>Unix Socket</strong> 连接 MySQL(适用于官方 MySQL Docker 镜像)</li><li>避免 TCP 连接带来的端口问题</li></ul>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>4. 获取并过滤数据库列表</h3>
<div class="jb51code"><pre class="brush:bash;">SHOW DATABASES;
</pre></div>
<p>配合 <code>grep -v</code> 过滤系统数据库:</p>
<ul><li><code>information_schema</code></li><li><code>mysql</code></li><li><code>performance_schema</code></li><li><code>sys</code></li></ul>
<p>最终只保留业务数据库。</p>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>5. 循环导出数据库</h3>
<div class="jb51code"><pre class="brush:bash;">while read db; do
mysqldump --databases "$db" &gt; "/tmp/$db.sql"
done
</pre></div>
<p>特点:</p>
<ul><li>每个数据库生成一个独立的 SQL 文件</li><li>文件命名规则:<code>数据库名.sql</code></li><li>便于单库恢复与管理</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>四、导出结果说明</h2>
<p>导出完成后:</p>
<p>SQL 文件位于容器内:</p>
<div class="jb51code"><pre class="brush:bash;">/tmp/*.sql
</pre></div>
<p>如需拷贝到宿主机,可使用:</p>
<div class="jb51code"><pre class="brush:bash;">docker cp mysql-container:/tmp/dbname.sql .
</pre></div>
<p>或批量拷贝整个目录。</p>
<p class="maodian"><a name="_label4"></a></p><h2>五、适用场景</h2>
<p>MySQL Docker 容器备份</p>
<p>数据迁移前批量导出</p>
<p>CI / 自动化备份脚本</p>
<p>测试环境数据库快照</p>
<p class="maodian"><a name="_label5"></a></p><h2>六、注意事项</h2>
<p>不建议在生产环境明文写密码(可改用 <code>.my.cnf</code>)</p>
<p>大库导出时注意磁盘空间</p>
<p>可根据需要添加 <code>--single-transaction</code> 以减少锁表</p>
<p class="maodian"><a name="_label6"></a></p><h2>七、总结</h2>
<p>通过一条 <code>docker exec</code> 命令,我们实现了:</p>
<ul><li>在容器内动态生成脚本</li><li>自动过滤系统数据库</li><li>批量导出所有业务库</li><li>无需手动进入容器操作</li></ul>
<p>到此这篇关于使用Docker实现MySQL容器中批量导出所有数据库的文章就介绍到这了,更多相关Docker MySQL导出数据库内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: 使用Docker实现MySQL容器中批量导出所有数据库