XtraBackup流式备份必须用xbstream协议传输,因其二进制结构含LSN、校验等关键元数据,直接套用mysqldump管道或SSH隧道会破坏帧头导致解包失败;压缩须在shell管道中用pigz/gzip完成,禁用--compress参数以保流式特性。

为什么不能直接用 mysqldump 或裸 ssh 管道传 XtraBackup 流?
因为 XtraBackup 的流式输出(--stream=xbstream)是二进制结构化数据,不是纯文本;它包含页校验、LSN 元数据、redo 截断点等关键信息。直接套用 mysqldump 那套“管道 + gzip”逻辑会丢 checksum 或破坏 xbstream header,导致后续 xbstream -x 解包失败或 xtrabackup --prepare 报 Failed to open file 'xtrabackup_checkpoints'。必须让压缩发生在流生成之后、传输链路之中,且不干扰 xbstream 协议帧。
ssh 隧道在 XtraBackup 远程流备份中根本不需要
这是最容易被误导的点:XtraBackup 本身不依赖 MySQL 网络端口连通性——它直读本地磁盘文件。所谓“远程备份”,本质是把本地生成的流通过 ssh 标准输入/输出转发到远端机器,和 MySQL 是否监听 3306、是否开放 bind-address 完全无关。强行加 SSH 隧道反而多一层故障点(比如隧道中断、端口冲突),还可能因 ExitOnForwardFailure=yes 没配好导致脚本静默卡住。
- 正确做法是:在数据库服务器上执行
innobackupex或xtrabackup,输出流到 stdout,再用ssh user@remote-host "command"接收 - 远程机器只需有写权限的目标目录,无需运行 MySQL、无需开放任何数据库端口
- 若远程机器无法直连(如在私有网络),应在跳板机上做
ssh -J代理,而非在本地建隧道映射 MySQL 端口
压缩必须用 gzip / pigz 管道,禁用 --compress
--compress 是 XtraBackup 内置的 quicklz 压缩,它只作用于备份目录内文件,与流模式互斥——一旦启用,--stream 自动失效,备份先落盘再压缩,彻底失去“零本地磁盘占用”优势。真正安全的压缩只能在 shell 管道里完成:
- 单核压缩:
xtrabackup --backup --stream=xbstream /data/mysql/ | gzip > backup.xbstream.gz - 多核并行(推荐):
xtrabackup --backup --stream=xbstream /data/mysql/ | pigz -p 4 > backup.xbstream.gz - 远程直传+压缩:
xtrabackup --backup --stream=xbstream /data/mysql/ | ssh user@192.168.1.100 "pigz -p 4 > /backup/full_$(date +\%Y\%m\%d).xbstream.gz"
注意:pigz 必须在远程机器上安装,否则 ssh 进程会因找不到命令退出,整个管道中断。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
远程接收端必须提前建目录,且 xbstream -x 要带 -C
流传输过去的是原始 xbstream 数据,不是 tar 包,不能用 tar -x 解。远程机器收到后要立即解包还原为可 prepare 的物理文件结构:
- 先确保目标路径存在:
ssh user@192.168.1.100 "mkdir -p /backup/recover/$(date +\%Y\%m\%d)" - 解包命令必须指定根目录:
ssh user@192.168.1.100 "xbstream -x -C /backup/recover/$(date +\%Y\%m\%d) - 如果用了
pigz压缩,得先解压再解包:ssh user@192.168.1.100 "pigz -d -c /backup/full_$(date +\%Y\%m\%d).xbstream.gz | xbstream -x -C /backup/recover/$(date +\%Y\%m\%d)"
漏掉 -C 会导致文件解到当前工作目录,而不是你预期的备份目录,后续 --prepare 会找不到 xtrabackup_checkpoints。
最常被忽略的是:xbstream 流没有内置校验机制,网络传输出错时不会报错,只会静默损坏。生产环境务必在传输完成后,用 ssh 远程执行 xbstream -I 检查头完整性,或在本地保留一份 sha256sum 校验值比对。










