天天看點

xtrabackup(innobackupex)使用詳解

innobackupex實際上是percona-xtrabackup的perl整合腳本,功能當然更強大一些.

xtrabackup備份實際上是線上的實體熱備,為什麼這麼說呢,因為實際上他是以拷貝mysql實體檔案來備份的方式,隻是加入了一些鎖和鈎子來避免資料缺失,優勢當然就是快了,實體拷貝始終是速度最快的備份方式,缺點就是占用空間大.

備份原理很多文章有寫,重點在于備份初期會建立一個redo的鈎子,讓在備份期間産生的資料都能記錄下來,而備份資料檔案時也會鎖一下表,這樣資料就會更完整.

安裝方法在另一篇文章已經說了,就不多說了,下面直接介紹使用方法和一些參數說明.

xtrabackup支援全備和增備,但是我個人不建議用增備,因為增備效果不怎麼樣,而且直接拷貝binlog其實也挺好用,是以全備+binlog就可以了.

備份:

全備指令:

<code>#既然是熱備工具,當然是在mysql啟動的時候執行的</code>

<code>/etc/init</code><code>.d</code><code>/mysql</code> <code>status</code>

<code>#然後執行指令,直到完畢</code>

<code>/usr/bin/innobackupex</code> <code>--defaults-</code><code>file</code><code>=$cnfdir --user=root --password=$pwdr --host=$hosts --parallel=4 --throttle=400 --stream=</code><code>tar</code>  <code>$backupdir 2&gt;$backupdir</code><code>/backtip</code><code>.log |</code><code>gzip</code> <code>&gt;$backupdir/$backname.</code><code>tar</code><code>.gz</code>

完成備份後出現

innobackupex: completed OK!

就是完成了.

指令參數說明:

--defaults-file    備份資料庫的配置檔案my.cnf的路徑

--user=root    備份操作使用者名,一般都是root使用者,但可以改  

--password=$pwdr    備份操作使用者名的密碼

--host=$hosts    主機ip,本地可以不加,ssh傳輸,要開放端口

--parallel=4    并行個數,根據主機配置選擇合适的,預設是1個,多個可以加快備份速度。

--throttle=400    運作io限制數,一般來說并行能增加速度,但是IO也高,限制能減少影響

--stream=tar    壓縮類型,這裡選擇tar格式,好像也隻能是tar

$backupdir    備份存放的目錄

2&gt;$backupdir/backtip.log    備份日志,将備份過程中的輸出資訊重定向到log

|gzip &gt;$backupdir/$backname.tar.gz    備份檔案後用管道再壓縮,最後成為一個壓縮檔案,減少占用空間

還有一些常用參數:

--databases    指定備份的資料庫和某個庫的表,例如這樣:--databases="db db.table",不過要注意的是,他依然會把mysql庫備份一遍,因為有很多公共資訊還是依賴到他.

--no-lock    可以在備份非innodb表和frm檔案時不鎖表,但是master和slave的pos資訊就無法記錄,因為write_binlog_info和write_slave_info函數隻在mysql_lockall函數中調用,而mysql_lockal調用了flush tables with read lock (不适合生産環境)

--use-memory preparing    程序可以通過配置設定更多的記憶體來提高速度,這取決于系統的可用記憶體,預設值是100MB。總的來說配置設定的記憶體越多越好。

如果是從庫,還可以加從庫參數

--slave-info    備份目錄下會多生成一個xtrabackup_slave_info 檔案, 這裡會儲存主日志檔案以及偏移, 檔案内容類似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

恢複:

恢複第一步:應用日志。

<code>#恢複前,要把舊的資料全部删掉</code>

<code>#先關閉目前的mysql</code>

<code>/etc/init</code><code>.d</code><code>/mysql</code> <code>stop</code>

<code>#删除配置檔案指定的datadir的mysql資料目錄</code>

<code>rm</code> <code>-rf </code><code>/data/mysql/data/</code><code>*</code>

<code>#執行第一步指令</code>

<code>innobackupex --defaults-</code><code>file</code><code>=****</code><code>/my</code><code>.cnf --apply-log --use-memory=4G </code><code>/backup/</code><code>備份目錄</code>

看到

completed OK!

就可以進行下一步

恢複第二步:拷貝檔案。

<code>#拷貝前要确認my.cnf指定的datadir是否為空,不為空會報錯,剛才已經删除了</code>

<code>ll </code><code>/data/mysql/data/</code>

<code>#執行拷貝指令</code>

<code>innobackupex --defaults-</code><code>file</code><code>=****</code><code>/my</code><code>.cnf --copy-back </code><code>/backup/</code><code>備份目錄</code>

<code>#有些人喜歡把--apply-log的資料目錄直接拷貝到datadir的目錄,原則上是可以的,有興趣可以試試</code>

資料還原就完畢了

--defaults-file=/etc/my.cnf    使用my.cnf檔案,把需要恢複的檔案恢複到my.cnf指定的位置,必須寫在最前面,不然會報錯。

--apply-log    應用備份時産生的日志,為整體拷貝恢複做準備

--copy-back    把完整備份檔案拷貝到目标目錄,由--defaults-file指定的my.cnf決定

--use-memory=4G    為了加快恢複速度,設定可用記憶體參數,可以不用

--databases    指定還原的資料庫和某個庫的表

--export    在--apply-log時使用,為每個InnoDB表建立一個以.exp結尾的檔案,然後将你需要恢複的表的ibd和exp檔案複制到目标機器,在目标機器上執行導入:mysql&gt; create table t() engine=innodb; //此處需要DBA手動建立一個同結構的表或表已存在 mysql&gt; ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql&gt; ALTER TABLE t IMPORT TABLESPACE;相當于做了一次表空間傳輸,恢複了單表資料。

恢複第三步:修改檔案權限。

因為一般操作恢複使用的使用者是root,是以恢複回去後不會是mysql:mysql的權限,是以要改一下

<code>#進入到data目錄</code>

<code>cd</code> <code>/data/mysql</code>

<code>#更改權限</code>

<code>chown</code> <code>-R mysql.mysql data/</code>

<code>#最後啟動一下</code>

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>start</code>

<code>#啟動之後和之前備份的庫是一模一樣的,使用者也是</code>

增量備份的方法:

增量備份需要基于全備,先假設我們已經有了一個全備(/backup/mysql-data/2016-05-10_09),在該全表的基礎上做增量備份。

innobackupex --defaults-file=/****/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql-data/2016-05-10_09 --incremental /backup/mysql-data

其中

--incremental-basedir            指向全備目錄,

--incremental                         指向增量備份的目錄。

上面語句執行成功之後,會在--incremental執行的目錄下建立一個時間戳子目錄,在該目錄下存放着增量備份的所有檔案。在備份目錄下,有一個檔案xtrabackup_checkpoints記錄着備份資訊,全備的資訊如下:

[plain]

backup_type = full-backuped

from_lsn = 0

to_lsn = 563759005914

last_lsn = 563759005914

基于該全備的增量備份的資訊如下:

backup_type = incremental

from_lsn = 563759005914

to_lsn = 574765133284

last_lsn = 574765133284

從上面可以看出,增量備份的from_lsn正好等于全備的to_lsn。

而且還可以在增量備份的基礎上再做增量備份

innobackupex --defaults-file=/*****/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql-data/2016-05-10_09 --incremental /backup/mysql-data

它的xtrabackup_checkpoints記錄着備份資訊如下:

from_lsn = 574765133284

to_lsn = 574770200380

last_lsn = 574770200950

可以看到,該增量備份的from_lsn是從上一次增量備份的to_lsn開始的。

增量備份的恢複比全備要複雜很多,第一步是在所有備份目錄下重做已送出的日志

增量備份的恢複比全備要複雜很多,第一步是在所有備份目錄下重做已送出的日志,如:

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

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

innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。

這裡要注意的是:最後一步的增量備份并沒有--redo-only選項!還有,可以使用--use_memory提高性能。

以上語句執行成功之後,最終資料在BASE-DIR(即全備目錄)下。

第一步完成之後,我們開始第二步:復原未完成的日志:

innobackupex --apply-log BASE-DIR

上面執行完之後,BASE-DIR裡的備份檔案已完全準備就緒,最後一步是拷貝:

innobackupex --copy-back BASE-DIR

同樣地,拷貝結束之後,記得檢查下資料目錄的權限是否正确。

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