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