1. 程式人生 > >【MySQL技術內幕】57-備份與恢復概述

【MySQL技術內幕】57-備份與恢復概述

可以根據不同的型別來劃分備份的方法。根據備份的方法不同可以將備份分為:

  • Hot Backup(熱備)
  • Cold Backup(冷備)
  • Warm Backup(溫備)

Hot Backup是指資料庫執行中直接備份,對正在執行的資料庫操作沒有任何的影響。這種方式在 MySQL官方手冊中稱為Online Backup(線上備份)。 Cold Backup是指備份操作是在資料庫停止的情況下,這種備份最為簡單,一般只需要複製相關的資料庫物理檔案即可。這種方式在 MySQL官方手冊中稱為 Offline Backup(離線備份)。WarmBackup備份同樣是在資料庫執行中進行的,但是會對當前資料庫的操作有所影響,如加一個全域性讀鎖以保證備份資料的一致性。 按照備份後文件的內容,備份又可以分為:

  • 邏輯備份
  • 裸檔案備份

在 MySQL資料庫中,邏輯備份是指備份出的檔案內容是可讀的,一般是文字檔案。內容一般是由一條條SQL語句,或者是表內實際資料組成。如 mysqldump和 SELECT* INTO OUTFILE的方法。這類方法的好處是可以觀察匯出檔案的內容,一般適用於資料庫的升級、遷移等工作。但其缺點是恢復所需要的時間往往較長。 裸檔案備份是指複製資料庫的物理檔案,既可以是在資料庫執行中的複製(如backup、 xtrabackup這類工具),也可以是在資料庫停止執行時直接的資料檔案複製。 這類備份的恢復時間往往較邏輯備份短很多。若按照備份資料庫的內容來分,備份又可以分為:

  • 完全備份
  • 增量備份
  • 日誌備份

完全備份是指對資料庫進行一個完整的備份。增量備份是指在上次完全備份的基礎上,對於更改的資料進行備份。日誌備份主要是指對 MySQL資料庫二進位制日誌的備份,通過對一個完全備份進行二進位制日誌的重做( replay)來完成資料庫的 point-in-time的恢復工作。 MySQL資料庫複製(replication)的原理就是非同步實時地將二進位制日誌重做傳送並應用到從(slave/standby)資料庫。 對於 MySQL資料庫來說,官方沒有提供真正的增量備份的方法,大部分是通過二進位制日誌完成增量備份的工作。這種備份較之真正的增量備份來說,效率還是很低的。 假設有一個100GB的資料庫,要通過二進位制日誌完成備份,可能同一個頁需要執行多次的SQL語句完成重做的工作。但是對於真正的增量備份來說,只需要記錄當前每頁最後的檢查點的LSN,如果大於之前全備時的LSN,則備份該頁,否則不用備份,這大大加快了備份的速度和恢復的時間,同時這也是 xtrabackup工具增量備份的原理。 此外還需要理解資料庫備份的一致性,這種備份要求在備份的時候資料在這一時間點上是一致的。舉例來說,在一個網路遊戲中有一個玩家購買了道具,這個事務的過程是:先扣除相應的金錢,然後向其裝備表中插入道具,確保扣費和得到道具是互相一致的。否則,在恢復時,可能出現金錢被扣除了而裝備丟失的問題。 對於 InnoDB儲存引擎來說,因為其支援MVC功能,因此實現一致的備份比較簡單。使用者可以先開啟一個事務,然後匯出一組相關的表,最後提交。當然使用者的事務隔離級別必須設定為REPEATABLE READ,這樣的做法就可以給出一個完美的一致性備份。然而這個方法的前提是需要使用者正確地設計應用程式。對於上述的購買道具的過程,不可以分為兩個事務來完成,如一個完成扣費,一個完成道具的購買。若備份這時發生在這兩者之間,則由於邏輯設計的問題,導致備份出的資料依然不是一致的。 對於 mysqldump備份工具來說,可以通過新增--single-transaction

選項獲得InnoDB儲存引擎的一致性備份,原理和之前所說的相同。需要了解的是,這時的備份是在一個執行時間很長的事務中完成的。另外,對於InnoDB儲存引擎的備份,務必加上--single-transaction的選項(雖然是mysqldump的一個可選選項,但是我找不出任何不加的理由)。 最後,任何時候都需要做好遠端異地備份,也就是容災的防範。