这个坑值得记一笔。CentOS 7 上给 MySQL 做一致性备份,用 lvcreate -s -L 20G 建快照,mysqldump 跑到一半报 Input/output error,lvs 里快照状态变成 Invalid。
刚开始盯着「快照大小按源卷比例估算,没考虑高峰时段的写入量」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。快照按写时复制记录原卷变更,源卷写得越多,快照区消耗越快;源卷上有大事务持续写入,二十分钟就把二十 G 的快照空间填满;备份脚本没有先 flush 再锁表,备份期间写入量远超预期。
动手时先看快照使用率和状态
lvs -a -o lv_name,lv_size,data_percent,lv_attr
再往下按峰值写入量给快照留足空间
lvcreate -s -L 80G -n db_snap /dev/vg0/lv_mysql
接着备份前锁表并刷盘,缩短写入窗口
mysql -e 'FLUSH TABLES WITH READ LOCK; SYSTEM sync;'
末了备份结束后立即释放快照
lvremove -f /dev/vg0/db_snap
别只看报错消失,验证要多做一步。lvs 里快照的 data_percent 在备份全程不超过七成,备份文件末尾没有 I/O 错误且恢复演练能正常启动实例。
这里还有个坑。快照空间一旦写满就作废,不会自动扩容;宁可多留一倍,备份时间窗依然要压短,快照不是备份的替代品。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。