首页/数据/数据库速查/mysqldump 压缩与管道传输
备份与恢复56 条

mysqldump 压缩与管道传输

大库备份通常接 gzip 压缩或直接管道传到备机:省磁盘、省带宽;配合 pipefail 才能可靠捕获管道中段的失败。

数据库速查数据更新于 2026-10-13

管道式备份的定位

mysqldump 把数据导成 SQL 文本,体积通常是原库数据的两三倍甚至更多,直接落盘既占空间也占带宽。接一个压缩进程或直接管道传到备机,就能在导出过程中同步完成压缩或远程落盘,全程不产生中间明文文件。代价是管道中任何一段失败都可能被后面的命令掩盖,必须显式打开 pipefail 才能捕获。

基本信息

适用平台Linux/Unix shell;MySQL 5.7 / 8.0 的 mysqldump
压缩写法mysqldump ... | gzip > backup.sql.gz
恢复写法zcat backup.sql.gz | mysql ...
直传写法mysqldump ... | mysql -h 备机
一致性前提InnoDB 表加 --single-transaction 获得一致性快照
防护手段set -o pipefail 捕获管道任意一段的失败

典型使用场景

  • 磁盘紧张的小中型库:压缩后体积常降到原来的三分之一左右
  • 备份直接归档到对象存储或远端机器,本地不落明文文件
  • 主库导出后直连备机导入,用于临时搭测试库
  • 例行巡检前先做一份快照,用于比对前后数据变化
  • 跨环境搬数据:本地导出压缩后传到隔离网络中的实例

压缩备份与恢复

压缩备份与恢复
set -euo pipefail                     # 任一段失败立即退出
OUT=/data/backup/all_$(date +%F).sql.gz
# --single-transaction 保证 InnoDB 一致性,--source-data=2 记录位点
mysqldump -uroot -p --single-transaction --source-data=2 --all-databases \
  | gzip -6 > "$OUT"
ls -lh "$OUT"                          # 看体积是否在预期范围
zcat "$OUT" | head -20                 # 确认开头是可读的 SQL 文本
zcat "$OUT" | mysql -uroot -p          # 恢复(先在建好的测试实例上验证)

压缩工具对照

工具特点适用场景
gzip单线程,兼容性最好通用备份,CPU 余量充足
pigzgzip 的多线程实现,参数基本兼容多核机器上压缩大库提速
zstd压缩比与解压速度更好长期归档、需要快速恢复
lz4压缩速度极快、比值较低备份窗口紧张时优先考虑
默认 shell 下管道只有最后一条命令的退出码有意义:gzip 因磁盘写满失败时,整条命令仍可能返回 0,备份静默损坏。任何管道式备份都要加 set -o pipefail。
恢复前先确认源文件完整(结尾应有 Dump completed 行)并验证压缩包可解:zcat 报错即说明文件被截断,此时导入只会得到半截数据。

易错点

  • 不启用 pipefail:mysqldump 或 gzip 中途失败被掩盖,告警显示「备份成功」而文件是坏的
  • 备份盘写满导致的截断文件被保留:直到恢复当天才发现无法导入,务必加磁盘余量告警与产物校验
  • gzip 与备份争抢同一台机器的 CPU:备份期间业务延迟明显上升,改用 -1 级别或 pigz 限核、zstd 更低级别
  • 跨网络管道直传中途断链:目标库被导入一半,留下状态不明的半成品,恢复类操作前先确认源文件与目标状态

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌