seeyou 2013-11-18 10:39
InnoDB數據備份工具 - Xtrabackup 跟 innobackupex 的差別?
<p><font size="3">一、Xtrabackup介紹</font></p><p><font size="3"><br></font></p><p><font size="3">A、Xtrabackup是什麼</font></p><p><font size="3"><br></font></p><p><font size="3">Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。</font></p><p><font size="3"><br></font></p><p><font size="3">Xtrabackup有兩個主要的工具:xtrabackup、innobackupex</font></p><p><font size="3"><br></font></p><p><font size="3">1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表</font></p><p><font size="3">2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是為了方便的 同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作為slave需要的一些信息,根據這些信息,可以很方便的利用備份來重做slave。</font></p><p><font size="3">3、官方文檔:http://www.percona.com/docs/wiki/percona-xtrabackup:start</font></p><p><font size="3"><br></font></p><p><font size="3">B、Xtrabackup可以做什麼</font></p><p><font size="3"><br></font></p><p><font size="3">在線(熱)備份整個庫的InnoDB、 XtraDB表</font></p><p><font size="3">在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)</font></p><p><font size="3">以流的形式產生備份,可以直接保存到遠程機器上(本機硬盤空間不足時很有用)</font></p><p><font size="3"><br></font></p><p><font size="3">MySQL數據庫本身提供的工具並不支持真正的增量備份,二進制日志恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工作原理如下:</font></p><p><font size="3"><br></font></p><p><font size="3">(1)首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)。</font></p><p><font size="3">(2)在進程增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN。</font></p><p><font size="3"><br></font></p><p><font size="3">首先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的數據文 件.ibd;在拷貝全部數據文件結束之後,才停止拷貝logfile。</font></p><p><font size="3"><br></font></p><p><font size="3">因為logfile里面記錄全部的數據修改情況,所以,即時在備份過程中數據文件被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持數據的一致。</font></p><p><font size="3"><br></font></p><p><font size="3">C、Xtrabackup備份原理</font></p><p><font size="3"><br></font></p><p><font size="3">XtraBackup基於InnoDB的crash-recovery功能。它會復制innodb的data file,由於不鎖表,復制出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。</font></p><p><font size="3"><br></font></p><p><font size="3">InnoDB維護了一個redo log,又稱為transaction log,事務日志,它包含了innodb數據的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,並且會做二步操作:</font></p><p><font size="3"><br></font></p><p><font size="3">XtraBackup在備份的時候, 一頁一頁地復制innodb的數據,而且不鎖定表,與此同時,XtraBackup還有另外一個線程監視著transactions log,一旦log發生變化,就把變化過的log pages復制走。為什麼要急著復制走呢? 因為transactions log文件大小有限,寫滿之後,就會從頭再開始寫,所以新數據可能會覆蓋到舊的數據。</font></p><p><font size="3"><br></font></p><p><font size="3">在prepare過程中,XtraBackup使用復制到的transactions log對備份出來的innodb data file進行crash recovery。</font></p><p><font size="3"><br></font></p><p><font size="3">D、實現細節</font></p><p><font size="3"><br></font></p><p><font size="3">XtraBackup以read-write模式打開innodb的數據文件,然後對其進行復制。其實它不會修改此文件。也就是說,運行 XtraBackup的用戶,必須對innodb的數據文件具有讀寫權限。之所以采用read-write模式是因為XtraBackup采用了其內置的 innodb庫來打開文件,而innodb庫打開文件的時候就是rw的。</font></p><p><font size="3"><br></font></p><p><font size="3">XtraBackup要從文件系統中復制大量的數據,所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據,從 而提升性能。因為這些數據不會重用到了,OS卻沒有這麼聰明。如果要緩存一下的話,幾個G的數據,會對OS的虛擬內存造成很大的壓力,其它進程,比如 mysqld很有可能被swap出去,這樣系統就會受到很大影響了。</font></p><p><font size="3"><br></font></p><p><font size="3">在備份innodb page的過程中,XtraBackup每次讀寫1MB的數據,1MB/16KB=64個page。這個不可配置。讀1MB數據之 後,XtraBackup一頁一頁地遍歷這1MB數據,使用innodb的buf_page_is_corrupted()函數檢查此頁的數據是否正常, 如果數據不正常,就重新讀取這一頁,最多重新讀取10次,如果還是失敗,備份就失敗了,退出。在復制transactions log的時候,每次讀寫512KB的數據。同樣不可以配置。</font></p><p><br></p><p><strong><br></strong></p><p><strong><font color="#008000" size="4">innobackupex的備份與恢復使用</font><br></strong><br><font size="3">A、數據備份</font></p><p><font size="3">通常一般都直接使用innobackupex,因為它能同時備份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir這個參數是必須要指定的,xtrabackup_55是根據它去定位innodb數據文件的位置。</font></p><p><br></p><p>參考文件: <a href="http://www.loliman3000.com/tech/2fe1720ae4e0059d34b94349.php" target="_blank">http://www.loliman3000.com/tech/2fe1720ae4e0059d34b94349.php</a></p>