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>$backupdir</code><code>/backtip</code><code>.log |</code><code>gzip</code> <code>>$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>$backupdir/backtip.log 備份日志,将備份過程中的輸出資訊重定向到log
|gzip >$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> create table t() engine=innodb; //此處需要DBA手動建立一個同結構的表或表已存在 mysql> ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql> 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,如需轉載請自行聯系原作者