XTRABACKUP原理及使用INNOBACKUPEX進行MYSQL數據庫備份恢復

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

Xtrabackup中主要包含兩個工具:html

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

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

一段官方文檔的說明:數據庫

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_manualapp

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是可重用的。rest

以上的操做是由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用戶)。

  1. 使用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)驗證還原後的數據:

相關文章
相關標籤/搜索