如何经SSH跳板机简便导出目标服务器MySQL dump
跨跳板机最简MySQL压缩导出方案
核心思路是利用SSH原生跳转能力做流式管道传输,全程不在跳板机、目标服务器落地临时文件,压缩操作在源数据库服务器完成,压缩后的数据直接通过隧道传到本地,完全规避多步中转、重复拷贝、临时文件清理的冗余操作,且完全匹配所有约束条件。
单命令直出方案(推荐)
你只需要在本地计算机执行单条命令即可完成全流程,不需要分步登录任何中转节点:
ssh -J <跳板机账号>@<跳板机IP> <目标服务器账号>@<目标数据库服务器IP> "mysqldump -u<数据库账号> -p<数据库密码> <待导出库名> | gzip -9" > <本地保存路径>/db_dump.sql.gz
命令逻辑说明
-J是SSH 7.3及以上版本原生支持的ProxyJump参数,会自动通过跳板机建立到目标服务器的加密隧道,跳板机仅做加密流量转发,不会读写传输内容,不需要跳板机安装任何MySQL组件、压缩工具,也不需要你在跳板机做任何配置/安装操作,完全符合跳板机的权限限制。- 引号内的操作全部在目标数据库服务器上执行:
mysqldump生成的转储数据流不落地写文件,直接通过管道传给gzip做最高等级压缩,300-450MB的原始dump文件压缩后通常为30-60MB,完全满足低带宽下必须压缩传输的要求。 - 压缩后的数据流全程通过SSH隧道流式传输到本地,直接写入本地磁盘的压缩包文件,目标服务器、跳板机上都不会生成任何临时中转文件,省掉两次scp拷贝、多节点清理临时文件的步骤。
低版本SSH兼容写法
如果你的本地SSH版本低于7.3(不支持-J参数),可以用ProxyCommand实现完全一致的效果:
ssh -o ProxyCommand="ssh <跳板机账号>@<跳板机IP> -W %h:%p" <目标服务器账号>@<目标数据库服务器IP> "mysqldump -u<数据库账号> -p <待导出库名> | gzip -9" > <本地保存路径>/db_dump.sql.gz
把-p后面的数据库密码去掉后,执行命令时会交互式提示你输入数据库密码,避免密码留存在命令行历史中。
按需调整的变体方案
- 需要本地直接拿到未压缩SQL文件:传输过程依然保持压缩不占额外带宽,本地落地时自动解压:
ssh -J <跳板机账号>@<跳板机IP> <目标服务器账号>@<目标数据库服务器IP> "mysqldump -u<数据库账号> -p <待导出库名> | gzip -9" | gunzip > <本地保存路径>/db_dump.sql - 目标服务器无gzip:替换为目标服务器自带的其他压缩工具即可,比如用压缩率更高的xz就把管道段改成
| xz -T0,本地保存文件后缀对应改成.xz即可。 - 导出全库/多库:给mysqldump加对应参数即可,比如导出全库用
--all-databases,导出多库用--databases 库1 库2,管道压缩逻辑不受影响。
低带宽场景注意事项
- 不需要额外开启SSH自带的
-C压缩参数:我们已经在源端做了高压缩率的gzip压缩,对已压缩的流量再开SSH压缩只会额外消耗两端CPU,不会再降低传输体积。 - 导出完成后可以在本地执行
gunzip -t <压缩包路径>校验压缩包完整性,避免链路闪断导致文件损坏。
对比原来的7步操作,这个方案全程只需要你在本地执行1条命令,等待传输完成即可,没有任何冗余的手动操作。
内容的提问来源于stack exchange,提问作者Hevyweb
相关产品推荐
相关产品推荐

