XtraBackup備份MySQL

壹頁書發表於2014-02-17
XtraBackup是一款開源免費的MySQL熱備份軟體。
對於MyISAM,他使用鎖機制進行全量備份。
對於InnoDB,他啟用類似歸檔的方式,不僅可以進行全量備份,還可以進行增量備份。

全量備份大致過程如下,
首先,找到備份開始時檢查點的LSN,複製此LSN之後的重做日誌到xtrabackup_log。
然後,開始複製InnoDB的資料檔案。
由於此時資料檔案還在不斷寫入,而且重做日誌檔案可能被覆蓋。所以XtraBackup有一個程式不斷複製變化的重做日誌到xtrabackup_log。這種方式參考Oracle歸檔模式的熱備份。

但是還有一個問題,就是MySQL的資料塊預設16K,而作業系統的塊,windows預設為512位元組,linux預設為1024位元組。
很有可能在複製的過程中,MySQL塊的若干作業系統塊被更新,但是整個MySQL塊卻沒有更新完成。這樣會造成資料塊的不一致。這種情況會影響重做日誌的前滾恢復。

我猜測MySQL的處理方式是參考Oracle.如果一個MySQL塊需要更新,則將這個準備寫入的塊的映象同redo log一起寫入重做日誌檔案。
資料恢復的時候,則使用重做日誌檔案中的資料塊映象apply redo log即可。

步驟3備份的是MyISAM表,採用了鎖的機制。
在MyISAM表備份完成之後,解鎖。此時,就是備份完成的時刻。
在MyISAM備份的過程中,InnoDB的redo log還是會不斷的寫入xtrabackup_log。

與Oracle不同的是,xtrabackup是先恢復再還原。
它的prepare過程,實際上就是Oracle對資料檔案應用歸檔重做日誌和聯機重做日誌的過程。
只不過xtrabackup將兩種日誌合併在了一個檔案中(xtrabackup_log),並且他的歸檔日誌僅僅包含從備份開始到MyISAM備份結束這一小段範圍的重做日誌。

在恢復的過程中,xtrabackup會啟動內部的一個InnoDB例項(xtrabackup自帶的),他根據備份的資料檔案應用重做日誌前滾資料,然後回滾未提交的資料。這個應該和Oracle是一樣的。

回滾的過程

xtrabackup支援增量備份。
對於MyISAM來說,任何增量備份的操作都是一個全備.
而對於InnoDB,他會根據一個全量備份的LSN,複製資料檔案中大於此LSN的資料塊。

恢復增量備份時,先恢復全量備份,然後依次對增量備份進行恢復。


下面透過實驗證明xtrabackup在複製檔案的過程中會開啟歸檔特性。

初始化實驗表結構,並初始化4條資料.

create table test(a int primary key,b int,key(b)) engine=innodb;

  1. delimiter //
  2. Create Procedure insertrange(in s int,in e int)
  3. begin
  4. declare i int;    
  5. set i = s;
  6. start transaction;
  7. while i<e do
  8. insert into test values(i,i);
  9. set i=i+1;
  10. end while;
  11. commit;
  12. end
  13. //
  14. delimiter ;
call insertrange(1,5);
重做日誌大小為5M


下面開啟一個終端,使用insertrange過程插入100W條資料

同時啟動另外一個終端,開始全量備份

備份過程會記錄一個開始的檢查點LSN

在備份的過程中,會不斷將重做日誌寫入xtrabackup_log,類似歸檔日誌的作用

備份非InnoDB資料

在非InnoDB資料備份之後,停止備份重做日誌,備份結束.
1582081210應該就是備份結束的時間點,增量備份以這個LSN為基準。


值得注意的是備份的重做日誌檔案比MySQL設定的重做日誌檔案要大,證明了備份的過程如果發生了日誌切換,會將歸檔的日誌寫入xtrabackup_log


xtrabackup的使用請參考:
http://blog.csdn.net/justdb/article/details/17054667

備份原理參考:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1082297/,如需轉載,請註明出處,否則將追究法律責任。

相關文章