LVM簡介
邏輯卷管理器,是Linux 系統中用于管理磁盤儲存的關鍵技術。
LVM 則打破了磁盤分區一旦確定,其大小調整往往較為復雜,且難以靈活應對業務變化這種限制,它允許用戶將多個物理分區組合卷組。例如,系統中的多個物理磁盤/dev/sda,/dev/sdb可以把它們的部分空間整合起來,形成一個統一管理的卷組。
從卷組中,用戶可以進一步劃分邏輯卷。邏輯卷類似于虛擬磁盤分區,具有極高的靈活性。用戶可以根據實際需求,動態地調整邏輯卷的大小,進行格式化等操作。如構建數據庫的時候,可在卷組上創建邏輯卷來專門存儲MYSQL數據庫的數據文件,為數據庫的高效運行提供高效運行提供有力的支持。
二、LVM 快照概念
LVM 快照是對現有邏輯卷(源邏輯卷)在某一特定時刻的 “瞬間影像”。它本質上是一個特殊的邏輯卷,初始時幾乎不占用額外存儲空間(僅記錄少量元數據),并且與源邏輯卷共享數據塊。
當源邏輯卷中的數據發生變化時,LVM 會將原始數據塊的內容復制到快照區域(前提是這些數據塊此前未被復制過)。通過這種機制,快照始終能夠反映出創建它時源邏輯卷的數據狀態。例如,對于一個持續運行的文件系統,在創建快照后,即便文件系統中的數據不斷更新、刪除或新增,快照中的數據依然保持創建時刻的狀態,為數據備份和恢復提供了穩定的副本。
三、LVM 快照備份過程
(一)拍攝快照
使用 lvcreate
命令來創建快照。假設我們有一個名為 vg_mysql
的卷組,其中包含用于存儲 MySQL 數據的邏輯卷 lv_mysql
,現在要創建一個名為 lv_mysql_snapshot
、大小為 1GB 的快照,執行以下命令:
lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql
參數解釋:
-
-n
:用于指定快照的名稱,這里為lv_mysql_snapshot
。 -
-L
:指定快照的大小,設置為 1GB。需注意,快照大小應根據源邏輯卷的數據變化頻率和數據量合理估算,以確保備份過程中快照空間充足。 -
-s
:表示創建的是快照,其后緊跟源邏輯卷的路徑/dev/vg_mysql/lv_mysql
。
(二)掛載快照
-
創建掛載點 首先,使用
mkdir
命令創建一個掛載點,例如/mnt/mysql_snapshot
:
mkdir -p /mnt/mysql_snapshot
-p
選項的作用是確保如果指定的目錄不存在,會遞歸創建該目錄及其上級目錄;若目錄已存在,則不報錯。
-
掛載快照 然后,使用
mount
命令將快照掛載到創建的掛載點上:
mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot
此時,通過訪問 /mnt/mysql_snapshot
目錄,就可以讀取到快照中的數據,為后續的備份操作做好準備。
(三)進行備份
掛載點 /mnt/mysql_snapshot
進行備份操作,可選用多種備份工具:
-
Rsync 備份
rsync
是一款強大的文件同步工具,具有高效、靈活的特點。例如,將快照中的數據備份到/backup/mysql_snapshot_$(date +%Y%m%d)
目錄(其中$(date +%Y%m%d)
會根據當前日期生成目錄名,方便區分不同日期的備份),執行以下命令:
rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/
參數解釋:
-
-a
:以歸檔模式同步,保留文件的權限、所有者、組等屬性,確保備份數據的完整性和一致性。 -
-v
:輸出詳細信息,在備份過程中可以實時查看同步進度和文件傳輸情況。 -
-z
:在傳輸過程中進行壓縮,可有效減少數據傳輸量,提高傳輸效率,尤其適用于網絡備份場景。
-
Tar 備份
tar
是常用的歸檔工具,用于將文件和目錄打包成一個歸檔文件。例如,將掛載點的內容打包成一個壓縮歸檔文件,執行以下命令:
tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot
參數解釋:
-
c
:創建新的歸檔文件。 -
z
:使用gzip
進行壓縮,以減小歸檔文件的大小,節省存儲空間。 -
f
:指定歸檔文件的名稱,這里為/backup/mysql_snapshot_$(date +%Y%m%d).tar.gz
。
(四)清理快照
備份完成后,為釋放存儲空間,需要及時清理快照:
-
卸載快照 使用
umount
命令卸載已掛載的快照:
umount /mnt/mysql_snapshot
-
刪除快照 使用
lvremove
命令刪除快照:
lvremove -f /dev/vg_mysql/lv_mysql_snapshot
-f
選項表示強制刪除,即使邏輯卷正在使用也會刪除。但需謹慎使用,以免誤刪重要數據。
四、LVM 快照備份的優點
(一)實現熱備份
對于正在運行的服務,如 MySQL 數據庫、Web 服務器等,LVM 快照備份允許在不停止服務的情況下進行備份操作。
(二)高效利用存儲空間
快照初始占用的空間相對較小,它僅記錄創建快照后數據的變化部分。
(三)數據一致性較好
由于快照能夠精確記錄創建瞬間的數據狀態,只要在備份過程中快照空間足夠,就可以保證備份數據的一致性。
LVM快照備份實驗
實驗環境
操作系統:CentOS 8 或其他使用 systemd
和 LVM
的 Linux 發行版。
MySQL 版本:MySQL 8.0
實驗步驟
-
準備 LVM 卷
-
首先,確保你已經有一個存儲 MySQL 數據的邏輯卷。如果沒有,可以按照以下步驟創建一個:
# 檢查磁盤信息 fdisk -l ? # 假設使用 /dev/sda 磁盤,創建物理卷 pvcreate /dev/sda ? # 創建卷組 vgcreate vg_mysql /dev/sda ? # 創建邏輯卷 lvcreate -n lv_mysql -L 4G vg_mysql ? # 格式化邏輯卷為 ext4 文件系統 mkfs.ext4 /dev/vg_mysql/lv_mysql ? # 創建掛載點 mkdir /var/lib/mysql ? # 掛載邏輯卷 mount /dev/vg_mysql/lv_mysql /var/lib/mysql ? # 確保開機自動掛載,添加到 /etc/fstab 文件 echo "/dev/vg_mysql/lv_mysql /var/lib/mysql ext4 defaults 0 0" >> /etc/fstab
-
安裝和配置 MySQL (安裝在了lvm卷中 )
-
安裝 MySQL 并將數據存儲在
/var/lib/mysql
中:
dnf install mysql-server -y systemctl start mysqld systemctl enable mysqld
-
創建測試數據
-
登錄 MySQL 并創建一些測試數據:
mysql -u root -p
-
輸入密碼,然后在 MySQL 中執行以下 SQL 語句:
CREATE DATABASE testdb; USE testdb; CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100) ); INSERT INTO test_table (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com');
-
創建 LVM 快照
-
創建一個 LVM 快照,用于備份:
# 刷新表鎖,創建快照,解鎖表 mysql -u root -p -e "flush tables with read lock; system lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql; unlock tables;" ? # 創建掛載點 mkdir /mnt/mysql_snapshot ? # 掛載快照 mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot
-
備份數據
-
使用
rsync
或tar
備份數據:
# 使用 rsync 備份 rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/ ? # 或者使用 tar 備份 tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot
-
清理快照
-
完成備份后,清理快照:
# 卸載快照 umount /mnt/mysql_snapshot ? # 刪除快照 lvremove -f /dev/vg_mysql/lv_mysql_snapshot
-
恢復數據(可選)
-
假設你需要恢復數據,你可以使用之前的備份文件:
# 假設使用 tar 備份,先解壓 tar xzf /backup/mysql_snapshot_20250117.tar.gz -C /tmp/restore ? # 停止 MySQL 服務 systemctl stop mysqld ? # 清空當前數據目錄 rm -rf /var/lib/mysql/* ? # 復制備份數據到數據目錄 cp -r /tmp/restore/mnt/mysql_snapshot/* /var/lib/mysql/ ? # 更改權限 chown mysql:mysql -R /var/lib/mysql ? # 啟動 MySQL 服務 systemctl start mysqld
show databases;
實驗總結
-
步驟 1:創建 LVM 邏輯卷,將其格式化為 ext4 并掛載到
/var/lib/mysql
,用于存儲 MySQL 數據。 -
步驟 2:安裝和啟動 MySQL 服務。
-
步驟 3:創建測試數據,驗證 MySQL 數據庫的正常使用。
-
步驟 4:使用
flush tables with read lock
鎖定表,創建 LVM 快照,解鎖表,然后掛載快照。 -
步驟 5:使用
rsync
或tar
備份快照中的數據。 -
步驟 6:卸載和刪除快照,完成備份操作。
-
步驟 7:可選的恢復數據步驟,展示如何使用備份文件恢復數據。
注意事項
-
在創建快照時,確保快照的大小足夠存儲在創建快照期間發生變化的數據。
-
操作過程中,確保有足夠的權限,通常需要使用
root
權限或sudo
。 -
備份的頻率和時間應該根據實際情況確定,以確保數據的安全性和可恢復性。
通過上述實驗,你可以實現一個簡單的 LVM 快照備份 MySQL 數據庫的過程,以保護數據免受意外數據丟失或損壞的影響。
以下是上述實驗的腳本形式,你可以將其保存為 lvm_snapshot_backup.sh
并運行:
#!/bin/bash ? # 刷新表鎖,創建快照,解鎖表 mysql -u root -p -e "flush tables with read lock; system lvcreate -n lv_mysql_snapshot -L 1G -s /dev/vg_mysql/lv_mysql; unlock tables;" ? # 創建掛載點 mkdir -p /mnt/mysql_snapshot ? # 掛載快照 mount /dev/vg_mysql/lv_mysql_snapshot /mnt/mysql_snapshot ? # 使用 rsync 備份 rsync -avz /mnt/mysql_snapshot/ /backup/mysql_snapshot_$(date +%Y%m%d)/ ? # 或者使用 tar 備份 # tar czf /backup/mysql_snapshot_$(date +%Y%m%d).tar.gz /mnt/mysql_snapshot ? # 卸載快照 umount /mnt/mysql_snapshot ? # 刪除快照 lvremove -f /dev/vg_mysql/lv_mysql_snapshot
你可以使用以下方式運行該腳本:
chmod +x lvm_snapshot_backup.sh ./lvm_snapshot_backup.sh
這個實驗可以幫助你了解如何使用 LVM 快照備份 MySQL 數據庫,并且在需要時可以使用備份文件恢復數據,確保數據的安全和完整性。請根據實際情況調整用戶名、密碼、設備名稱、備份目錄等信息。