lvm快照是基于写时复制(cow)的轻量级时间点视图,创建时不复制数据,仅分配元数据和cow缓存空间;原lv写入时先保存旧块至快照区,故空间需预估变更量,备份后须及时清理。

用 lvcreate -s 创建的不是“物理块级克隆副本卷”,而是基于写时复制(Copy-on-Write, COW)机制的**快照(snapshot)**,它本身不复制全部数据块,而是在原始逻辑卷(LV)发生变更时,按需保存被覆盖前的旧块。因此它属于轻量级、空间高效的只读(或可读写)时间点视图,不是全量物理克隆。
快照的本质与适用场景
快照不是独立副本,而是依赖原LV存在的元数据结构:
- 创建瞬间不复制数据,仅分配元数据和COW缓存空间(由
-L指定) - 原LV写入某块时,该块内容先被拷贝到快照空间,再允许新写入——所以快照大小必须能容纳备份窗口内所有变更量
- 默认为只读;如需可写(用于测试/克隆),需加
--permission rw - 不能脱离原LV单独导出或挂载到其他主机——不是便携式物理镜像
为数据库LV创建可用快照的关键步骤
假设数据库运行在 LV /dev/vg_db/data_lv,目标是获得一个可用于热备份的快照:
-
确保原LV已停写或进入一致状态:对 MySQL/PostgreSQL 等,执行
FLUSH TABLES WITH READ LOCK或使用pg_start_backup();对 Oracle 可用BEGIN BACKUP。这是保证快照语义一致的前提 -
预留足够快照空间:根据数据库写入强度预估变更量。例如高负载下1小时可能写入2GB,则快照至少分配3GB:
lvcreate -s -L 3G -n data_snap vg_db/data_lv -
立即挂载并验证:
mkdir /mnt/db_snap<br>mount /dev/vg_db/data_snap /mnt/db_snap
确认文件系统可读、关键目录(如data/)结构完整 -
解除数据库锁(如适用),然后启动备份流程(如
tar -cf /backup/db_$(date +%F).tar /mnt/db_snap)
若真需物理块级克隆副本(非快照)
要获得完全独立、可迁移、不依赖原LV的副本,应使用 dd 或 lvconvert --mirror,而非 -s:
-
用 dd 克隆(离线更安全):
dd if=/dev/vg_db/data_lv of=/dev/vg_backup/clone_lv bs=4M status=progress
注意:需确保目标LV容量 ≥ 源LV已用空间,且操作期间数据库停止写入 -
用 LVM 镜像(在线,但开销大):
lvconvert --mirror -m 1 /dev/vg_db/data_lv /dev/sdc1
完成后拆分镜像:lvconvert --splitmirrors 1 --name clone_lv /dev/vg_db/data_lv
得到一个与原LV内容一致、完全独立的新LV
快照清理与风险提示
快照不是长期存储方案:
- 快照空间耗尽会导致原LV I/O 错误甚至只读锁定,务必监控:
lvs -o +snap_percent - 备份完成后及时卸载并删除:
umount /mnt/db_snap<br>lvremove /dev/vg_db/data_snap
- 不要将快照用于替代传统备份——它无法防范误删、逻辑损坏或存储设备故障











