Xtrabackup全備及增量備份數據庫

Xtrabackup
XtraBackup 是開源的熱備mysql的軟件,可以備份InnoDB, XtraDB, and MyISAM類型的

表,它是由如下三個工具組成的

1.innobackupex:有perl腳本封裝的,可以備份MyISAM, InnoDB, and XtraDB類型表,

推薦使用此工具
2.xtrabackup:由c語言編譯的,只copy表InnoDB和XtraDB的數據
3.xbstream:允許從streaming and extracting文件壓縮/抽取xbstream格式文件
 
innobackupex
innobackupex有更強的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量

備份/恢復,還可以基於時間的增量備份與恢復。
innobackupex備份原理
innobackupex首先調用xtrabackup來備份innodb數據文件,當xtrabackup完成後,

innobackupex就查看文件xtrabackup_suspended ;然後執行“FLUSH TABLES WITH READ

LOCK”來備份其他的文件
innobackupex恢復原理
innobackupex首先讀取my.cnf,查看變量

(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir

)對應的目錄是存在,確定相關目錄存在後,然後先copy myisam表和索引,然後在copy

innodb的表、索引和日誌

二進制版本
Xtrabackup下載地址:

http://www.percona.com/downloads/XtraBackup/LATEST/binary/
[root@clent soft]# cd xtrabackup/
[root@clent xtrabackup]# ls
bin  percona-xtrabackup-2.2-test
[root@clent xtrabackup]# cd bin/
[root@clent bin]# ls
innobackupex  xbcrypt  xbstream  xtrabackup
[root@clent bin]# cp * /usr/bin/
報錯1:
[root@clent bin]# innobackupex
Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5

/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl

/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at

/usr/bin/innobackupex line 23.
BEGIN failed--compilation aborted at /usr/bin/innobackupex line 23.
解決方法: yum -y install perl-Time-HiRes

報錯2:
[root@dbtest bin]# innobackupex --user=root --password=root --defaults-

file=/etc/my.cnf --socket=/tmp/mysql.sock  /home/backup_xtra

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

130608 10:22:29  innobackupex: Connecting to MySQL server with DSN

'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtra

backup;mysql_socket=/tmp/mysql.sock' as 'root'  (using password: YES).
ERROR: Failed to connect to MySQL server as DBD::mysql module is not

installed at /usr/bin/innobackupex line 1397.

解決方法:yum -y install perl-DBD-MySQL.x86_64

全備:
[root@clent data]# innobackupex --defaults-file=/data/mysql/my.cnf --user=root --password=xxxx  /tmp/test
執行完之後在最後輸出可以看到

innobackupex: Backup created in directory '/tmp/test/2014-06-20_16-15-52'
innobackupex: MySQL binlog position: filename 'mysql-bin.000004', position

664
140620 16:15:55  innobackupex: Connection to database server closed
140620 16:15:55  innobackupex: completed OK!
全備還原:
關閉數據庫服務
[root@clent data]#innobackupex --apply-log /tmp/mysql/2014-06-20_16-15-52
在創建全量備份後,備份文件是不能restore的,因爲這個初始創建的備份只是簡單的

copy過程,而innodb是事務引擎,所以還需要通過log文件replay committed的事務和回

滾uncommitted事務,這樣數據庫就達到一致的狀態,可以restore了

[root@clent data]#innobackupex --defaults-file=/data/mysql/my.cnf  --copy-

back /tmp/mysql/2014-06-20_16-15-52/
(全備恢復數據的時候數據庫原本的data目錄要清空,若是怕數據丟失可以拷貝data文

件夾作爲備份)
恢復數據之後修改data文件夾下數據庫的文件所有者chown -R mysql:mysql *
若是有mysql-bin.index文件刪除否則會造成mysql服務啓動不起來

增量備份:
[root@clent data]#innobackupex --defaults-

file=/data1/app/services/mysql55/my.cnf  --user=root --password=1q2w3e4r --incremental-basedir=/tmp/mysql/2014-06-20_16-15-52/ --incremental /tmp/mysql

[root@clent data]#innobackupex --defaults-file=/data/mysql/my.cnf --user=root --password=1q2w3e4r --incremental-basedir=/tmp/mysql/2014-06-20_16-15-52/ --incremental /tmp/mysql

其中--incremental-basedir指向全備目錄,--incremental指向增量備份的目錄。
上面語句執行成功之後,會在--incremental執行的目錄下創建一個時間戳子目錄(本例

中爲:/tmp/mysql/2014-06-20_16-22-37),在該目錄下存放着增量備份的所

有文件。
在備份目錄下,有一個文件xtrabackup_checkpoints記錄着備份信息,全備的信息如下


backup_type = incremental
from_lsn = 1602592
to_lsn = 1603468
last_lsn = 1603468
compact = 0

只要把--incremental-basedir執行上一次增量備份的目錄,就可以在增量備份的基礎上

再做增量備份

增量備份恢復:
增量備份的恢復比全備要複雜很多,第一步是在所有備份目錄下重做已提交的日誌:
[root@clent data]#innobackupex --apply-log --redo-only /tmp/mysql/2014-06-20_16-15-52/
[root@clent data]#innobackupex --apply-log --redo-only /tmp/mysql/2014-06-20_16-15-52 --incremental-dir=/tmp/mysql/2014-06-20_16-22-37
[root@clent data]#innobackupex --apply-log  /tmp/mysql/2014-06-20_16-15-52 --incremental-dir=/tmp/mysql/2014-06-20_16-25-37

例子:
[root@clent data]#innobackupex --apply-log --redo-only BASE-DIR 
[root@clent data]#innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 
[root@clent data]#innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 
其中BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,

INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。
這裏要注意的是:最後一步的增量備份並沒有--redo-only選項!還有,可以使用--

use_memory提高性能。
以上語句執行成功之後,最終數據在BASE-DIR(即全備目錄)下。
第二步,回滾未完成的日誌:
[root@clent data]#innobackupex --apply-log  /tmp/mysql/2014-06-20_16-15-52/
[root@clent data]#innobackupex --defaults-/data/mysql/my.cnf  --copy-back/tmp/mysql/2014-06-20_16-15-52/

innodbackupex --help (裏面還是有很多可以使用的參數,有興趣可以看一下)
--databases=LIST (選擇數據庫列表)

2.2版本官網document:http://www.percona.com/doc/percona-

xtrabackup/2.2/innobackupex/innobackupex_script.html
2.2版本官網installation:http://www.percona.com/doc/percona-

xtrabackup/2.2/installation/compiling_xtrabackup.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章