天天看點

xtrabackup使用詳解

原理:

    在InnoDB内部會維護一個redo日志檔案,我們也可以叫做事務日志檔案。事務日志會存儲每一個InnoDB表資料的記錄修改。當InnoDB啟動時,InnoDB會檢查資料檔案和事務日志,并執行兩個步驟:它應用(前滾)已經送出的事務日志到資料檔案,并将修改過但沒有送出的資料進行復原操作。

    Xtrabackup在啟動時會記住log sequence number(LSN),并且複制所有的資料檔案。複制過程需要一些時間,是以這期間如果資料檔案有改動,那麼将會使資料庫處于一個不同的時間點。這時,xtrabackup會運作一個背景程序,用于監視事務日志,并從事務日志複制最新的修改。Xtrabackup必須持續的做這個操作,是因為事務日志是會輪轉重複的寫入,并且事務日志可以被重用。是以xtrabackup自啟動開始,就不停的将事務日志中每個資料檔案的修改都記錄下來。上面就是xtrabackup的備份過程。

接下來是準備(prepare)過程。在這個過程中,xtrabackup使用之前複制的事務日志,對各個資料檔案執行災難恢複(就像mysql剛啟動時要做的一樣)。當這個過程結束後,資料庫就可以做恢複還原了。

過程是備份---->準備。就是說:先将檔案全部複制過來,再根據事務日志對部分操作進行復原。

以上的過程在xtrabackup的編譯二進制程式中實作。程式innobackupex可以允許我們備份MyISAM表和frm檔案進而增加了便捷和功能。

Innobackupex會啟動xtrabackup,直到xtrabackup複制資料檔案後,然後執行FLUSH TABLES WITH READ LOCK來阻止新的寫入進來并把MyISAM表資料刷到硬碟上,之後複制MyISAM資料檔案,最後釋放鎖。

備份MyISAM和InnoDB表最終會處于一緻,在準備(prepare)過程結束後,InnoDB表資料已經前滾到整個備份結束的點,而不是復原到xtrabackup剛開始時的點。這個時間點與執行FLUSH TABLES WITH READ LOCK的時間點相同,是以myisam表資料與InnoDB表資料是同步的。

類似oracle的,InnoDB的prepare過程可以稱為recover(恢複),myisam的資料複制過程可以稱為restore(還原)。

xtrabackup的安裝:

官網下載下傳rpm包或者tar.gz包解壓就能用,此外需要通過epel的yum安裝依賴包libev

# yum install libev -y

# rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm

rpm包釋放的可執行檔案如下:

/usr/bin/innobackupex    # 封裝過的perl腳本

/usr/bin/xbcloud

/usr/bin/xbcloud_osenv

/usr/bin/xbcrypt

/usr/bin/xbstream

/usr/bin/xtrabackup      # 主程式

xtrabackup的使用:

1、完全備份

# innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/

生成的是一個以目前日期命名的檔案夾。

如果要使用一個最小權限的使用者進行備份,則可基于如下指令建立此類使用者:

> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost' IDENTIFIED BY '123456';

> FLUSH PRIVILEGES;

使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複制所有關于表結構定義的相關檔案(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關檔案,同時還會備份觸發器和資料庫配置資訊相關的檔案。這些檔案會被儲存至一個以時間命名的目錄中。

在備份的同時,innobackupex還會在備份目錄中建立如下檔案:

(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀态(如是否已經為prepared狀态)和LSN(日志序列号)範圍資訊; 

每個InnoDB頁(通常為16k大小)都會包含一個日志序列号,即LSN。LSN是整個資料庫系統的系統版本号,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。

(2)xtrabackup_binlog_info:mysql伺服器目前正在使用的二進制日志檔案及至備份這一刻為止二進制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb:二進制日志檔案及用于InnoDB或XtraDB表的二進制日志檔案的目前position。

(4)xtrabackup_binary:備份中用到的xtrabackup的可執行檔案;

(5)backup-my.cnf:備份指令用到的配置選項資訊;

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

完全備份\恢複示例:

備份:

在node1上執行:

    # /etc/init.d/mysqld stop

    # innobackupex --user=root --password=xxxx --no-timestamp /backups/

    # scp -rp /backups/ root@node2:/tmp

恢複:

在node2上執行恢複:

    1、node2上停止mysql服務(如果啟動的話),并删除mysql的資料目錄下所有檔案: 

    # rm -fr /data/mysql/*

    2、在node2上執行整理操作:

    # innobackupex --apply-log /tmp/backups/

    3、在node2上執行恢複操作,并修改檔案屬主屬組:

    # innobackupex --copy-back /tmp/backups/

    # chown -R mysql.mysql /data/mysql/*

    4、在node2上啟動mariadb服務:

    # /etc/init.d/mysqld start

2、增量備份

每個InnoDB的頁面都會包含一個LSN資訊,每當相關的資料發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之後發生改變的頁面來實作。

要實作第一次增量備份,可以使用下面的指令進行:

# innobackupex --user=root --password=xxxx --incremental /backup --incremental-basedir=BASEDIR

其中,BASEDIR指的是完全備份所在的目錄,此指令執行結束後,innobackupex指令會在/backup目錄中建立一個新的以時間命名的目錄以存放所有的增量備份資料。另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。

注意: 增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執行增量備份時其實進行的是完全備份。

“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:

(1)需要在每個備份(包括完全和各個增量備份)上,将已經送出的事務進行“重放”。“重放”之後,所有的備份資料将合并到完全備份上。

(2)基于所有的備份将未送出的事務進行“復原”。

于是,操作就變成了:

# innobackupex --apply-log --redo-only BASE-DIR

接着執行:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

而後是第二個增量:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上的操作;

增量備份、恢複示例:

1、先做一個完全備份

# innobackupex --user=root /backups/  會在/backups/下生成一個以目前時間命名的檔案夾。如下圖:

2、對資料表執行些修改等操作

【資料表的修改操作略過】

3、執行增量備份

# innobackupex --incremental /backups/ --incremental-basedir=/backups/2015-11-08_19-24-05

說明:

有時候檢視增量備份的檔案中的xtrabackup_checkpoints發現其數值沒變化,可能是LSN變化太小了。執行大量的資料表修改等操作後,會發現其LSN是會變化的,有時候不變也是正常的。

1

2

3

4

5

6

<code>補充個腳本的方式執行全備份、增量備份:</code>

<code>全備份:</code>

<code>innobackupex --user=root --password=123456 </code><code>/backups/</code>  

<code>增量備份:</code>

<code>innobackupex --user=root --password=123456 --incremental </code><code>/backups/</code>  <code>--incremental-basedir=</code><code>/backups/</code><code>$(</code><code>ls</code> <code>-l </code><code>/backups</code><code>| </code><code>awk</code> <code>'{print $NF}'</code><code>|</code><code>tail</code> <code>-1)</code>

<code># 将上面的2個添加到cron計劃任務即可,備份的路徑是/backups/目錄下。</code>

4、合并備份檔案

# innobackupex --user=root --password=123456 --apply-log-only --redo-only /backups/2015-11-08_19-57-53/

# innobackupex --user=root --password=123456 --apply-log-only --redo-only /backups/2015-11-08_19-57-53/ --incremental-dir=/backups/2015-11-08_19-59-31/

# cat /backups/2015-11-08_19-57-53/xtrabackup_checkpoints # 檢驗是否合并成功

5、執行恢複資料到資料庫的操作

# innobackupex --user=root --password=123456 --copy-back /backups/2015-11-08_19-57-53/   【注意這裡填的應該是basedir的路徑】

# ls -lh /data/mysql/   檢視檔案是否恢複 

# chown -R mysql.mysql /data/mysql/  修改檔案權限 

6、啟動MySQL檢視是否資料已恢複

# /etc/init.d/mysqld start

本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/1794752,如需轉載請自行聯系原作者