1. 程式人生 > >【MySQL技術內幕】62-快照備份

【MySQL技術內幕】62-快照備份

MySQL資料庫本身並不支援快照功能,因此快照備份是指通過檔案系統支援的快照功能對資料庫進行備份。備份的前提是將所有資料庫檔案放在同一檔案分割槽中,然後對該分割槽進行快照操作。支援快照功能的檔案系統和裝置包括 FreeBSD的UFS檔案系統, Solaris的ZFS檔案系統, GNU/Linux的邏輯管理器( Logical Volume Manager,LVM)等。這裡以LVM為例進行介紹,UFS和ZFS的快照實現大致和LVM相似。 LVM是 LINUX系統下對磁碟分割槽進行管理的一種機制。LVM在硬碟和分割槽之上建立一個邏輯層,來提高磁碟分割槽管理的靈活性。管理員可以通過IⅥM系統輕鬆管理磁碟分割槽,例如,將若干個磁碟分割槽連線為一個整塊的卷組( Volume Group),形成一個儲存池。管理員可以在卷組上隨意建立邏輯卷( Logical Volumes),並進一步在邏輯捲上建立檔案系統。管理員通過LVM可以方便地調整卷組的大小,並且可以對磁碟儲存按照組的方式進行命名、管理和分配。簡單地說,使用者可以通過LVM由物理塊裝置(如硬碟等)建立物理卷,由一個或多個物理卷建立卷組,最後從卷組中建立任意個邏輯卷(不超過卷組大小),如圖8-1所示

圖8-2顯示了由多塊磁碟組成的邏輯卷LV0。

通過 vgdisplay命令檢視系統中有哪些卷組,如:

vgdisplay命令的輸出結果顯示當前系統有一個rep的卷組,大小為260.77GB,該卷組訪問許可權是 read/write等。命令lvdisplay可以用來檢視當前系統中有哪些邏輯卷:

   

   

   

可以看到,一共有3個邏輯卷,都屬於卷組rep,每個邏輯卷的大小都是100GB。dev/rep/repdata這個邏輯卷有兩個只讀快照,並且當前都是啟用狀態的。 LVM使用了寫時複製(Copy-on- write)技術來建立快照。當建立一個快照時,僅複製原始卷中資料的元資料( meta data),並不會有資料的物理操作,因此快照的建立過程是非常快的。當快照建立完成,原始捲上有寫操作時,快照會跟蹤原始卷塊的改變,將要改變的資料在改變之前複製到快照預留的空間裡,因此這個原理的實現叫做寫時複製。而對於快照的讀取操作,如果讀取的資料塊是建立快照後沒有修改過的,那麼會將讀操作直接重定向到原始捲上,如果要讀取的是已經修改過的塊,則將讀取儲存在快照中該塊在原始捲上改變之前的資料。因此,採用寫時複製機制保證了讀取快照時得到的資料與快照建立時一致。 圖8-3顯示了LVM的快照讀取,可見B區塊被修改了,因此歷史資料放人了快照區域。讀取快照資料時,A、C、D塊還是從原有卷中讀取,而B塊就需要從快照讀取了。

命令 Ivcreate可以用來建立一個快照,--permission r表示建立的快照是隻讀的:

在快照製作完成後可以用 Display命令檢視,輸出中的 COW-table size欄位表示該快照最大的空間大小, Allocated to snapshot欄位表示該快照目前空間的使用狀況:

   

可以看到,當前快照只使用0.04%的空間。快照在最初建立時總是很小,當資料來源卷的資料不斷被修改時,這些資料庫才會放入快照空間,這時快照的大小才會慢慢增大。 用LVM快照備份 InnoDB儲存引擎表相當簡單,只要把與 InnoDB儲存引擎相關的檔案如共享表空間、獨立表空間、重做日誌檔案等放在同一個邏輯卷中,然後對這個邏輯卷做快照備份即可。 在對 InnoDB儲存引擎檔案做快照時,資料庫無須關閉,即可以進行線上備份。雖然此時資料庫中可能還有任務需要往磁碟上寫資料,但這不會妨礙備份的正確性。因為InnoDB儲存引擎是事務安全的引擎,在下次恢復時,資料庫會自動檢查表空間中頁的狀態,並決定是否應用重做日誌,恢復就好像資料庫被意外重啟了。