方案優勢
- 近熱備:僅需短暫全局讀鎖(秒級),業務無感知
- 全引擎支持:MyISAM、InnoDB、BDB、TokuDB 等所有本地存儲引擎
- 極速備份:文件級複製,速度受限於存儲帶寬
- 極低開銷:無 SQL 解析、無網絡協議開銷
- 多介質存儲:磁帶、FTP、NFS、S3、專用備份軟件
- 秒級恢復:恢復時間 = 數據拷貝時間
- 零成本:利用 LVM 內核模塊,無商業軟件授權
前置準備:LVM 邏輯卷構建
# 1. 創建物理卷/卷組(假設 /dev/sdb 為新磁盤)
pvcreate /dev/sdb
vgcreate mysqlvg1 /dev/sdb
# 2. 創建邏輯卷(3G)
lvcreate -L 3G -n mysqllv mysqlvg1
# 3. 格式化
mkfs.ext4 /dev/mysqlvg1/mysqllv
# 4. 遷移現有數據目錄
systemctl stop mysqld
mount /dev/mysqlvg1/mysqllv /mnt
cd /var/lib/mysql
tar cf - . | tar xf - -C /mnt
umount /mnt
# 5. 重新掛載至數據目錄
rm -rf /var/lib/mysql/*
mount /dev/mysqlvg1/mysqllv /var/lib/mysql
# 6. 寫入 /etc/fstab 永久掛載
blkid /dev/mysqlvg1/mysqllv
# UUID=xxxx /var/lib/mysql ext4 defaults 0 0
# 7. 關閉 SELinux
setenforce 0
# 永久:/etc/selinux/config -> SELINUX=disabled
# 8. 啟動驗證
systemctl start mysqld
LVM 快照備份標準流程
1. 主庫:全局讀鎖 + 記錄 Binlog 位置
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS\G;
# 記錄 File、Position
2. 創建快照(瞬間完成)
lvcreate -L 1G -s -n mysql-snap /dev/mysqlvg1/mysqllv
# -s: snapshot, -n: 名稱, -L: 大小(建議 10-20% 源卷,預留寫入空間)
3. 釋放鎖(業務恢復寫入)
mysql> UNLOCK TABLES;
4. 掛載快照備份
mount /dev/mysqlvg1/mysql-snap /backup/snap
tar czf /backup/mysql-$(date +%F).tar.gz -C /backup/snap .
umount /backup/snap
5. 刪除快照(釋放空間)
lvremove -f /dev/mysqlvg1/mysql-snap
從庫同步搭建(基於快照)
- 將備份文件傳輸到從庫機器
- 解壓至數據目錄,修正權限
chown -R mysql:mysql
- 啟動從庫 MySQL
- 配置復制起點:
CHANGE MASTER TO
MASTER_HOST='192.168.100.109',
MASTER_USER='repl',
MASTER_PASSWORD='pass',
MASTER_LOG_FILE='host-bin.000006',
MASTER_LOG_POS=198;
START SLAVE;
關鍵參數調優
- 快照大小: 預估備份期間寫入量 × 1.5,防止快照溢出導致失效
- 備份時間窗: 低峰期(如 02:00-04:00)
- 並行壓縮:
tar -I pigz 多核加速
- 網絡傳輸:
rsync -avz --bwlimit=100000 限速不影響業務
避坑指南
- **XFS 文件系統需
xfs_freeze 配合**,LVM 快照前凍結文件系統
- **InnoDB 需開啟
innodb_flush_log_at_trx_commit=1** 確保崩潰一致性
- **快照不可作為長期備份存儲**,必須導出到獨立介質
- **監控快照使用率**:
lvs -o +data_percent,超 80% 告警