首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 利用 LVM 快照實現近熱備份與恢復實戰 MySQL 利用 LVM 快照實現近熱備份與恢復實戰

     編輯:MySQL 資料庫相關知識

LVM 快照可在**極短鎖表時間**內獲得資料檔一致性視圖,結合二進制日誌實現「近熱備份」。本文在單機環境完整演示:建立 LVM、遷移資料目錄、鎖表→快照→解鎖→備份→模擬故障→全量+增量恢復全流程。

環境準備

  • 新建 LVM 邏輯卷 mydatalv (VG: mydata) 掛載於 /data,容量 1G。
  • 將原 /var/lib/mysql 複製至 /data/mysql。
  • 修改 /etc/my.cnf:datadir=/data/mysql、log_bin=/var/lib/mysql/mysql-bin(binlog 置於非 LVM 盤)。
  • 重啟服務驗證資料目錄已遷移。
lvs
df -h
cp -a /var/lib/mysql /data/
vim /etc/my.cnf
systemctl restart mariadb
ls /data/mysql  # 確認檔案存在

建立一致性快照(核心步驟)

  1. 全局鎖表 + 刷新日誌 + 記錄 binlog 座標:
mysql -e 'FLUSH TABLES WITH READ LOCK;'
mysql -e 'FLUSH LOGS;'
mysql -e 'SHOW MASTER STATUS;' > /root/back.$(date +%F+%T)
cat /root/back.2016-07-13+10:14:29
# 輸出:mysql-bin.000014  245
  1. 建立 LVM 快照卷(唯讀、保留原卷 1G 空間):
lvcreate -L 1G -n mysqlback -p r -s /dev/mydata/mydatalv
  1. 立即解鎖(鎖表時間通常 < 1 秒):
mysql -e 'UNLOCK TABLES;'

掛載快照並複製備份

mkdir /myback
mount -r /dev/mydata/mysqlback /mnt
cp -a /mnt/mysql /myback/
umount /mnt
lvremove -f /dev/mydata/mysqlback  # 釋放快照空間

模擬災難與恢復演練

  1. 寫入新資料:INSERT INTO classes VALUES ('xxoo',39);
  2. 刪除資料目錄:rm -rf /data/*
  3. 修改配置將 datadir、log_bin 皆指向 /data/mysql(恢復環境單盤)。
  4. 複製備份檔回 /data:cp -a /myback/* /data/
  5. 重啟服務:systemctl restart mariadb
  6. 應用增量 binlog(從快照記錄的 POS 245 開始):
mysqlbinlog --start-position=245 /var/lib/mysql/mysql-bin.000014 > /root/binlog.sql
mysql < /root/binlog.sql

驗證恢復完整性

mysql -e "USE hellodb; SELECT * FROM classes;"
# 輸出應包含 xxoo (ClassID=9),證明增量日誌成功回放

關鍵優勢與注意事項

優勢說明
鎖表時間極短僅執行 FLUSH TABLES WITH READ LOCK + FLUSH LOGS + lvcreate,通常 < 1 秒,業務幾乎無感知
檔案系統級一致性快照捕捉整個資料目錄瞬間狀態,含 .ibd、.frm、binlog.index 等所有檔案
不依賴引擎特性適用 MyISAM/InnoDB/其他引擎混合場景
  • 前置條件:資料目錄必須在 LVM 邏輯卷上;binlog 建議置於非同卷,避免快照包含正在寫入的 binlog 導致恢復時需額外處理。
  • 快照空間:預留足夠 COW (Copy-on-Write) 空間,長時間備份或高寫入量場景需增大 -L 參數。
  • 檔案系統支援:ext4/xfs 均支援 LVM 快照,掛載時加 -r (ro) 保護備份檔不被誤改。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved