必须用xbstream而非tar,因tar流不支持并发写入和部分校验,且xtrabackup在--stream=tar模式下会忽略--compress参数,导致压缩失效或报错;xbstream专为XtraBackup设计,支持内嵌zstd压缩及后续解压、prepare全流程。

流式压缩备份能绕过本地磁盘瓶颈,但必须用 xbstream 格式,tar 格式不支持原生压缩流。
为什么不能直接用 --stream=tar --compress?
MySQL 8.0 的 xtrabackup 在 --stream=tar 模式下不支持内置压缩参数(--compress 会被忽略),强行加会报错或生成未压缩的 tar 流。这是工具底层实现限制,不是配置问题。
-
--stream=tar只做归档,不处理压缩逻辑;想压缩得靠管道接gzip/zstd,但这样无法被xtrabackup --decompress识别 -
--stream=xbstream是专为流式设计的格式,支持--compress直接嵌入压缩逻辑,且后续可用xbstream -x+xtrabackup --decompress分步解压 - 如果你看到文档里写
innobackupex --stream=tar | gzip,注意那是旧版innobackupex(已弃用),MySQL 8.0 必须用xtrabackup命令
正确命令:xbstream + zstd 压缩流备份到本地
以下命令将全量备份直接以压缩流形式写入文件,不占用中间磁盘空间:
xtrabackup \ --defaults-file=/etc/my.cnf \ --backup \ --stream=xbstream \ --compress \ --compress=zstd \ --compress-threads=4 \ --target-dir=/tmp/unused \ > /data/backup/full_$(date +%Y%m%d).xbstream
-
--target-dir=/tmp/unused是必需占位符,即使不用它存文件也得指定一个路径(不能为空或省略) -
--compress=zstd比默认lz4压缩率更高,CPU 开销略大但更省空间;若要更快可换--compress=lz4 -
--compress-threads=4建议设为 CPU 逻辑核数的 10%~20%,太高反而因线程竞争拖慢整体流速 - 输出文件
.xbstream是二进制流,不可直接ls -l判断是否有效,需用xbstream -I检查头信息
备份到远程服务器并自动解压还原
流式最大价值在于跳过本地落盘,直传目标机并解压 —— 这要求远端已安装 xbstream 和对应压缩工具(如 zstd):
xtrabackup \
--defaults-file=/etc/my.cnf \
--backup \
--stream=xbstream \
--compress=zstd \
--compress-threads=2 \
--target-dir=/tmp/dummy \
| ssh backup@192.168.1.100 \
"mkdir -p /data/backup/stream && \
xbstream -x -C /data/backup/stream && \
xtrabackup --decompress --target-dir=/data/backup/stream && \
xtrabackup --prepare --target-dir=/data/backup/stream"
- 远端命令必须串行执行:
xbstream -x解包 →xtrabackup --decompress解压 qp 文件 →--prepare应用日志 - 如果远端没装
zstd,解压会卡在*\.zst文件上,报错类似qpress: command not found或unknown compression algorithm -
ssh连接中断会导致整个流水线失败,建议加timeout或用mbuffer缓冲防抖动
恢复时最容易漏掉的一步:先解包再解压
.xbstream 文件不是压缩包,是流式容器。很多人直接 xtrabackup --decompress 报错,是因为跳过了 xbstream -x:
- 错误做法:
xtrabackup --decompress --target-dir=full.xbstream→ 报错not a valid backup directory - 正确顺序:
mkdir full_restore && xbstream -x < full_20260928.xbstream -C full_restore && xtrabackup --decompress --target-dir=full_restore - MySQL 8.0.30+ 支持
--decompress自动识别xbstream容器,但前提是目录里已有解包后的文件结构,不能直接喂流文件


















