mysql快照备份需严格按序执行flush tables with read lock、flush logs、flush engine logs、show master status后立即创建lvm快照并快速解锁,缺一不可;挂载前须依文件系统类型执行xfs_repair或加nouuid参数;备份实质耗时在数据拷贝而非快照创建。

lvcreate -s 本身是秒级的,但“秒级备份”不等于“秒级完成整个流程”。真正卡住你的,从来不是快照命令,而是 MySQL 一致性准备、文件系统挂载、以及后续数据拷贝这三步。
MySQL 必须先做三件事,顺序不能错
很多人卡在恢复时报 InnoDB: Database page corruption,根本原因是只执行了 FLUSH TABLES WITH READ LOCK,就急着跑 lvcreate。InnoDB 的脏页和 redo 日志还没落盘,快照里存的是“半成品”。
同一 MySQL 会话内必须按顺序执行:
-
FLUSH TABLES WITH READ LOCK:阻断写入,强制 MyISAM 等引擎落盘 -
FLUSH LOGS:滚动 binlog,让SHOW MASTER STATUS返回的位置干净可重放 -
FLUSH ENGINE LOGS:强制 InnoDB 把内存中所有 redo 刷进ib_logfile* -
SHOW MASTER STATUS:立刻记录File和Position,这是后续 binlog 追加的起点 - 紧接着运行
lvcreate -L 5G -s -n mysql<em>snap</em>$(date +%s) /dev/vg0/mysql_data - 立刻执行
UNLOCK TABLES—— 锁持有时间应 ≤2 秒;若超 5 秒,查SHOW PROCESSLIST干掉长事务
跳过 FLUSH ENGINE LOGS 是线上最常被忽略的致命错误。
挂载快照前,xfs 和 ext4 处理方式完全不同
快照卷创建成功 ≠ 能直接 mount。挂载失败报 wrong fs type 或看不到文件,大概率是文件系统元数据没对齐。
xfs 快照卷必须先修复:
xfs_repair -o force_geometry /dev/vg0/mysql_snap_1725394560
不加-o force_geometry会卡住或报错;修复后才能mount -o ro /dev/vg0/mysql_snap_1725394560 /mnt/snapext4 一般可直接挂载,但必须加
nouuid:mount -o ro,nouuid /dev/vg0/mysql_snap_1725394560 /mnt/snap
否则因 UUID 冲突拒绝挂载;若提示bad superblock,先确认lvs -o +attr,origin输出中 Attr 第 5 位是s(不是S),若是S,用lvchange -ay /dev/vg0/mysql_snap_1725394560激活
备份慢?别怪快照,要改 rsync/tar 策略
lvcreate -s 耗时不到 100ms;你看到的“备份慢”,其实是把几百 GB 数据从 /mnt/snap 拷出去的过程。
- 别用
cp -r:不跳过 socket/pipe,且无增量判断 - 优先用:
rsync -a --numeric-ids --delete-after --exclude='mysql.sock' --exclude='aria_log_control' /mnt/snap/ /backup/ - 若目标是远程服务器,避免中间落盘:
tar -cf - -C /mnt/snap . | ssh backup@192.168.1.100 "gzip -c > /backup/mysql_$(date +%s).tar.gz" - 快照存活时间别超 24 小时:原卷每写一次块,快照 COW 区就多存一份旧数据;写越频繁,空间涨越快,甚至触发快照失效
快照本身不保存 binlog,也不包含未刷盘的 redo;它只保证“那一刻文件系统层面的数据静态切片”。真正能恢复出一致数据库的,是快照 + SHOW MASTER STATUS 记录的 binlog 位置 + 后续重放。漏掉任意一环,所谓的“秒级备份”就是个不可用的幻觉。











