Xtrabackup原理及使用innobackupex進行MySQL數據庫備份恢復


Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。

Xtrabackup中主要包含兩個工具:

xtrabackup:是用於熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構;

innobackupex:是將xtrabackup進行封裝的perl腳本,可以備份和恢復MyISAM表以及數據表結構。

一段官方文檔的說明:

http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html

It is possible to use the xtrabackup binary alone, however, the recommend way is using it through the innobackupex wrapper script and let it execute xtrabackup for you. It might be helpful to first learn how to use innobackupex, and then learn how to use xtrabackup for having a better low-level understanding or control of the tool if needed.

1. xtrabackup原理

官方文檔:http://www.percona.com/docs/wiki/doku.php?id=percona-xtrabackup:xtrabackup_manual

XtraBackup對Innodb的備份之所以是熱備,無需鎖表,是基於Innodb自身的崩潰恢復機制,它首先復制所有的Innodb數據文件,這樣復制出來的文件肯定是不一致的,然后對每個文件進行崩潰恢復處理,最終達到一致。就和MySQL在啟動Innodb的時候一樣,會通過比較數據文件頭和redo log文件頭信息來檢查數據是否是一致的,如果不一致就嘗試通過前滾(把redo log中所有提交的事務寫入數據文件)和回滾(從數據文件中撤銷所有redo log中未提交的事務引起的修改)來使數據達到最終一致。

XtraBackup在啟動的時候會記錄一個LSN(log sequence number),然后就把所有的Innodb數據文件復制出來,這樣復制出來的數據文件是不一致的,但是XtraBackup會在后台運行一個進程把所有對redo log file的修改記錄下來,只要有了這個數據,就能進行崩潰恢復。只所以要額外記錄下來,是因為MySQL自身的redo log file是可重用的。

以上的操作是由xtrabackup二進制程序(比如xtrabackup_55)完成的,如果使用innobackupex 腳本,剛才的步驟完成以后,innobackupex就會去備份MyISAM表和.frm文件,這時要保證數據的一致性就會先鎖表了,通過FLUSH TABLES WITH READ LOCK命令鎖表然后把文件復制出來,再釋放掉這個鎖。

在恢復數據的時候,要經過prepare(recovery)和restore兩個步驟。在prepare結束以后,Innodb的表恢復到了復制Innodb文件結束的時間點,這個時間點也就是鎖表復制MyISAM表的起點,所以最終數據是一致的。一般我們在恢復的時候執行兩次prepare,是因為第二次prepare會幫助我們生成redo log文件,從而加快MySQL數據庫啟動的速度。

增量備份:

在InnoDB中,每個page中都記錄LSN信息,每當相關數據發生改變,page的LSN就會自動增加,xtrabackup的增量備份就是依據這一原理進行的。

(1)首先完成一個完全備份,並記錄下此時檢查點LSN;

(2)然后增量備份時,比較表空間中每個頁的LSN是否大於上次備份的LSN,若是則備份該頁並記錄當前檢查點的LSN。

具體來說,首先在logfile中找到並記錄最后一個checkpoint(“last checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;然后開始拷貝全部的數據文件.ibd;在拷貝全部數據文件結束之后,才停止拷貝logfile。

所以xtrabackup_logfile文件在並發寫入很大時也會變得很大,占用很多空間,需要注意。另外當我們使用--stream=tar或者遠程備份--remote-host時默認使用/tmp,但最好顯示用參數--tmpdir指定,以免把/tmp目錄占滿影響備份以及系統其它正常服務。

因為logfile里面記錄全部的數據修改情況,所以即使在備份過程中數據文件被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持數據的一致。

2 innobackupex工作原理

官方文檔:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/how_innobackupex_works.html

2.1 備份


如果在程序啟動階段未指定模式,innobackupex將會默認以備份模式啟動。

默認情況下,此腳本以--suspend-at-end選項啟動xtrabackup,然后xtrabackup程序開始拷貝InnoDB數據文件。當xtrabackup程序執行結束,innobackupex將會發現xtrabackup創建了xtrabackupsuspended2文件,然后執行FLUSH TABLES WITH READ LOCK,此語句對所有的數據庫表加讀鎖,然后開始拷貝其他類型的文件。

如果--ibbackup未指定,innobackupex將會自行嘗試確定使用的xtrabackup的binary。其確定binary的邏輯如下:首先判斷備份目錄中xtrabackup_binary文件是否存在,如果存在,此腳本將會依據此文件確定使用的xtrabackup binary。否則,腳本將會嘗試連接database server,通過server版本確定binary。如果連接無法建立,xtrabackup將會失敗,需要自行指定binary文件。

在binary被確定后,將會檢查到數據庫server的連接是否可以建立。其執行邏輯是:建立連接、執行query、關閉連接。若一切正常,xtrabackup將以子進程的方式啟動。

FLUSH TABLES WITH READ LOCK是為了備份MyISAM和其他非InnoDB類型的表,此語句在xtrabackup已經備份InnoDB數據和日志文件后執行。在這之后,將會備份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 類型的文件。

當所有上述文件備份完成后,innobackupex腳本將會恢復xtrabackup的執行,等待其備份上述邏輯執行過程中生成的事務日志文件。接下來,表被解鎖,slave被啟動,到server的連接被關閉。接下來,腳本會刪掉xtrabackupsuspended2文件,允許xtrabackup進程退出。

2.2 恢復


為了恢復一個備份,innobackupex需要以--copy-back選項啟動。

innobackupex將會首先通過my.cnf文件讀取如下變量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,並確定這些目錄存在。

接下來,此腳本將會首先拷貝MyISAM表、索引文件、其他類型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下來拷貝InnoDB表數據文件,最后拷貝日志文件。拷貝執行時將會保留文件屬性,在使用備份文件啟動MySQL前,可能需要更改文件的owener(如從拷貝文件的user更改到mysql用戶)。

3. 使用innobackupex進行MySQL數據庫備份恢復

3.1 完全備份:

innobackupex --user=root -p /home/backup/

備份后的文件:在備份的同時,備份數據會在備份目錄下創建一個以當前日期時間為名字的目錄存放備份文件。

各文件說明:

(1) backup-my.cnf —— 備份命令用到的配置選項信息;

(2) ibdata —— 備份的表空間文件;

(3) xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;

(4) xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置;

(5) xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;

 

(6) xtrabackup_logfile —— 備份的重做日志文件。

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

3.2 准備(prepare)一個完全備份

一般情況下,在備份完成后,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“准備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

innobakupex命令的--apply-log選項可用於實現上述功能。

innobackupex --apply-log /home/backup/2014-05-03_17-21-11/

執行成功,顯示如下:

 

在實現“准備”的過程中,innobackupex通常還可以使用--use-memory選項來指定其可以使用的內存的大小,默認通常為100M。如果有足夠的內存可用,可以多划分一些內存給prepare的過程,以提高其完成速度。

3.3還原數據庫

(1)模擬數據庫損壞

直接使用刪除數據目錄文件來模擬損壞:


(2)還原完全備份:

innobackupex命令的--copy-back選項用於執行恢復操作,其通過復制所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。

innobackupex --copy-back /home/backup/2014-05-03_17-21-11/

如果執行正確,其輸出信息的最后幾行通常如下:

(3)修改還原后的數據目錄權限:

 

(4)啟動MySQL

/bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf &

(5)驗證還原后的數據:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM