前置需求
- 資料目錄掛載在 LVM 邏輯卷 (如
/dev/mysqlvg/mysqllv 掛載 /var/lib/mysql)
- 卷組保留足夠空間建立快照 (建議 10-20% 資料量)
- 安裝
lvm2 套件
前期準備:遷移資料目錄至 LVM
# 1. 建立邏輯卷
lvcreate -L 50G -n mysqllv mysqlvg
mkfs.ext4 /dev/mysqlvg/mysqllv
# 2. 停止 MySQL
systemctl stop mysqld
# 3. 掛載臨時目錄同步資料
mount /dev/mysqlvg/mysqllv /mnt
cd /var/lib/mysql
tar cf - . | tar xf - -C /mnt # 保留權限/屬性
# 4. 切換掛載點
umount /mnt
rm -rf /var/lib/mysql/*
mount /dev/mysqlvg/mysqllv /var/lib/mysql
# 5. 永久掛載 (取得 UUID)
blkid /dev/mysqlvg/mysqllv
echo "UUID=xxxx /var/lib/mysql ext4 defaults 0 0" >> /etc/fstab
# 6. 關閉 SELinux (或設定正確 context)
setenforce 0
# 7. 啟動驗證
systemctl start mysqld
LVM 快照備份標準流程
# 1. 全域鎖表 (極短暫)
mysql> FLUSH TABLES WITH READ LOCK;
# 2. 記錄 Binlog 位置 (主從同步用)
mysql> SHOW MASTER STATUS\G;
# 記下 File 和 Position
# 3. 建立快照 (秒級,僅元資料)
lvcreate -L 5G -s -n mysql_snap /dev/mysqlvg/mysqllv
# 4. 解鎖 (業務恢復正常)
mysql> UNLOCK TABLES;
# 5. 掛載快照備份
mount /dev/mysqlvg/mysql_snap /backup/snap
tar czf /backup/mysql_$(date +%F).tar.gz -C /backup/snap .
# 6. 卸載並移除快照 (釋放空間)
umount /backup/snap
lvremove -f /dev/mysqlvg/mysql_snap
主從同步整合 (從庫初始化)
- 將備份檔傳輸至從庫,解壓至資料目錄
- 啟動從庫 MySQL
- 配置同步起點:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='secret',
MASTER_LOG_FILE='mysql-bin.000123',
MASTER_LOG_POS=456789;
START SLAVE; 驗證 Seconds_Behind_Master = 0
關鍵優勢總結
| 指標 | LVM 快照 | mysqldump | XtraBackup |
| 鎖表時間 | 秒級 (建立快照) | 整個備份期間 | 秒級 (FLUSH TABLES WITH READ LOCK) |
| 備份速度 | 受限於磁碟複製速度 | 慢 (SQL 解析) | 快 (實體複製) |
| 還原速度 | 極快 (掛載/複製) | 慢 (SQL 重放) | 快 |
| 一致性 | 崩潰一致性 | 邏輯一致性 | 崩潰一致性 |
| 工具依賴 | OS 原生 | MySQL 內建 | Percona 額外安裝 |
注意事項
- 快照大小需 ≥ 備份期間寫入量,否則快照失效
- InnoDB 需
innodb_flush_log_at_trx_commit=1、sync_binlog=1 確保持久性
- 生產環境建議搭配
xtrabackup --slave-info 更完善