一、Xtrabackup介紹
1、Xtrabackup是什麼
Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表。
innobackupex是參考了InnoDB Hotbackup的innoback指令碼修改而來的。innobackupex是一個perl指令碼封裝,封裝了xtrabackup。主要是為了方便同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 複後,作為slave需要的一些資訊,根據這些資訊,可以很方便的利用備份來重做slave。
2、Xtrabackup可以做什麼
線上(熱)備份整個庫的InnoDB、 XtraDB表
在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)
以流的形式產生備份,可以直接儲存到遠程機器上(本機硬碟空間不足時很有用)
MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位日誌恢複是point-in-time(時間點)的恢複而不是增量備份。
Xtrabackup工具支援對InnoDB儲存引擎的增量備份,工作原理如下:
(1)、首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)。
(2)、在進程增量備份時,比較資料表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN。
首先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的資料檔案.ibd;在拷貝全部資料檔案結束之後,才停止拷貝logfile。
因為logfile裡面記錄全部的資料修改情況,所以,即時在備份過程中資料檔案被修改過了,恢複時仍然能夠通過解析xtrabackup_logfile保持資料的一致。
3、Xtrabackup備份原理
XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,由於不鎖表,複製出來的資料是不一致的,在恢複的時候使用crash-recovery,使得資料恢複一致。 :
InnoDB維護了一個redo log,又稱為transaction log,交易記錄,它包含了innodb資料的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,並且會做二步操作:XtraBackup在備份的時候, 一頁一頁地複製innodb的資料,而且不鎖定表,與此同時,XtraBackup還有另外一個線程監視著transactions log,一旦log發生變化,就把變化過的log pages複製走。為什麼要急著複製走呢?因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,所以新資料可能會覆蓋到舊的資料。
在prepare過程中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。
4、實現細節
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的資料。同樣不可以配置。
5、innobackupex 相關參數
註:xtrabackup命令只備份資料檔案,並不備份資料表結構(.frm),所以使用xtrabackup恢複的時候,你必須有對應表結構檔案(.frm),所以,個人推薦採用innobackupex命令 [此命令相當於冷備份,複製資料目錄的索引,資料,結構檔案,但會有短暫的鎖表(時間依賴於MyISAM大小)]。
參數說明如下:
--defaults-file:指定my.cnf參數檔案的位置[此設定檔裡必須指定datadir]。
--apply-log:同xtrabackup的--prepare參數,一般情況下,在備份完成後,資料尚且不能用於恢複操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料 檔案仍處理不一致狀態。--apply-log的作用是通過復原未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態。
--copy-back:做資料恢複時將備份資料檔案拷貝到MySQL伺服器的datadir。
--remote-host=HOSTNAME: 通過ssh將備份資料存放區到進程伺服器上。
--stream=[tar]:備份檔案輸出格式, 該檔案可在XtarBackup binary檔案中獲得. 在使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候並發寫入較大的話,xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。
--tmpdir=DIRECTORY:當有指定--remote-host or --stream時, 交易記錄臨時儲存的目錄, 預設採用MySQL設定檔中所指定的臨時目錄tmpdir。
--redo-only --apply-log:強製備份日誌時只redo,跳過rollback,這在做增量備份時非常必要。
--use-memory=*:該參數在prepare的時候使用,控制prepare時innodb執行個體使用的記憶體。
--databases=LIST:列出需要備份的databases,如果沒有指定該參數,所有包含MyISAM和InnoDB表的database都會被備份。
--slave-info:備份從庫, 加上--slave-info備份目錄下會多產生一個xtrabackup_slave_info 檔案, 這裡會儲存主記錄檔以及位移, 檔案內容類別似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0。
--socket=SOCKET:指定mysql.sock所在位置,以便備份進程登入mysql。
二、xtrabackup-2.1.6-702安裝
本文通過源碼方式安裝xtrabackup-2.1.6-702
:http://www.percona.com/downloads/XtraBackup/
1、編譯所需的依賴包
查看編譯所需的依賴包是否安裝,如果沒有安裝,則安裝之。
rpm -q libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.*
yum -y install 包名
2、安裝
tar -zxvf percona-xtrabackup-2.1.6-702-Linux-x86_64.tar.gz
cd percona-xtrabackup-2.1.6-702-Linux-x86_64/bin
將innobackupex、xtrabackup等檔案copy到mysql程式目錄下/bin目錄
cp * /mysql/bin/
將mysql安裝目錄下的檔案做軟連結到/usr/bin/目錄下。這個比變數方便,這樣就完成了部署安裝!!!!!!!!!!!
ln -s /mysql/bin/* /usr/bin/
XtraBackup 的詳細介紹:請點這裡
XtraBackup 的:請點這裡
推薦閱讀:
MySQL開源備份工具Xtrabackup備份部署
MySQL Xtrabackup備份和恢複
用XtraBackup實現MySQL的主從複製快速部署【主不鎖表】
安裝和使用 Percona 推出的 Xtrabackup 備份 MySQL