1 Xtrabackup原理簡介mysql
xtrabackup是一個對InnoDB作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。
xtrabackup有兩個主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表 sql
(2)innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的,innobackupex是一個perl腳本封裝,封裝了xtrabackup,因此能同時備份處 理innodb和myisam,但在處理myisam時須要加一個讀鎖。而且加入了一些使用的選項,如slave-info能夠記錄備份恢復後,做爲 slave須要的一些信息,根據這些信息,能夠很方便的利用備份來重作slave。 數據庫
(3)使用幫助:http://www.percona.com/docs/wiki/percona-xtrabackup:start 緩存
(4)Xtrabackup能夠作什麼
在線(熱)備份整個庫的InnoDB、 XtraDB表
在xtrabackup的上一次整庫備份基礎上作增量備份(innodb only)
以流的形式產生備份,能夠直接保存到遠程機器上(本機硬盤空間不足時頗有用)
MySQL數據庫自己提供的工具並不支持真正的增量備份,二進制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工做原理以下:
(1)首先完成一個徹底備份,並記錄下此時檢查點的LSN(Log Sequence Number)。 app
(2)在進程增量備份時,比較表空間中每一個頁的LSN是否大於上次備份時的LSN,若是是,則備份該頁,同時記錄當前檢查點的LSN。
首先,在logfile中找到並記錄最後一個checkpoint(「last checkpoint LSN」),而後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接着,開始拷貝所有的數據文 件.ibd;在拷貝所有數據文件結束以後,才中止拷貝logfile。
由於logfile裏面記錄所有的數據修改狀況,因此,即時在備份過程當中數據文件被修改過了,恢復時仍然可以經過解析xtrabackup_logfile保持數據的一致。
xtrabackup備份原理
xtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。
InnoDB維護了一個redo log,又稱爲transaction log,事務日誌,它包含了innodb數據的全部改動狀況。當InnoDB啓動的時候,它會先去檢查data file和transaction log,而且會作二步操做: socket
xtraBackup在備份的時候, 一頁一頁地複製innodb的數據,並且不鎖定表,與此同時,XtraBackup還有另一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複製走。爲何要急着複製走呢? 由於transactions log文件大小有限,寫滿以後,就會從頭再開始寫,因此新數據可能會覆蓋到舊的數據。
在prepare過程當中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。 函數
(5)實現細節
XtraBackup以read-write模式打開innodb的數據文件,而後對其進行復制。其實它不會修改此文件。也就是說,運行 XtraBackup的用戶,必須對innodb的數據文件具備讀寫權限。之因此採用read-write模式是由於XtraBackup採用了其內置的 innodb庫來打開文件,而innodb庫打開文件的時候就是rw的。
XtraBackup要從文件系統中複製大量的數據,因此它儘量地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據,從 而提高性能。由於這些數據不會重用到了,OS卻沒有這麼聰明。若是要緩存一下的話,幾個G的數據,會對OS的虛擬內存形成很大的壓力,其它進程,好比 mysqld頗有可能被swap出去,這樣系統就會受到很大影響了。
在備份innodb page的過程當中,XtraBackup每次讀寫1MB的數據,1MB/16KB=64個page。這個不可配置。讀1MB數據之 後,XtraBackup一頁一頁地遍歷這1MB數據,使用innodb的buf_page_is_corrupted()函數檢查此頁的數據是否正常, 若是數據不正常,就從新讀取這一頁,最多從新讀取10次,若是仍是失敗,備份就失敗了,退出。在複製transactions log的時候,每次讀寫512KB的數據。一樣不能夠配置。
工具
2.1 Xtrabackup開源工具性能
【】若是磁盤不夠,直接[root@clonedb-m209alldb]#mv */data/mbdata/open/大數據
time /usr/bin/innobackupex --user=root --password=******--host=127.0.0.1 --port=3307 --defaults-file=/etc/my.cnf --slave-info --socket=/data/mbdata/open/mysql.sock--no-timestamp /home/backup/all/alldb 2>$dirlog
2.5 增量備份腳本
2.5增量恢復(1)
PS:/home/backup/all/alldb是全量備份目錄
PS:/home/backup/daily/daily_2012_03_22是增量備份目錄
2.5增量恢復(2)
2.6遠程備份