[MySQL] innobackupex在線備份及恢復(全量和增量)
安裝
首先,通過wget下載源碼tar包:
[plain]
wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/source/percona-xtrabackup-2.1.5.tar.gz
安裝依賴包:
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel
解壓縮tar:
tar -zxvf percona-xtrabackup-2.1.5.tar.gz
cd percona-xtrabackup-2.1.5
utils/build.sh腳本會根據指定的引擎版本,自動解壓縮適當的MySQL源碼包並進行編譯,這是最簡單的安裝方式。當你在命令行下不帶任何參數執行該腳本時,出現如下提示:
[mysql@epay100 ~/software/percona-xtrabackup-2.1.5 ]$ ./utils/build.sh
Build an xtrabackup binary against the specified InnoDB flavor.
Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
innodb51 | plugin build against InnoDB plugin in MySQL 5.1
innodb55 | 5.5 build against InnoDB in MySQL 5.5
innodb56 | 5.6,xtradb56, build against InnoDB in MySQL 5.6
| mariadb100
xtradb51 | xtradb,mariadb51 build against Percona Server with XtraDB 5.1
| mariadb52,mariadb53
xtradb55 | galera55,mariadb55 build against Percona Server with XtraDB 5.5
根據上面提示和你使用的存儲引擎及版本,選擇相應的參數即可。因爲我用的是MySQL 5.6,所以執行如下語句安裝:
./utils/build.sh innodb56
以上語句執行成功後,表示安裝完成。最後,把生成的二進制文件拷貝到一個自定義目錄下(本例中爲/home/mysql/admin/bin/percona-xtrabackup-2.1.5),並把該目錄放到環境變量PATH中。
cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.5
cp ./src/xtrabackup_56 ./src/xbstream /home/mysql/admin/bin/percona-xtrabackup-2.1.5
全備及其恢復
全備:
執行如下語句進行全備:
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** /backup/mysql/data
該語句將拷貝數據文件(由my.cnf裏的變量datadir指定)至備份目錄下(/backup/mysql/data),注意:如果不指定--defaults-file,默認值爲/etc/my.cnf。
備份成功後,將在備份目錄下創建一個時間戳目錄(本例創建的目錄爲/backup/mysql/data/2013-10-29_09-05-25),在該目錄下存放備份文件。
恢復:
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --use-memory=4G --apply-log /backup/mysql/data/2013-10-29_09-05-25
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --copy-back /backup/mysql/data/2013-10-29_09-05-25
從什麼可以看出,恢復分爲兩個步驟,第1步是apply-log,爲了加快速度,一般建議設置--use-memory,這個步驟完成之後,目錄/backup/mysql/data/2013-10-29_09-05-25下的備份文件已經準備就緒。
第2步是copy-back,即把備份文件拷貝至原數據目錄下。
恢復完成之後,一定要記得檢查數據目錄的所有者和權限是否正確。
增量備份及其恢復
注意:innobackupex 增量備份僅針對InnoDB這類支持事務的引擎,對於MyISAM等引擎,則仍然是全備。
增量備份:
增量備份需要基於全備,先假設我們已經有了一個全備(/backup/mysql/data/2013-10-29_09-05-25),在該全表的基礎上做增量備份。
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql/data/2013-10-29_09-05-25 --incremental /backup/mysql/data
其中--incremental-basedir指向全備目錄,--incremental指向增量備份的目錄。
上面語句執行成功之後,會在--incremental執行的目錄下創建一個時間戳子目錄(本例中爲:/backup/mysql/data/2013-10-29_09-52-37),在該目錄下存放着增量備份的所有文件。
在備份目錄下,有一個文件xtrabackup_checkpoints記錄着備份信息,全備的信息如下:
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。
那麼,我們是否可以在增量備份的基礎上再做增量備份呢?答案是肯定的,只要把--incremental-basedir執行上一次增量備份的目錄即可,如下所示:
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=/backup/mysql/data/2013-10-29_09-52-37 --incremental /backup/mysql/data
它的xtrabackup_checkpoints記錄着備份信息如下:
backup_type = incremental
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
同樣地,拷貝結束之後,記得檢查下數據目錄的權限是否正確。
常見錯誤及解決方法
錯誤:
131028 17:45:57 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' (using password: NO).
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.5/innobackupex line 2913.
解決方法:
[plain]
yum -y install perl-DBD-MySQL.x86_64