LVM快照基于写时复制机制实现毫秒级一致性备份,需满足逻辑卷管理、预留足够空间、同卷组内创建三大前提,创建后应只读挂载并配合应用冻结保障一致性,且须及时卸载删除。

不能对超大规模高频交易库直接用 LVM 快照实现“在线快照”——除非你已满足三个硬性前提:MySQL datadir 必须在 LVM 逻辑卷上、文件系统是 xfs 或 ext4、且 InnoDB 脏页与日志已强制刷盘。跳过任一条件,快照即不可恢复。
确认 MySQL 数据目录是否托管在 LVM 卷上
这是所有操作的起点,不是可选项。很多高频交易库仍部署在 /dev/sda2 这类裸分区上,lvcreate --snapshot 会直接报错退出。
执行以下两条命令交叉验证:
-
lsblk | grep -A5 "$(df -P /var/lib/mysql | tail -1 | awk '{print $1}')"—— 看 TYPE 列是否为lvm -
df -hT /var/lib/mysql | grep -E "(xfs|ext4)"—— 确保文件系统类型兼容
若不满足,需停 MySQL、rsync -aHAX --delete 迁移数据、重建 LV、更新 /etc/fstab 和 my.cnf 中的 datadir —— 这一步本身就要停机 10 分钟以上,根本谈不上“在线”。
FLUSH + lvcreate 必须在单一会话内原子执行
高频交易库常见错误是把 FLUSH TABLES WITH READ LOCK 和 lvcreate 拆成两个终端操作,导致 InnoDB 脏页未刷、redo 日志未落盘、binlog 位点漂移,恢复时必报 InnoDB: Database page corruption。
正确顺序(同一 MySQL 客户端会话中):
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
FLUSH TABLES WITH READ LOCK;-
FLUSH LOGS;(滚动 binlog,确保后续位点干净) -
FLUSH ENGINE LOGS;(强制 InnoDB 刷ib_logfile*到磁盘) -
SHOW MASTER STATUS;(记录File和Position,用于后续时间点恢复) -
lvcreate -L 10G -s -n mysql_snap_$(date +%s) /dev/vg0/mysql_data(必须紧接上一步之后) -
UNLOCK TABLES;(立即执行;锁持有时间应 ≤2 秒;若超 5 秒,查SHOW PROCESSLIST并 kill 长事务)
xfs 与 ext4 挂载快照卷前的关键差异处理
快照创建成功 ≠ 能直接挂载。xfs 会因元数据不一致拒绝挂载,ext4 则常因 UUID 冲突报 wrong fs type 或 bad superblock。
挂载前必做检查与操作:
- 先运行
lvs -o +attr,origin /dev/vg0/mysql_snap,确认 Attr 列第 5 位是s(snapshot),不是S(suspended);若是S,执行lvchange -ay /dev/vg0/mysql_snap - 若原卷是
xfs:xfs_repair -o force_geometry /dev/vg0/mysql_snap(该操作只修快照卷元数据,不影响原卷) - 若原卷是
ext4:可跳过 repair,但挂载时必须加-o ro,nouuid,否则可能因 UUID 冲突失败 - 统一挂载命令:
mount -o ro,nouuid /dev/vg0/mysql_snap /mnt/snap
快照本身不等于备份,rsync 才是耗时关键
LVM 快照创建确实是秒级,但真正决定“能否在线”的,是你后续怎么用它。快照只是 COW 元数据索引,实际数据块仍指向原 LV;一旦开始 rsync,IO 压力和网络带宽就成了瓶颈,尤其对百 GB 级高频库。
推荐做法:
- 不要
cp -r /mnt/snap,改用rsync -a --delete --exclude='ib_logfile*' --exclude='mysql-bin.*' /mnt/snap/ /backup/ - 若需远程备份,直接
rsync -az --delete /mnt/snap/ user@backup-server:/backup/mysql_$(date +%s)/,避免本地中转 - 快照保留时间不宜超过 2 小时;长期存档必须靠 rsync 后的独立副本,否则快照空间耗尽会导致整个快照失效
最容易被忽略的一点:binlog 必须和数据快照严格对齐。仅靠 SHOW MASTER STATUS 不够,高频交易场景下建议额外记录 SELECT @@global.gtid_executed;(若启用 GTID),否则时间点恢复可能跳过部分事务。










