【MySql】 MySql備份工具Xtrabackup之一

楊奇龍發表於2011-11-17
一.Xtrabackup簡介及備份原理說明:
Xtrabackup是由percona開發的一個開源軟體,能夠非常快速地備份與恢復mysql資料庫,且支援線上熱備份(備份時不影響資料讀寫),此軟體可以說是innodb熱備工具ibbackup的一個開源替代品
Xtrabackup中包含兩個工具:
lxtrabackup -用於熱備份innodb,xtradb引擎表的工具,不能備份其他表。
linnobackupex-對xtrabackup封裝的perl指令碼,提供了用於myisam(會鎖表)和innodb引擎,及混合使用引擎備份的能力。

Xtrabackup可以做什麼
l線上(熱)備份整個庫的InnoDB, XtraDB表
l在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)
l以流的形式產生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)

MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支援對InnoDB儲存引擎的增量備份,工作原理如下:(1)首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)。(2)在程式增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN。
在Xtrabackup的wiki上簡單的介紹了一下實現的原理:
首先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始複製InnoDB的logfile到xtrabackup_logfile;接著,開始複製全部的資料檔案.ibd;在複製全部資料檔案結束之後,才停止複製logfile。
因為logfile裡面記錄全部的資料修改情況,所以,即時在備份過程中資料檔案被修改過了,恢復時仍然能夠透過解析xtrabackup_logfile保持資料的一致。
Tip1:Xtrabackup是一個用於備份InnoDB/XtrDB的工具,真正的線上備份(不影響資料的讀寫),InnoDB Hot Backup的開源替代品。
Tip2:在使用引數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以透過引數--tmpdir指定目錄來解決這個問題。

備份原理
XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,由於不鎖表,複製出來的資料是不一致的,在恢復的時候使用crash-recovery,使得資料恢復一致。
InnoDB維護了一個redo log,又稱為transaction log,事務日誌,它包含了innodb資料的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,並且會做二步操作:
1.It applies committed transaction log entries to the data files
2.it performs an undo operation on any transactions that modified data but did not commit.

XtraBackup在備份的時候,一頁一頁地複製innodb的資料,而且不鎖定表,與此同時,XtraBackup還有另外一個執行緒監視著transactions log,一旦log發生變化,就把變化過的log pages複製走。為什麼要急著複製走呢?前幾章的時候就提過這個問題,因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,所以新資料可能會覆蓋到舊的資料。
在prepare過程中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。

實現細節
檔案許可權
xtrabackup以read-write模式開啟innodb的資料檔案,然後對其進行復制。其實它不會修改此檔案。也就是說,執行xtrabackup的使用者,必須對innodb的資料檔案具有讀寫許可權。
為什麼要用rw模式呢?直接read模式不好麼?因為xtrabackup採用了其內建的innodb庫來開啟檔案,而innodb庫開啟檔案的時候就是rw的。

Tuning the OS Buffers
因為XtraBackup要從檔案系統中複製大量的資料,所以它儘可能地使用posix_fadvise(),來告訴OS不要快取讀取到的資料,從而提升效能。因為這些資料不會重用到了,OS卻沒有這麼聰明。如果要快取一下的話,幾個G的資料,會對OS的虛擬記憶體造成很大的壓力,其它程式,比如mysqld很有可能被swap出去,這樣系統就會受到很大影響了。
posix_fadvise(file,0,0,POSIX_FADV_DONTNEED)
而且XtraBackup在讀取資料的時候還儘可能地預讀:
posix_fadvise(file,0,0,POSIX_FADV_SEQUENTIAL)

複製資料檔案
在備份innodb page的過程中,XtraBackup每次讀寫1MB的資料,1MB/16KB=64個page。這個不可配置。讀1MB資料之後,XtraBackup一頁一頁地遍歷這1MB資料,使用innodb的buf_page_is_corrupted()函式檢查此頁的資料是否正常,如果資料不正常,就重新讀取這一頁,最多重新讀取10次,如果還是失敗,備份就失敗了,退出。
It skips this check on the doublewrite buffer??
在複製transactions log的時候,每次讀寫512KB的資料。同樣不可以配置。

http://samyubw.blog.51cto.com/978243/555388

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

相關文章